根据一些事实,我必须找到使用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的新手。
答案 0 :(得分:2)
正确的应该是
oldest(P) :- age(P, X) , \+ (age(_, Y) , Y > X).
当然,产量上升了......
(\+)/1
读为not(目标),表示“如果没有目标解决方案,则会失败”。
编辑,库(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) | _]).