- From: Sandro Hawke <sandro@w3.org>
- Date: Mon, 04 May 2009 19:00:59 -0400
- cc: public-rif-wg@w3.org
[replying to myself, with more thoughts on this...]
> Ah, here's an idea. Rather than specifying the semantics of the list
> operations in model theory math English, how about if we do it in RIF
> presentation syntax, for all the list operations which are essentially
> syntactic sugar. (That is, everything other than get(L, 0) and
> sublist(L, 1), which are car and cdr, respectively.) That would also
> give people a model to work from, if they wanted to parameterize
> equality.
For example, I think the hardest one is index_of. Here's a (working)
implementation of index_of in a subset of Prolog that I believe
corresponds to RIF Core. It would read better in RIF Core syntax
because RIF Core has external functions, and in Prolog I had to use
predicates for first, rest, and numeric-add. (Although for the
implement-them-yourself builtins, RIF Core users would have to use
predicates, too.)
-- Sandro
================================================================
index_of(L, I, X) :-
index_helper(L, I, X, 0).
index_helper(L, I, [Offset|T], Offset) :-
first(L, I),
O2 is 1 + Offset,
rest(L, R),
index_helper(R, I, T, O2).
index_helper(L, I, T, Offset) :-
first(L, X),
literal_not_identical(I, X),
O2 is 1 + Offset,
rest(L, R),
index_helper(R, I, T, O2).
index_helper([], _, [], _).
% helper stuff.
first([X|_],X).
rest([_|T],T).
literal_not_identical(X, Y) :-
number(X),
number(Y),
X \= Y.
% other literals go here....
literal_not_identical(_, _) :-
fail.
================================================================
?- index_of([], 3, X).
X = [].
?- index_of([3], 3, X).
X = [0]
?- index_of([3,3,3], 3, X).
X = [0, 1, 2]
?- index_of([0,0,3,3,3,0,3], 3, X).
X = [2, 3, 4, 6]
?- index_of([0,0,3,xxxx,3,3,0,3], 3, X).
fail.
The "fail" at the end is because prolog is making a NAF assumption on
index_helper; in RIF BLD, it's like 1+foo:bar -- you can't evaluate it
until/unless foo:bar is equated to a literal. In RIF Core, ... when
that equating isn't possible, I guess it's safe the throw an error at
that point.
-- Sandro
Received on Monday, 4 May 2009 23:01:08 UTC