两个子句定义,用于查找列表中的最大数量

时间:2009-11-29 17:04:59

标签: prolog

如何编写两个子句递归定义来查找列表中的最大值。到目前为止,我写了这个:

 max(L,M):-  

 max([H|T],M):-

max(T,H,M).
max([],M,M).
max([H|T],Y,M):-
   H =< Y,
   max(T,Y,M).
max([H|T],Y,M):-
   H > Y,
   max(T,H,M).

这不起作用,它说有一个我无法看到的语法错误,我知道它也不是两个子句。任何人都知道如何简化它以使其成为两个条款?

8 个答案:

答案 0 :(得分:10)

正如您所说,我使用谓词的'max'名称。此实现不依赖于任何内置谓词:

max([X],X).
max([X|Xs],X):- max(Xs,Y), X >=Y.
max([X|Xs],N):- max(Xs,N), N > X.

答案 1 :(得分:5)

语法错误是因为前两个子句没有正文。

要回答您的问题,请注意可以按以下方式定义列表的最大值:

  • 包含一个元素的列表的最大值是该元素。
  • 包含多个元素的列表的最大值是头部的最大值和尾部的最大值。

因此,

max_list([H], H).
max_list([H|T], M2) :- 
  max_list(T, M),
  M2 is max(H, M).

此代码使用max/2SWI-PrologGNU-Prolog)。请注意,大多数或所有Prolog实现都将具有内置函数max_list/2SG),因此实际上不需要自己定义它。

编辑: Bakore notes尾部递归实现可能更有效。你可以通过定义一个带有附加参数max_list/3的谓词C来做到这一点,即到目前为止看到的最大值。

max_list([H|T], M) :- max_list(T, H, M). 

max_list([], C, C).
max_list([H|T], C, M) :- C2 is max(C, H), max_list(T, C2, M).

答案 2 :(得分:1)

以下是列表列表中最大值的解决方案

max_list([], C, C).
max_list([H|T], C, M) :- C2 is max(C, H), max_list(T, C2, M).

max_list([], []).
max_list([[H|HB]|B],[RH|RB]) :- max_list(HB, H, RH), max_list(B, RB).

ex: max_list([[1,3,6], [6,3,8,2],[2,1,0]]).

答案 3 :(得分:1)

结构域

num=INTEGER
list = num*

PREDICATES

nondeterm maxList(list,num)

条款

maxList([A],A).   
maxList([A|List],Max):- Max=A,maxList(List,Max1),A>=Max1.  
maxList([A|List],Max):- Max=Max1,
maxList(List,Max1),A< Max1.

目标

maxList([1,2,3,5,4],Max).

答案 4 :(得分:1)

这个肯定有用

l:-listing.
m(L,X):-aku2(L,0,X).
aku2([],B,B).
aku2([G|O],Maks,C):-maks(Maks,G,Maks1),aku2(O,Maks1,C).
maks(A,B,C):-A>B, C is A.
maks(A,B,C):-A=<B, C is B.

答案 5 :(得分:0)

我认为下面的代码可以解决问题:

max_list([],0).
max_list([H],H).
max_list([H|T],M):- max_list(T,M1),M is max(H,M1).

答案 6 :(得分:0)

我知道这个问题很老,但这是使用if-then-else结构的答案:

maxmember([X],X).
maxmember([H|T],Max) :- maxmember(T, M),(H>M -> Max is H ; Max is M).

答案 7 :(得分:-2)

list([H],H).
list([H1,H2|T],X):-H1>H2,list([H1|T],X).
list([_|T],X):-list(T,X).

目标:list([3,9,4,5],M)

输出:M=9