2010-10-03 128 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算法;但隨後,在很多情況下,你不能這樣做。)