寻找Prolog中最老的人

时间:2013-10-27 14:58:37

标签: prolog

根据一些事实,我必须找到使用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的新手。

2 个答案:

答案 0 :(得分:2)

正确的应该是

oldest(P) :- age(P, X) , \+ (age(_, Y) , Y > X).
当然,产量上升了......

(\+)/1读为not(目标),表示“如果没有目标解决方案,则会失败”。

SWI-Prolog中的

编辑,库(aggregate)可以做到这一点,等等......

oldest(P) :- aggregate(max(A,Pers), age(Pers,A), max(_,P)).

答案 1 :(得分:1)

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

以下是找到最老的人的另一种方式:

oldest(X) :-
  findall((Age, Name), age(Name, Age), List),
  sort(List, SList),
  reverse(SList, [(_, X) | _]).