2

基于一些事实,我必须找到使用 Prolog 的最年长的人。例如:

age(john, 10).
age(mary, 15).
age(rose, 75).
age(jack, 49).
age(carl, 17).
age(lucy, 66).

控制台输出应该是:

?- oldest(rose).
True.

?- oldest(X).
X = rose.

我的代码如下,但它不起作用:

oldest(P) :- age(P, X) , age(_, Y) , X >= Y.

我找不到错误,但我想这与回溯有关。有人可以帮我吗?我是 Prolog 的新手。

4

2 回答 2

3

正确的应该是

oldest(P) :- age(P, X) , \+ (age(_, Y) , Y > X).

当然,收益率上升了……

(\+)/1读作不是(目标),意思是“如果目标没有解决方案就失败”。

在 SWI-Prolog 中编辑,库(聚合)可以做到这一点,还有更多......

oldest(P) :- aggregate(max(A,Pers), age(Pers,A), max(_,P)).
于 2013-10-27T16:38:22.973 回答
1

您的oldest/1定义无效(CapelliC 的回答显示了为什么以及如何解决它)。

这是另一种找到最年长的人的方法:

oldest(X) :-
  findall((Age, Name), age(Name, Age), List),
  sort(List, SList),
  reverse(SList, [(_, X) | _]).
于 2013-10-27T16:25:08.180 回答