2011-01-13 94 views
0

使用SWI-Prolog。我有隊伍的名單說:在比較序言中的事實時得到重複的答案

rank(London, 3.5). 
rank(New York, 3.5). 
rank(Seattle, 2.3). 

,我試圖讓我的頭周圍做一個規則,打印/返回與同級別的任何事實。所以在這種情況下,它會回來倫敦&紐約。

以下是我到目前爲止所提出的問題,唯一的問題是我用它得到的重複項(儘管它們與當前規則完全相符)。以某種方式使用遞歸會有幫助嗎?

equal_rank(_):- 
    rank(U1, R1), 
    rank(U2, R2), 
    U1 \== U2, 
    R1 == R2, 
    print(R1), print(': '), print(U1), print(', '), print(U2), nl, 
    fail. 

輸出將是:

3.5: London, New York 
3.5: New York, London 

我只是無法弄清楚如何停止第二行。

+2

對很多不方便的「打印/ 1」調用的小小評論:考慮使用格式/ 2:format(「〜w:〜w,〜w \ n」,[R1,U1,U2]相同的結果,並且更容易閱讀和寫入。 – mat 2011-01-13 23:06:10

回答

1

一種簡單的方法將是一個小於測試,以取代U1和U2之間的不等於測試:

U1 @< U2. 

這種方式一個給定的一對只出現一次。

+0

工作過,沒有更多的雙重結果。謝謝。 – 2011-01-14 12:36:07

1

我可能會去做一些使用bagof/3的東西,但我不知道這是否是您所面臨問題的首選或更合適的方法。隨着您定義的事實,下面的目標似乎發給你想要的結果:

| ?- bagof(C, rank(C, X), Cs), length(Cs, L), L > 1. 

Cs = [london,'new york'] 
L = 2 
X = 3.5 

yes 

它需要當然在格式化一些工作;在列表中收集結果的想法對您而言可能有用,也可能沒有用處。哦,順便說一句,我不確定城市名稱需要變量,所以你可以看到我已經斷言使用普通原子的事實rank/2

欲瞭解bagof/3的更多信息,請參閱online SWI-Prolog manual page

+0

雖然我確信這會起作用,但它比我試圖避免的其他答案增加了更多的複雜性。不管怎麼說,還是要謝謝你。 – 2011-01-14 12:36:52

相關問題