Prolog家谱
我这样做了,但当我问起兄弟姐妹、叔叔婶婶时,却没有给出答案 这是我写的,怎么了Prolog家谱,prolog,Prolog,我这样做了,但当我问起兄弟姐妹、叔叔婶婶时,却没有给出答案 这是我写的,怎么了 /*uncle(X, Y) :– male(X), sibling(X, Z), parent(Z, Y).*/ /*uncle(X, Y) :– male(X), spouse(X, W), sibling(W, Z), parent(Z, Y).*/ uncle(X,Y) :- parent(Z,Y), brother(X,Z). aunt(X,Y) :- parent(Z,Y), sister(X
/*uncle(X, Y) :– male(X), sibling(X, Z), parent(Z, Y).*/
/*uncle(X, Y) :– male(X), spouse(X, W), sibling(W, Z), parent(Z, Y).*/
uncle(X,Y) :-
parent(Z,Y), brother(X,Z).
aunt(X,Y) :-
parent(Z,Y), sister(X,Z).
sibling(X, Y) :-
parent(Z, X),
parent(Z, Y),
X \= Y.
sister(X, Y) :-
sibling(X, Y),
female(X).
brother(X, Y) :-
sibling(X, Y),
male(X).
parent(Z,Y) :- father(Z,Y).
parent(Z,Y) :- mother(Z,Y).
grandparent(C,D) :- parent(C,E), parent(E,D).
aunt(X, Y) :– female(X), sibling(X, Z), parent(Z, Y).
aunt(X, Y) :– female(X), spouse(X, W), sibling(W, Z), parent(Z, Y).
male(john).
male(bob).
male(bill).
male(ron).
male(jeff).
female(mary).
female(sue).
female(nancy).
mother(mary, sue).
mother(mary, bill).
mother(sue, nancy).
mother(sue, jeff).
mother(jane, ron).
father(john, sue).
father(john, bill).
father(bob, nancy).
father(bob, jeff).
father(bill, ron).
sibling(bob,bill).
sibling(sue,bill).
sibling(nancy,jeff).
sibling(nancy,ron).
sibling(jell,ron).
还有一件事,我如何优化兄弟规则,使X不是它自己的兄弟。如果您试图复制图表,您的一些公理似乎是错误的或缺失的 缺失:
female(jane).
father(john, bob).
错:
father(john, sue).
这可能会导致兄弟规则冲突。但是我对prolog了解多少呢?您的兄弟规则已经验证了
兄弟(bob,bob)
将失败,因为它调用了兄弟(X,Y)
,这将进行检查以确保X\=Y
已经存在
此外,我的机器似乎一切正常,但我不得不更改这些行上的破折号:
aunt(X, Y) :– female(X), sibling(X, Z), parent(Z, Y).
aunt(X, Y) :– female(X), spouse(X, W), sibling(W, Z), parent(Z, Y).
致:
是的,它们看起来一模一样,但是上面版本中的破折号稍长一些。。。当我“查阅”文件时,似乎引起了问题
我之所以发现这一点,是因为我为Notepad++创建了一个Prolog配色方案,如果有人感兴趣,我可以将其发布到网上。优化brother for X的规则不是brother to自身 你应该做:
brother(X, Y) :-
sibling(X, Y),
male(X),
not X=Y.
您有一个强大的事实数据库和一个非常重要的谓词,称为
parent(X,Y)
。对方法进行逻辑思考
- 谁是兄弟/姐妹:
a) 因此,男性/女性
或男性(X)
必须位于谓词内部女性(X)
b) X和Y具有相同的值,但请小心使用
或母函数
函数,否则结果将显示两次。父函数
注意:确保
)李>X/=Y
兄弟(X,Y):-X/=Y,男性(X),父亲(父亲,X),父亲(父亲,Y)。
- 谁是叔叔/婶婶(有点棘手,但不是很多):
a) 是男性/女性。
b) 阿姨/叔叔是兄弟姐妹的妈妈或爸爸的妹妹/兄弟
姑妈(X,Y):-女性(X),父母(Y),姐妹(X,父母)。
附言:姑姑也可以被认为是兄弟姐妹的妈妈或爸爸的兄弟(叔叔的妻子)的妻子。但是在这种情况下,你需要引入一个新的事实来表达一对已婚夫妇
姑妈(X,Y):-女性(X),父项(父项,Y),
(姐妹(X,父母);(兄弟(父母,叔叔),已婚夫妇(叔叔,X))。
希望这能奏效;) 您的阿姨/2谓词没有放在一起,因此Prolog假定祖父母/2是阿姨/2。如下图所示将它们放在一起或使用
:- discontiguous(aunt/2).
您使用配偶/2,但不定义它。此外,Prolog假设某个地方应该有一个兄弟/2谓词,并使用父/2。之所以这样做,是因为您在知识库的底部定义了同级列表。同样,将它们放在一起,如下所示
如其他答案中所述,您可以使用not(X=Y)
第一:
将事实放在代码的开头
对兄弟来说:
equal(X,Y) :-
X=Y.
different(X,Y):-
not(equal(X,Y)).
brother(X, Y) :-
sibling(X, Y),
male(X),
different(X,Y).
较长的破折号可能是由某个智能字处理器创建的em或en破折号。是啊,我猜它是从其他地方复制粘贴的,而不是其他地方写的:)
parent(Z,Y) :- father(Z,Y) ; mother(Z,Y).
sibling(bob,bill).
sibling(sue,bill).
sibling(nancy,jeff).
sibling(nancy,ron).
sibling(jell,ron).
sibling(X,Y) :-
parent(A,X),
parent(A,Y),
not(X = Y).
sister(X, Y) :-
sibling(X, Y),
female(X),
not(X = Y).
brother(X, Y) :-
sibling(X, Y),
male(X),
not(X = Y).
grandparent(C,D) :- parent(C,E), parent(E,D).
aunt(X,Y) :-
parent(Z,Y), sister(X,Z).
aunt(X, Y) :- female(X), sibling(X, Z), parent(Z, Y).
% aunt(X, Y) :- female(X), spouse(X, W), sibling(W, Z), parent(Z, Y).
uncle(X,Y) :-
parent(Z,Y), brother(X,Z).
male(john).
male(bob).
male(bill).
male(ron).
male(jeff).
female(mary).
female(sue).
female(nancy).
female(jane).
mother(mary, sue).
mother(mary, bill).
mother(sue, nancy).
mother(sue, jeff).
mother(jane, ron).
father(john, sue).
father(john, bill).
father(bob, nancy).
father(bob, jeff).
father(bill, ron).
equal(X,Y) :-
X=Y.
different(X,Y):-
not(equal(X,Y)).
brother(X, Y) :-
sibling(X, Y),
male(X),
different(X,Y).