2014-04-07 29 views
1

假定你有以下事实:Prolog的回溯和执行等语句太

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). 

是否有任何理由为什么目标sibling(susan, jane)给人以真,那么假。是否使用了两个定义?

有没有办法只检查所有的定义为true,并输出true,如果是的话?

+1

当我用你的代码尝试“姐姐(苏珊,简)”。我只是得到“真实”。你的意思是“兄弟姐妹”(苏珊,简)。如果是这样,那将产生“真实”,但是有一个选择点来检查更多的解决方案。如果您按“'查看更多”,则会返回“false”,因为没有更多解决方案。 – lurker

+0

对不起,我有一个错字。它应该是兄弟姐妹(苏珊,简)。我了解回溯,但有什么办法来防止它? – kype

+1

你可以添加一个剪辑:'同胞(X,Y): - 姐姐(X,Y),!“这就表示如果'X'和'Y'是姐妹,那么他们是兄弟姐妹,你不想在'X'和'Y'之间寻找更多的兄弟姐妹。但这可能会在其他情况下消除您想要的解决方案。为什么你想摆脱回溯?这是Prolog如何工作的正常部分。 – lurker

回答

0

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). 

在这种情况下,该条款的妹妹会这样评价:

  • 绑定玛丽X
  • 绑定标记为Y
  • 的哥哥
  • 检查知识库( mary)
  • 如果发现此情况,则返回true
  • 绑定至X
  • 绑定标记为Y
  • 的弟弟(标记,贝斯)
  • 回报,如果这是真的
  • 检查知识库中找到
  • 没有其他绑定存在,所以返回false

在Prolog所有的可能性都试过。它会返回所有的真实案例,直到它找不到一个,然后它会自动返回false(即Nothing不能满足这个)。这是与prolog的力量和混乱。