[mercury-users] New to mercury: structure reuse and efficiency
Peter Schachte
schachte at cs.mu.OZ.AU
Thu Jul 1 11:36:43 AEST 2004
Gregory D. Weber wrote:
>There's an implied question here which I don't think has been answered:
>how _does_ he do what he wants to do here, which, I believe, is to
>make sure that H does not equal T before making the recursive call?
>
> > member([H|T], H).
> >
> > member([H|T], X) :- not(X=H), member(T, X).
>
>
I think the best answer to your question is: you don't, the compiler
does it for you. This definition does what he wants:
member([H|T], H).
member([_|T], X) :- member(T, X).
In fact, it's better than what he's asking for, because the compiler
does it in a more flexible way than you could do it yourself. The
compiler is smart enough to notice a call member(L, X) where L and X
are both sure to be ground, and it forces the call to be deterministic
for you, so you don't try to see if the element is in the tail of the
list when you've already seen that it matches the head. However, when X
is unbound, then it will match every element of the list, so you don't
want to commit yourself to the first match. Consider this predicate to
determine whether two lists have any elements in common:
overlap(L1, L2) :- member(L1, X), member(L2, X).
Here the first call to member will have X unbound and the second will
have it bound, so the first must not commit to the first match (because
it may not be the first elment of L1 that appears on L2), but the second
one can (because we don't care how many times an element of L1 appears
on L2). But further, once we find an element in common, we can commit
to that, because we don't care which elements are in common, just that
at least one is. The Mercury compiler will do all that for you without
you having to say anything.
--
Peter Schachte 640K should be enough for anyone!
schachte at cs.mu.OZ.AU -- Bill Gates, 1981
www.cs.mu.oz.au/~schachte/
Phone: +61 3 8344 1338
--------------------------------------------------------------------------
mercury-users mailing list
post: mercury-users at cs.mu.oz.au
administrative address: owner-mercury-users at cs.mu.oz.au
unsubscribe: Address: mercury-users-request at cs.mu.oz.au Message: unsubscribe
subscribe: Address: mercury-users-request at cs.mu.oz.au Message: subscribe
--------------------------------------------------------------------------
More information about the users
mailing list