0

我试图从给定列表'L'中获取最大数量并将其分配给一个变量,所以我曾经编写以下函数:

max(L,X):-
    [H|Q]=L,
    (X<H -> X=H),
    length(Q,QLEN),
    (QLEN>0 -> max(Q,X)),
    true.

但是,在编译代码并max([1,2,3],X)SWI-Prolog中进行提示后,出现以下错误:

错误:参数未充分实例化错误:在:错误:
[9] _1064<1 错误:[8] max([1,2|...],_1092) 在 c:/users/kais/desktop/tp3。 pl:24 错误:[7]

为什么我会收到这样的错误?

4

2 回答 2

3

如评论中所述,您尝试HX未实例化的进行比较。解决这个问题的方法是创建一个谓词maxList/3并在内部调用它maxList/2,如下所示:

maxList([H|T], Max) :-
    maxList(T, H, Max).

maxList([], Max, Max).
maxList([H|T], Max0, Max) :-
    Max1 is max(H, Max0),
    maxList(T, Max1, Max).

?- maxList([1,2,3],X).
X = 3.

max/2只返回两个参数之间的最大值。一个可能的实现max/2可能是:

myMax(M,A,B):-
    A > B ->  M = A;
    M = B.

?- myMax(A,1,2).
A = 2.

顺便说一句,SWI 中已经有一个内置谓词来执行此操作,称为max_list/2(我之前发布的代码实际上来自此实现):

?- max_list([1,2,3],X).
X = 3.
于 2018-01-24T16:03:07.180 回答
1

另一种可能的实现,不依赖于辅助谓词,可以根据以下逻辑完成:

  1. 如果列表只包含一个元素,则它是最大值。
  2. 如果列表L包含多个元素,即它的形式为[H|T],并且 的最大元素TM,则 的最大元素为Lif HH>=M否则为M

粗略的编码可能是:

maxList([X],X).
maxList([H|T],H) :-
  maxList(T,M),
  H >= M.
maxList([H|T],M) :-
  maxList(T,M),
  H < M.

这留下了改进的空间,但尊重上述逻辑并返回每个非空整数列表的最大元素。

于 2018-01-28T16:15:34.280 回答