Prolog函数返回重复

时间:2016-11-29 01:19:38

标签: prolog

我正在尝试学习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 个答案:

答案 0 :(得分: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。)

答案 1 :(得分:0)

如果商标有父母作为父母,则可以复制商标的原因。

会进行重复呼叫,例如

parent(john,daniel) -> parent(john,mark)

然后

parent(mary,daniel) -> parent(mary,mark)