Prolog家谱

时间:2009-03-24 23:51:48

标签: 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,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不是自己的兄弟。

6 个答案:

答案 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)。从逻辑上思考这种方法。

  • 谁是兄弟/姐妹:
    a)男性/女性,因此male(X)female(X)必须在谓词中 b)X和Y具有相同的功能,但要小心使用motherfather功能,否则结果将显示两次。
    PS:确保X/=Y。 =)

例:
    brother(X,Y):- X/=Y, male(X), father(Father,X), father(Father,Y).

  • 谁是叔叔/阿姨(有点棘手,但不是很多):
    a)是男/女 b)阿姨/叔叔是兄弟姐妹的妈妈或爸爸的姐妹/兄弟。

例:
aunt(X,Y):- female(X), parent(Parent,Y),sister(X,Parent).

PS:姨妈也可能被认为是兄弟姐妹的兄弟(叔叔的妻子)的妻子。但在这种情况下,您需要引入一个表达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).