这是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).
谓词和规则的定义是:
son(X,Y(表示X是Y 的子
age(M,N(表示M的年龄为N
兄弟(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 ? ;
...
如何使其只生成一个输出而不使用任何外部库或生成另一个规则?
您的代码无法工作,因为:
- 它没有正确描述某人成为家庭长子的条件,并且
- 它使用常数(
ageX
和ageY
(,其中它应该使用变量(AgeX
和AgeY
(
假设">一个家庭中的长子是没有哥哥姐姐的那一个";,你可以编码:
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.