next up previous contents
Next: Fail Goal Now Up: Some Practical Problems Previous: Commit

Satisfy Once Only

Sometimes, we would like a way of stopping Prolog looking for other solutions. That is, we want some predicate to have only one solution (if it has one at all). This is the requirement that the predicate be determinate.

Naturally, predicates which do not have this property are indeterminate. This is a desirable property sometimes --- e.g. the generate --- test schema makes use of the generator being indeterminate. On the other hand, it can cause major problems when a program has many predicates which are unintentionally indeterminate. Our aim is to make sure that those predicates which should be determinate actually are determinate.

We have already met an example of a predicate ( memberchk/2) that might have been written with this situation in mind. We recall that member/2 used with mode member(-,+) behaves as a generator. Perhaps it is worth pointing out that member/2 with mode member(+,+) is also, under certain circumstances, resatisfiable ---precisely when there are repetitions of the sought element in the list which constitutes the second argument.

Of course, if we are dealing with lists--as--sets, we should have arranged it so that the second argument does not have repeated elements. Anyway, it is very desirable to have a determinate version of member/2 available.

 
memberchk(X,[XY]):-

make_determinate.

memberchk(X,[YZ]):-

memberchk(X,Z).

Note this isn't quite what we had before. Previously, we arranged for memberchk/2 to be determinate with the help of \+/1. Stating our requirement as above, we seem to be going outside of logic in order to tell the Prolog interpreter that, once we have found the element sought, we never want to consider this predicate as resatisfiable.



Paul Brna
Mon May 24 20:14:48 BST 1999