2015-12-21 70 views
2
woman(lisa). 
woman(maggie). 

parents(lisa , homer, marge). 
parents(maggie, homer, marge). 

sister(X, Y) :- 
    X \= Y, 
    woman(X), 
    parents(X, P, M), 
    parents(Y, P, M). 

当我跑了下面的查询,我没有想到失败(但得到它)。为什么这个prolog程序返回false?

?- sister(lisa, X). 
false.       % expected result: X = maggie 

为什么我看到这种行为?

+0

'(\ =)/ 2'不是纯逻辑关系。改为使用纯谓词'dif/2'。 '(\ =)/ 2'的问题简而言之:'? - X \ = Y,X = a,Y = b.'产生** false **,但是'X = a,Y = b,X \ = Y' **成功**。 – mat

回答

1

假设sister(X,Y)YX一个妹妹,你要woman(Y),不woman(X)

重新排列规则,使得它的工作(demo):

sister(X, Y):- 
    woman(Y), 
    parents(X, P, M), 
    parents(Y, P, M), 
    X \= Y. 

在这种重新安排重要的是,X \= Y项移动到一个点都XY后一直 - X作为输入被赋予规则,并且Y通过参与woman(Y)而被约束。

+0

@ManuelW。它不一定是最后一个,它可能是第二个(在[女性(Y)' - [demo](http://ideone.com/P8v8Lg))之后。重要的是,在不平等检查之前,'Y'必须*绑定*。 – dasblinkenlight