最大值由prolog子句定义的值

Bem*_*mmu 1 prolog

我知道如何迭代Prolog中的列表以找到最大值,但是如果每个东西都是单独的子句呢?例如,如果我有一堆猫科动物及其年龄,我怎么能找到最老的小猫?

cat(sassy, 5).
cat(misty, 3).
cat(princess, 2).
Run Code Online (Sandbox Code Playgroud)

我的第一个想法是"嗯,最古老的猫是没有老年人存在的猫".但我真的无法将其转化为prolog.

oldest(X) :- cat(X, AgeX), cat(Y, AgeY), X \= Y, \+ AgeX < AgeY, print(Y).
Run Code Online (Sandbox Code Playgroud)

这仍然错误地匹配"有薄雾".这样做的正确方法是什么?有没有什么方法可以更直接地迭代年龄来选择最大值?

sta*_*lue 6

一种方法是

oldest(X) :- cat(X, AgeX), \+ Y^(cat(Y, AgeY), Y \= X, AgeX < AgeY).
Run Code Online (Sandbox Code Playgroud)

您还可以使用setof/3获取所有猫的列表并从中获得最大值.