Is there a easy way to make a query in prolog only return each result once?
for instance I'm trying something like:
deadly(Xn) :- scary(X), Xn is X - 1, Xp is X + 1, not(safe(Xn)), safe(Xp).
deadly(Xp) :- scary(X), Xn is X - 1, Xp is X + 1, not(safe(Xp)), safe(Xn).
deadly(X).
and getting
X = 5
X = 5
X = 5
X = 5
....
Not to usefull for me.
If I remember correctly there is a predicate solutions (or similar, it's been a while since I programmed Prolog) which collects unique solutions in a list.
Edit:
setof/3
is the one I was thinking of. Thanks, Kaarel.Another approach is to memoize solutions.
In case your Prolog supports tabling, then it gets even simpler. Example file:
Example execution with XSB:
It's hard to say without more of your code, but you're probably looking for the cut operator (
!
). If you want to post the definition offoo
, I (or someone else who follows) may be able to give a detailed/specific answer.One thing that you can do is to apply
setof/3
to the predicate that generates the solutions. But note thatsetof/3
is implemented by applyingsort/2
to the result delivered bybagof/3
(at least this is the case in SWI-Prolog). So, if your solution generator goes on forever, thensetof/3
will never be applied...So I would say that try to program so that duplicates are not generated, i.e. by using the cut (!) where it makes sense.