在Prolog中查找最年长的人

在Prolog中查找最年长的人,prolog,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找到最年长的人。例如:

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。

您最早的/1定义无效,Capelical的回答说明了为什么以及如何修复它

以下是另一种找到最年长者的方法:

oldest(X) :-
  findall((Age, Name), age(Name, Age), List),
  sort(List, SList),
  reverse(SList, [(_, X) | _]).
您最旧的/1定义无效,Capelical的回答说明了为什么以及如何修复它

以下是另一种找到最年长者的方法:

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

正确的答案应该是

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

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

在SWI Prolog中编辑,库可以做到这一点,还有更多

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

正确的答案应该是

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

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

在SWI Prolog中编辑,库可以做到这一点,还有更多

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

谢谢,成功了。但是有没有一种更省钱的方法呢?哦,为什么我对最古老的/1的定义无效?谢谢,它起作用了。但是有没有一种更省钱的方法呢?哦,为什么我对最早的/1的定义是无效的?它是有效的,谢谢!但是这个定义和我的有什么区别呢?为什么这个能工作而我的不行?你的代码找到第一个几乎有一个的人younger@renatov如果你逐字读最古老的谓词,它说,如果X是P的年龄,并且有任何人的年龄是Y,那么P是最古老的,Y小于或等于X。因此,如果只找到一个比P年轻的人,它就会成功。它没有建立所有其他人都必须年轻的约束条件。@M我现在明白了。你是对的,它实际上是在问是否有比某人年长的P,不一定比DB中的每个人都年长。现在我明白了,非常感谢你抽出时间!它很管用,谢谢!但是这个定义和我的有什么区别呢?为什么这个能工作而我的不行?你的代码找到第一个几乎有一个的人younger@renatov如果你逐字读最古老的谓词,它说,如果X是P的年龄,并且有任何人的年龄是Y,那么P是最古老的,Y小于或等于X。因此,如果只找到一个比P年轻的人,它就会成功。它没有建立所有其他人都必须年轻的约束条件。@M我现在明白了。你是对的,它实际上是在问是否有比某人年长的P,不一定比DB中的每个人都年长。现在我明白了,非常感谢你抽出时间!