Prolog也会回溯并执行其他语句

Prolog也会回溯并执行其他语句,prolog,logic,predicate,Prolog,Logic,Predicate,假设你有以下事实: sister(susan, jane). sister(karren,holtby). parent_of(susan,karren). parent_of(susan,holtby). 以及以下定义: sibling(X, Y) :- sister(X, Y). sibling(X, Y) :- parent_of(Z, X), parent_of(Z, Y). 有没有任何理由可以解释为什么苏珊,简给出了一个正确的答案,然后又给出了一个错误的答

假设你有以下事实:

sister(susan, jane).
sister(karren,holtby).
parent_of(susan,karren).
parent_of(susan,holtby).
以及以下定义:

sibling(X, Y) :-
      sister(X, Y).

sibling(X, Y) :-
      parent_of(Z, X), parent_of(Z, Y).
有没有任何理由可以解释为什么苏珊,简给出了一个正确的答案,然后又给出了一个错误的答案。这两个定义都使用了吗


有没有办法只检查所有定义的true only,如果有,则输出true?

Prolog是一种基于树的语言。让我们建立一个知识库

male(mark).
female(mary).
female(beth).
brother(mark, mary). %mark is the brother of mary
brother(mark, beth).

%define sister
sister(X,Y) :-
  female(X),
  male(Y),
  brother(Y,X).
在这种情况下,条款sister将被评估为:

把玛丽绑在X上 将标记绑定到Y 检查知识库中的兄弟标记,玛丽 如果找到,则返回true 把贝丝绑到X上 将标记绑定到Y 贝丝,查一下兄弟马克的知识库 如果找到,则返回true 不存在其他绑定,因此返回false
在Prolog中,尝试了所有的可能性。它将返回所有正确的案例,直到它找不到一个,然后它将自动返回false,即没有任何东西可以满足这一点。这就是prolog的力量和困惑。

当我尝试sistersusan时,jane。有了你的代码,我就明白了。你是说苏珊,简。?如果是这样的话,这将产生真实的结果,但是还有一个选择点来检查更多的解决方案。如果你说,按查看更多信息;然后它返回为false,因为没有更多的解决方案。是的,对不起,我在那里输入了一个错误。应该是兄弟姐妹苏珊,简。我理解回溯,但有什么方法可以防止它吗?你可以添加一个剪切:siblingX,Y:-sisterX,Y!。也就是说,如果X和Y是姐妹,那么他们就是兄弟姐妹,你不想在X和Y之间寻找更多的兄弟姐妹。但这可能会消除你在其他情况下想要的解决方案。你为什么要摆脱这种倒退?这是Prolog正常工作的一部分,只是让输出看起来更整洁。感谢您的解决方案现在可以完美地工作。您只需小心,不要为其他查询牺牲有效的解决方案,以便为该查询获得更整洁的输出: