4

谁能告诉我为什么我的姑姑关系不起作用?每当我尝试调用它时,它都会返回 false。

我在它下面写的叔叔关系似乎工作得很好。我不知道有什么区别。我最后也试过 (not(mother(X,Y)). 但这并没有改变任何东西。

/* FACTS */
parents(david, george, noreen).
parents(jennifer, george, noreen).
parents(georgejr, george, noreen).
parents(scott, george, noreen).
parents(joanne, george, noreen).
parents(jessica, david, edel).
parents(clara, david, edel).
parents(michael, david, edel).
parents(laura, georgejr, susan).
parents(anna, scott, siobhan).


/* Relationships */
father(X, Y) :- parents(Y, X, _).
male(X) :- father(X, _).

mother(X, Y) :- parents(Y, _, X).
female(X) :- mother(X, _).

grandfather(X, Y) :- father(X, Z), father(Z, Y).
grandfather(X, Y) :- father(X, Z), mother(Z, Y).

grandmother(X, Y) :- mother(X, Z), mother(Z, Y).
grandmother(X, Y) :- mother(X, Z), father(Z, Y).

brother(X, Y) :- male(X), father(Z, X), father(Z, Y).

sister(X, Y) :- female(X), father(Z, X), father(Z, Y).

aunt(X,Y) :- sister(X,Z), parents(Y, Z, _).
aunt(X,Y) :- sister(X,Z), parents(Y, _, Z).

uncle(X, Y) :- brother(X, Z), parents(Y, Z, _), not(father(X,Y)).
uncle(X, Y) :- brother(X, Z), parents(Y, _, Z), not(father(X,Y)).
4

3 回答 3

3

简短的回答是 anuncle正在工作(有点)并且aunt没有,因为您对maleand的定义female有缺陷:除非他们有孩子,否则它无法识别男性或女性。在您的一组事实中,没有女性(从名字来看)会生孩子并且有一个有孩子的兄弟姐妹。出于同样的原因,scott不应该出现在叔叔名单中。

解决这个问题很简单:你可以

  1. 删除推断性别的规则并改为陈述性别,或
  2. parentsson/ daughterfacts + rule替换事实parents,并根据某人是某人的女儿这一事实来推断性别。
于 2013-10-14T21:36:10.440 回答
3

你问为什么aunt(A,P)没有任何解决方案。换句话说

没有阿姨。

这是使用程序切片来定位问题的系统方法。由于相关程序aunt/2是纯单调程序,我们可以非常系统地定位问题。

你的问题是这样的:你的目标aunt(A,P)太专业了。我们现在将尝试对其进行概括。但只要目标仍然失败。通过这种方式,我们将获得仍然失败的最大泛化。因此,问题一定出在剩余部分的某个地方。

首先,让我在您的程序中介绍以下定义:

:- op(950,fx, *).

*_.

这允许用前缀“注释掉”一个目标*。通过这种方式,我们将概括您的程序。让我们用阿姨的定义来试试这个。也就是*在一个目标前面插入,重新加载示例,看看是否仍然失败。以下是它的最大概括:

阿姨(X,Y):- 姐姐(X,Z),* 父母(Y,Z,_)。
阿姨(X,Y):- 姐姐(X,Z),* 父母(Y,_,Z)

甚至这种概括也失败了!所以,换句话说,也sister/2总是失败。

没有姐妹。

姐姐(X,Y):-女性(X),父亲(Z,X),* 父亲(Z,Y)

甚至以上失败!

没有女人有父亲。

你可以坚持这一点,或者继续,用目标的定义代替目标。

姐姐(X,Y):-母亲(X,_),父母(X,Z,_),* 父亲(Z,Y)

多一个:

姐姐(X,Y):-父母(_,_,X),父母(X,Z,_),* 父亲(Z,Y)

所以只有母亲可能是姐妹,这当然有点太多的限制。

于 2013-10-15T11:22:52.630 回答
1

您正在引入大量冗余,并且至少引入了奇怪的检查机制。

fatherandmother关系意味着您将关系指定parents/3parents(child,father,morther)。我不明白你为什么定义两个查询。

出问题的是,兄弟姐妹的关系会成功brother(X,X)。可以避免这种情况X \= X,这基本上是您在 aunt 条款中解决的问题。

此外,您将需要提供其他信息。和male关系仅在人 ( ) 有孩子female时才解决。X但是,当您自己没有孩子时,您可以成为阿姨或叔叔。

这应该有效:

/* FACTS */

parents(david, george, noreen).
parents(jennifer, george, noreen).
parents(georgejr, george, noreen).
parents(scott, george, noreen).
parents(joanne, george, noreen).
parents(jessica, david, edel).
parents(clara, david, edel).
parents(michael, david, edel).
parents(laura, georgejr, susan).
parents(anna, scott, siobhan).


/* Relationships */

parent(X,Y) :- parents(Y,X,_).
parent(X,Y) :- parents(Y,_,X).

father(X, Y) :- parents(Y, X, _).

male(michael).
male(X) :- father(X, _).

mother(X, Y) :- parents(Y, _, X).

female(joanne).
female(jessica).
female(jennifer).
female(clara).
female(laura).
female(anna).
female(X) :- mother(X, _).

grandfather(X, Y) :- father(X, Z), father(Z, Y).
grandfather(X, Y) :- father(X, Z), mother(Z, Y).

grandmother(X, Y) :- mother(X, Z), mother(Z, Y).
grandmother(X, Y) :- mother(X, Z), father(Z, Y).

brother(X, Y) :- male(X), father(Z, X), father(Z, Y), X \= Y.

sister(X, Y) :- female(X), father(Z, X), father(Z, Y), X \= Y.

aunt(X,Y) :- sister(X,Z), parent(Z,Y).

uncle(X, Y) :- brother(X, Z), parent(Z,Y).
于 2013-10-14T21:26:51.650 回答