列表中的Prolog最大元素:max_member

时间:2015-03-04 20:48:17

标签: prolog

我想使用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定义,   这应该像

1 个答案:

答案 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)一起使用。但是,无论调用中XY的顺序如何,这样的谓词都会失败。 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).