# [mercury-users] Re: can one_solution/2 and unsorted_solutions/2 be det?

Bart Demoen bmd at cs.kuleuven.ac.be
Tue Oct 28 19:56:31 AEDT 1997

```(my code is Prolog rather than Mercury, because it doesn't matter)

Don and I seem in favour of a predicate like once/1 that could have
been implemented in Prolog as

once(Goal) :- Goal, !.

but doesn't need to be. I would be perfectly happy if its semantics
were rather like in

once(Goal) :-
findall(Goal,Goal,ListOfGoal),
random(N),
nth_element(N,ListOfGoal,Goal).

and at each invocation - even with the same goal - returns a different
solution. I would be happy with this semantics but not with its
implementation.

Now there is no garantee that for

a :- once(member(X,[1,2])), once(member(Y,[1,2])), X = Y.

?- a.

succeeds. It doesn't scare me a bit: I can already write it purely;
once/1 is just that kind of a predicate.

Another aspect of the once/1 I like, cannot be simulated in Mercury:

a(X) :- once(member(X,[1,2])) ; once(member(X,[1,2])).

also with the random definition of once/1, the query ?- a(X).
returns the same solution twice (modulo elimination of duplicate
solutions :-) because random/1 returns the same random number in
alternative branches.

I picked up once (sic) more the pruneslides.dvi that Lee recommended.
There is a striking sentence on page 18 with different uses of once/1:

compile(I,O) - you want any solution (this may affect
completeness if used other than at the top level)

One person's top level is another person's goal ...

In real life, I very often want any solution (of a restricted set
though) and fortunately it is mostly not at my top level.

Bart Demoen

```