2009-11-29 81 views
6

如何編寫兩個子句的遞歸定義來查找列表中的最大值。到目前爲止,我已經寫了這個:查找列表上的最大數的兩個子句定義

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). 

這是不行的,它說有一個語法錯誤,我不能完全看到了,我知道這是不是兩個條款無論是。任何人都知道我可以如何簡化它,使其成爲兩個條款?

+1

如果這是家庭作業,你應該添加'作業'標籤的問題。 – 2009-11-29 18:53:09

+0

不是這不是作業,它只是嘗試使用prolog時遇到的基本困難。 – Taylor 2009-11-29 20:21:21

回答

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). 
10

和你一樣,我使用謂詞的'max'名稱。此實現不依賴任何內置謂詞:

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

如果您在第一行的末尾添加剪切,它會更有效率:max([X],X): - !. – 2012-08-30 20:56:47

+3

嘿,你能解釋一下這裏發生了什麼嗎? – 2014-03-17 13:27:30

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]]). 
1

num=INTEGER 
list = num* 

爲最大的解決方案PREDICATES

nondeterm maxList(list,num) 

CLAUSES

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). 
0

我認爲下面的代碼將解決這個問題:

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

max_list([ - 1],M)'應該是什麼?根據你的定義:'M = 0'和'M = -1'。 – false 2012-03-01 21:16:14

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. 
+0

-1:'m([ - 1,-2],M)'給出'M = 0' – false 2013-11-06 14:56:04

-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

+0

這是如何工作的以及它如何改進其他答案? – Mark 2013-11-03 18:15:21

+0

-1:'list([3,2,1],M)'給出'M = 3; M = 1; M = 2; M = 1' – false 2013-11-06 14:54:37

0

我知道這個問題是舊的,但這裏的使用if-then-else結構的答案:

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