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).