Prolog 用于查找列表上的最大数量的双子句定义

Prolog 用于查找列表上的最大数量的双子句定义,prolog,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). max(长,米):- 最大值([H | T],M):- 最大值(T,H,M)。 最大值([],米,米)。 最大值([H | T]

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

 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).
max(长,米):-
最大值([H | T],M):-
最大值(T,H,M)。
最大值([],米,米)。
最大值([H | T],Y,M):-
H=Y,
最大值(T,H,M)。

这不起作用,它说有一个语法错误,我看不太清楚,我知道它也不是两个子句。有人知道我如何将它简化为两个子句吗?

语法错误是因为前两个子句没有主体

要回答您的问题,请注意列表的最大值可归纳定义如下:

  • 包含一个元素的列表的最大值为该元素
  • 包含多个元素的列表的最大值是头的最大值和尾的最大值
因此,

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

编辑:尾部递归实现可能更有效。您可以通过定义一个谓词
max\u 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).

与您一样,我使用“max”名称作为谓词。此实现不依赖于任何内置谓词:

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

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

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]]).
领域

num=INTEGER
list = num*
谓词

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.

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

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

这个肯定有用

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.
l:-列表。
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是A。
maks(A、B、C):-A=
目标:
列表([3,9,4,5],M)


输出:
M=9

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

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

如果这是家庭作业,你应该在问题中添加“家庭作业”标签。不,这不是家庭作业,这只是我在尝试使用prolog时遇到的一个基本困难。
max\u list([-1],M)
应该是什么?根据您的定义:
M=0
M=-1
。如果在第一行末尾添加剪切,效率会更高:max([X],X):-!。
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.
list([H],H).
list([H1,H2|T],X):-H1>H2,list([H1|T],X).
list([_|T],X):-list(T,X).
maxmember([X],X).
maxmember([H|T],Max) :- maxmember(T, M),(H>M -> Max is H ; Max is M).