SWI-Prolog中基于知识的家谱系统

时间:2015-10-17 09:13:31

标签: 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).

使用基本谓词malefemaleparent_of我要定义fathermotherson,{{1 },daughtersiblingspouse

这就是我所做的:

parent_of

通过查询father(P,C) :- male(P), parent_of(P,C). mother(P,C) :- female(P), parent_of(P,C). son(C,P) :- male(C), parent_of(P,C). daughter(C,P) :- female(C), parent_of(P,C). sibling(C,OC) :- parent_of(P,C), parent_of(P,OC). spouse(H,W) :- parent_of(H,C), parent_of(W,C). parent_of(P,C) :- ( ( sister(C,OC) ; sister(OC,C)) ; ( brother(C,OC) ; brother(OC,C))). ,它应该返回parent_of(P,C)warren的父级,而jerry,stuart and kather也是maryalice的父级。但这就是我得到的:

jerry, stuart and kather

没有任何意义!任何帮助深表感谢!

亲切的问候, 理查德

2 个答案:

答案 0 :(得分:0)

你混淆了事实和谓词,这基本上是可能的,但不是推荐的方法(至少在这种情况下)。

您写道,您希望将malefemaleparent_of定义为基本事实,但在上面的第一个源代码中,您还定义了sister和{{1} }。您可以通过规则轻松定义,例如&S; S是X的姐妹,当S是女性并且父C和X具有相同的父C并且不等于S"时。 无需按brotherparent_of重新定义sister

现在让我们看一下您的查询结果:

前两个结果是你定义的事实(warren和jerry,marryalice和jerry)。

下一个结果由您的谓词生成。由于您未指定有关变量brother的任何内容,因此它仍未绑定且未在结果中打印(因此仅显示P)。

谓词中的变量Y = ...满足您指定的四个条件之一(C是某人的姐妹(ann,kather),有人是C的姐妹( maryalice,jerry),C是某人的兄弟(两次杰里,彼得)或某人是C(斯图尔特,凯瑟,沃伦)的兄弟。

摘要:按规则替换Cbrother的定义,然后删除sister谓词。

答案 1 :(得分:0)

我完全赞同danielp的回答,但我希望能引起你对另一个问题的注意,这个问题可能已被忽视:为什么X只出现在前两个结果中?那是因为你的上一个谓词实际上是

parent_of(P,C) :- sister(C,OC).
parent_of(P,C) :- sister(OC,C).
parent_of(P,C) :- brother(C,OC).
parent_of(P,C) :- brother(OC,C).

和P永远不受这些规则的约束。所以,你是对的

  

没有任何意义!