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