2013-04-16 53 views
2

我是新來的Prolog和我有點難以理解一些機制實際工作。現在我正在努力解決一個特定的問題。對序言,列表和對新來說

我需要從單個列表中找到所有可能的對,所以我試圖定義規則select_pairs(X,Y,_,Z)。

下面是我期望看到,當我運行給定的查詢。

查詢:select_pairs(X,Y,[1,2,3],Z)。返回以下內容:

X = 1, Y = 2, Zs = [3] ; 
X = 1, Y = 3, Zs = [2] ; 
X = 2, Y = 1, Zs = [3] ; 
X = 2, Y = 3, Zs = [1] ; 
X = 3, Y = 1, Zs = [2] ; 
X = 3, Y = 2, Zs = [3] 

AND查詢select_pairs(1,2,Xs,[3])。返回以下內容:

Xs = [1, 2, 3] ; 
Xs = [2, 1, 3] ; 
Xs = [1, 3, 2] ; 
Xs = [2, 3, 1] ; 
Xs = [3, 1, 2] ; 
Xs = [3, 2, 1] ; 

到目前爲止,我只能從第一個查詢中得到第一個結果而不顯示任何內容。我接近這個的最好方法是什麼?謝謝!

+0

我不清楚:有_you_定義了謂詞'select_pairs/4'?它是如何定義的?您正在顯示的商品是您在屏幕上看到的內容還是您期望看到的內容? – 2013-04-16 05:14:30

+0

對不起,我應該澄清...我需要定義select_pairs。我有一個部分定義,但它只返回我期望得到的一小部分。 以上兩個清單都顯示了我期望在正常運行時看到的內容。 –

回答

2

你的Prolog都應該有select/3,內置的是在做到底發生了由它的名字建議:

?- select(X,[1,2,3],R). 
X = 1, 
R = [2, 3] ; 
X = 2, 
R = [1, 3] ; 
X = 3, 
R = [1, 2] ; 
false. 

它也可以「倒退」

?- select(1,R,[2,3]). 
R = [1, 2, 3] ; 
R = [2, 1, 3] ; 
R = [2, 3, 1] ; 
false. 

然後,爲了得到一個工作select_pairs/4,你可以結合2 select/3。

+0

好的,謝謝,但它仍然不打印所有可能的對。我只得到一個實例。任何想法,爲什麼這可能是? 因此,不要說: R = [1,2,3]; R = [2,1,3]; R = [2,3,1]; 我只得到 R = [1,2,3];背部。 –

+0

您是否使用2 select?寫下了select_pairs?如果要顯示所有解決方案,請使用forall/2 – CapelliC

+0

是的,我使用了2選擇。我不確定我是否理解所有謂詞的工作原理。 –