2010-10-03 125 views
8

我有一个问题,试图获得一些代码,它返回我的查询的唯一答案。例如,定义重复解决方案

stuff(A,B,C) :- A=C ; B=C. 
morestuff([],[],[]). 
morestuff([A|AA],[B|BB],[C|CC]) :- stuff(A,B,C), morestuff(AA,BB,CC). 

然后运行

morestuff([A,A],[A,B],[a,b]). 

给出了输出:

A = a 
B = b ? ; 

A = a 
B = b ? ; 

yes. 

正如你可以看到两种解决方案是相同的。有没有一种方法可以让PROLOG回归独特的解决方案,即我。给输出:

A = a 
B = b ? ; 

yes. 
+0

+1的序言问题。我在这里看不到他们太多。 – 2010-10-03 15:57:39

+2

此问题已在http://stackoverflow.com/questions/724358/中讨论过 – Kaarel 2010-10-03 16:50:14

回答

2

您还可以使用

| ?- setof(sol(A,B),morestuff([A,A],[A,B],[a,b]),L). 
L = [sol(a,b)] ? 
yes 
1

,我知道是用findall/3生成所有结果,然后自己去除重复的唯一途径。 (除非是最明显的解决方案 - 避免overgenerate算法;但随后,在很多情况下,你不能这样做。)