11

我做到了,但没有显示答案当我问起兄弟姐妹,叔叔阿姨时

这是我写的,有什么问题吗?

/*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 不是自己的兄弟。

4

6 回答 6

7

如果您尝试复制图表,您的某些公理似乎是错误的或缺失的。

失踪:

female(jane).

father(john, bob).

错误的:

father(john, sue).

这可能会导致兄弟规则发生冲突。但是我对prolog了解多少

于 2009-03-25T00:14:03.070 回答
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 配色方案,如果有人感兴趣,我可以在线发布。

于 2009-03-25T00:15:08.357 回答
1

为 X 优化兄弟的规则并不是自己的兄弟。

你应该做:

brother(X, Y) :-
      sibling(X, Y),
      male(X),
      not X=Y.
于 2009-04-20T20:52:10.333 回答
1

您有一个强大的事实数据库和一个非常重要的谓词,称为parent(X,Y). 从逻辑上思考这种方法。

  • 谁是兄弟姐妹:
    a) 男性/女性,因此male(X)orfemale(X)必须在谓词内
    b) X 和 Y 具有相同的含义,但要小心使用motherorfather函数,否则结果将显示两次。
    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:阿姨也可以算是兄弟的爸爸妈妈(叔叔的妻子)的兄弟的妻子。但在这种情况下,您需要引入一个新的事实来表达 a married_couple

aunt(X,Y):- female(X),
parent(Parent,Y),
(sister(X,Parent); (brother(Parent,Uncle),married_couple(Uncle,X))).

希望这有效;)

于 2013-10-11T07:39:32.743 回答
1

你的 aunt/2 谓词没有放在一起,因此 Prolog 假设 grandparent/2 是 aunt/2。像下面这样将它们放在一起或使用

:- discontiguous(aunt/2).

您使用配偶/2,但不定义它。此外,Prolog 假设某处应该有一个兄弟/2 谓词并使用父亲/2。这样做是因为您在 KB 的底部定义了兄弟姐妹列表。再次,将它们放在一起,如下所示。

就像其他答案中所述,您可以使用 not(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).
于 2016-05-10T16:33:59.133 回答
0

第一的:

将您的事实放在代码的开头

对于兄弟:

equal(X,Y) :-
   X=Y.

different(X,Y):-
   not(equal(X,Y)).

brother(X, Y) :-
  sibling(X, Y),
  male(X),
  different(X,Y).
于 2017-06-05T12:41:12.020 回答