序言中的规则来定义一个原子(在本例中是一个名字)是否是长子

  • 本文关键字:一个 是否是 定义 规则 prolog
  • 更新时间 :
  • 英文 :


这是prolog中的代码:

son(blake, john).
son(blake, katey).
son(toney, john).
son(toney, katey).
son(flory, john).
son(flory, katey).
son(charlie, stark).
son(charlie, shrek).
son(valenti, stark).
son(valenti, shrek).
age(blake, 13).
age(toney, 15).
age(flory, 19).
age(charlie, 48).
age(valenti, 49).

谓词和规则的定义是:

  1. son(X,Y(表示X是Y 的子

  2. age(M,N(表示M的年龄为N

  3. 兄弟(p,Q(表示p和Q是兄弟

我的问题是,如果X是一个家庭的长子,如何制定一个规则,让它被命名为oldestSon(X(

当查询是oldestSon(flory(和oldestSon(valenti(时,它返回true或yes,当查询是最旧的(toney(时,返回false或no。

我试着写下以下几行代码:

oldestSon(X) :-
son(X, _),
son(Y, _),
siblings(X, Y),
age(X, ageX),
age(Y, ageY),
ageX >= ageY.

但是,当我尝试输入查询时,在任何情况下,当查询是oldestSon(blake(时。返回如下:

false ? ;
false ? ;
false ? ;
...

如何使其只生成一个输出而不使用任何外部库生成另一个规则

您的代码无法工作,因为:

  • 它没有正确描述某人成为家庭长子的条件,并且
  • 它使用常数(ageXageY(,其中它应该使用变量(AgeXAgeY(

假设">一个家庭中的长子是没有哥哥姐姐的那一个";,你可以编码:

oldestSon(X) :-
age(X, AgeX),
not( ( siblings(X, Y),
age(Y, AgeY),
AgeY > AgeX ) ).

我还假设谓词siblings/2已经定义为:

siblings(X, Y) :-
son(X, Z),
son(Y, Z),
X = Y.

相关内容

最新更新