我想使用Sicstus库中的这个函数给我一个小于250
的列表中的最大数字。例如,[1,5,500,50]
应返回500
。
我无法从纪录片中了解如何撰写P
。
这给出了一个错误:
max_member((M < 250), M, [5,6,250,4]).
max_member(:P, ?Xmax, +[X1,...,Xn])
将Xmax
与最大值统一起来[X1,...,Xn]
的元素,由比较谓词P
定义, 这应该像<¯
。
答案 0 :(得分:1)
此电话的问题:
max_member((M < 250), M, List)
是否max_member/3
期望第一个参数的谓词接受另外两个参数,并且行为小于或等于。 max_member/3
会尝试将(M < 250)
称为call((M < 250), X, Y)
,这会产生错误。
那么诱惑就是编写一个自定义比较谓词,compare(Ceiling, X, Y)
只有在X =< Y
Y < Ceiling
时才会成功。它将与呼叫max_member(compare(250), X, Y)
一起使用。但是,无论调用中X
和Y
的顺序如何,这样的谓词都会失败。 max_member/3
假设对于给定的参数对,所提供的谓词对于参数的一个排序将失败,但对另一个参数排序则成功。也就是说,它形成了一个正确的排序关系&#34;这样call(Pred, X, Y)
或call(Pred, Y, X)
中至少有一个成功。否则,找到最大值的算法会混淆。
您可以通过两个步骤实现您想要的目标:
max_with_ceiling(List, Ceiling, Max) :-
include(>(Ceiling), List, R),
max_member(Max, R).