我做到了,但当我询问兄弟,姐妹,叔叔,阿姨时,它没有显示答案
这就是我写的,出了什么问题?
/*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不是自己的兄弟。
答案 0 :(得分:5)
如果你试图复制图表,看起来你的一些公理是错误的或遗漏的。
缺失:
female(jane).
father(john, bob).
错误:
father(john, sue).
这可能会导致兄弟规则发生冲突。但是我对prolog有什么了解
答案 1 :(得分:3)
您的兄弟规则已经验证brother(bob, bob)
会失败,因为它会调用sibling(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).
为:
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配色方案,如果有人有兴趣我可以在线发布。
答案 2 :(得分:1)
优化X兄弟的规则本身并不是兄弟。
你应该这样做:
brother(X, Y) :-
sibling(X, Y),
male(X),
not X=Y.
答案 3 :(得分:1)
你有一个强大的事实数据库和一个非常重要的谓词parent(X,Y)
。从逻辑上思考这种方法。
male(X)
或female(X)
必须在谓词中
b)X和Y具有相同的功能,但要小心使用mother
或father
功能,否则结果将显示两次。X/=Y
。 =)例:
brother(X,Y):- X/=Y, male(X), father(Father,X), father(Father,Y).
例:
aunt(X,Y):- female(X), parent(Parent,Y),sister(X,Parent).
married_couple
。的新事实
aunt(X,Y):- female(X),
parent(Parent,Y),
(sister(X,Parent); (brother(Parent,Uncle),married_couple(Uncle,X))).
希望这有效;)
答案 4 :(得分:1)
你的阿姨/ 2谓词不是放在一起,因此Prolog假定祖父母/ 2是阿姨/ 2。如下所示将它们放在一起或使用
:- discontiguous(aunt/2).
您使用配偶/ 2,但不定义它。此外,Prolog假设某处应该有兄弟/ 2谓词并使用father / 2。这样做是因为您在KB的底部定义了兄弟姐妹列表。再次,将它们放在一起如下。
如其他答案中所述,您可以不使用(X = Y)。
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).
答案 5 :(得分:0)
第一
将您的事实放在代码的开头上!
和兄弟:
equal(X,Y) :-
X=Y.
different(X,Y):-
not(equal(X,Y)).
brother(X, Y) :-
sibling(X, Y),
male(X),
different(X,Y).