2016-11-29 66 views
0

我努力學習序言和我工作的一個問題,我有兩個功能:Prolog的函數返回重複

findSiblings(X,L):-sibling(X,L). 
sibling(X,Y):-parent(Z,X),parent(Z,Y). 

其中X和Y的名字,L是返回值。我想爲findSiblings函數返回X的兄弟姐妹的名字,並且它的確如此。但是,名稱會打印兩次,因爲它與父母都匹配。我不能更改sibling函數,因爲它取決於一個家族樹,其中唯一的關係是parent(joe,bob)。關於如何解決這個問題的任何想法?

爲了澄清,說丹尼爾和馬克是兄弟。

findSiblings(daniel,L). 

回報

Mark; 
Mark 
+2

你應該提供[mcve]。我們應該能夠運行你的代碼並看到你得到的結果。 – Enigmativity

回答

0

對於給定的代碼,下面可以幫助(注意X \= Y):

parent(john, daniel). 
parent(john, mark). 

findSiblings(X,L) :- sibling(X,L). 
sibling(X,Y) :- parent(Z,X), parent(Z,Y). 

findSiblings2(X,L) :- sibling2(X,L). 
sibling2(X,Y) :- parent(Z,X), parent(Z,Y), X \= Y. 

(嘗試在網上IDE:http://swish.swi-prolog.org/p/Siblings.pl