Prolog家庭规则

时间:2018-10-18 17:07:30

标签: prolog

我有一些事实:

parent(bob, anne). % bob is a. parent of anne.
sibling(anne, mary).

我正在尝试从兄弟事实中获取父母,因此如果我查询parent(X, mary),则bob应该是输出。到目前为止,我的规则是:

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

parent(X,Z) :- 
    siblingOf(Z,Y),
    parent(X,Y).

它无限循环。我怀疑这是因为递归调用没有结束条件。我该怎么做才能使其正常工作?

1 个答案:

答案 0 :(得分:1)

您已经使用了相同的技巧:使用不同的名称来创建谓词,从而确保您在此处不会递归调用谓词:

parentOf(P, C) :-
    parent(P, C).
parentOf(P, C) :-
    siblingOf(C, S),
    parent(P, S).

因此,我们说X可以基于以下两个条件成为Y的父母:

  1. 我们定义了一个parent/2事实,因此明确地提到了父关系;或
  2. P是我们的孩子parent/2 sliblingOf/2的{​​{1}}。

然后我们获得:

C