我有这些家庭事实:
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).
使用基本谓词male
,female
和parent_of
我要定义father
,mother
,son
,{{1 },daughter
,sibling
和spouse
。
这就是我所做的:
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
没有任何意义!任何帮助深表感谢!
亲切的问候, 理查德
答案 0 :(得分:0)
你混淆了事实和谓词,这基本上是可能的,但不是推荐的方法(至少在这种情况下)。
您写道,您希望将male
,female
和parent_of
定义为基本事实,但在上面的第一个源代码中,您还定义了sister
和{{1} }。您可以通过规则轻松定义,例如&S; S是X的姐妹,当S是女性并且父C和X具有相同的父C并且不等于S"时。
无需按brother
和parent_of
重新定义sister
。
现在让我们看一下您的查询结果:
前两个结果是你定义的事实(warren和jerry,marryalice和jerry)。
下一个结果由您的谓词生成。由于您未指定有关变量brother
的任何内容,因此它仍未绑定且未在结果中打印(因此仅显示P
)。
谓词中的变量Y = ...
满足您指定的四个条件之一(C
是某人的姐妹(ann,kather),有人是C
的姐妹( maryalice,jerry),C
是某人的兄弟(两次杰里,彼得)或某人是C
(斯图尔特,凯瑟,沃伦)的兄弟。
摘要:按规则替换C
和brother
的定义,然后删除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永远不受这些规则的约束。所以,你是对的
没有任何意义!