Prolog使用兄弟和姐妹规则的父母关系

时间:2013-03-30 04:02:28

标签: prolog

这是我第一次使用Prolog,我想知道是否有人可以就我的逻辑给出一些建议:

male(jerry).
male(stuart).
male(warren).
male(peter).
female(kather).
female(maryalice).
female(ann).
brother(jerry,stuart).
brother(jerry,kather).
brother(peter, warren).
sister(ann, maryalice).
sister(kather,jerry).
parent_of(warren,jerry).
parent_of(maryalice,jerry).

这是家庭作业的一部分,我们只允许使用上述事实。为了知道warren和mary alice也是stuart和kather的父母,需要实施一些规则。我所做的是:

parent_of(X,Y) :- brother(Z,Y), parent_of(X,Z).
parent_of(X,Y) :- brother(Y,Z), parent_of(X,Z).
parent_of(X,Y) :- sister(Z,Y), parent_of(X,Z).
parent_of(X,Y) :- sister(Y,Z), parent_of(X,Z).

使用上述规则和事实在prolog中查询parent_of(X,Y)使我处于无限循环,递归值为X = warren,Y = stuart和X = maryalice,Y = stuart。

任何建议都将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

如果您从交互式提示中尝试了查询,则会发现它有效。我可能会把它重写为:

?- parent_of(P,C),
   ( ( sister(C,OC) ; sister(OC,C) )
   ; ( brother(C,OC) ; brother(OC,C) )
   ).

但这无所谓。

定义具有确切定义的谓词作为此查询的最简单的解决方案不是将其称为parent_of,因为您正在引入一个不以任何方式终止的递归调用。所以可以称之为also_parent_of

此外,您的数据库中存在冗余事实:brother(jerry,kather)sister(kather,jerry)。我不知道这是否有意,但使用此查询,您将得到答案P=warren, C=jerry, OC=kather两次。