2013-02-16 50 views
1

我想要找出列表中的局部最大值。基本上我要找到的值大於列表之前的元素和其後的元素,結果應該是所有局部最大值的列表。prolog:列表中的局部最大值

例子: 所以查詢local_maximum([3,2,3,4,5,2,7,3,6,5], Answer)應該回答Answer=[5,7,6](因爲5>4 , 5>2... 7>2, 7>3等..)

我的邏輯是你繼續做遞歸調用,直到你達到只有3列表中的元素。您檢查中間元素是否大於左側和右側元素,並且是否將其添加到列表中。

此外,我的意圖是,當我上傳遞歸調用樹時,我總是想檢查遞歸調用樹中的第二個元素是否大於其左側和右側的元素。

1,3,5,2,1 
| 
3,5,2,1 
| 
5,2,1 
BASE CASE 
checks if 2 is greater than 5, and 1.... append nothing... 
| 
3,5,2,1 
checks if 5 is greater than 3 and 2, append 5... 

等..

/*base case stop if it reaches 3 elements*/ 
local_maximum([X,Y,Z], Answer):- Y>X, Y>Z, Answer is Y. 
local_maximum([X,Y,Z], []):- Y<X, Y<Z. 

local_maximum([H|T], Answer):- 
local_maximum(T, Answer), append([], Answer, Answer). 

我不知道如何去對這個... 對不起我的英語。問候,


解決。

您可以檢查,而您所訪問的列表,並保存剛剛適合元素:

local_maximum([X,Y,Z|Xs], [Y|Ms]) :- 
Y>X, Y>Z, 
local_maximum([Z|Xs], Ms). 

然後添加跳躍和基本情況的規則。您編寫跳過案例的方式將影響上述規則,因此需要在此處進行剪輯。這是因爲Prolog會根據請求搜索替代方案!我認爲增加的剪輯提高了'程序'的可讀性。

+0

我很高興你解決了你的問題。但是在這麼說的時候,你已經消除了你的問題。我將恢復你的改變,以便它可以幫助別人。 – 2013-02-18 01:48:10

回答

2

你可以檢查,而您所訪問的列表,並保存剛剛適合元素:

local_maximum([X,Y,Z|Xs], [Y|Ms]) :- 
    Y>X, Y>Z, 
    local_maximum([Z|Xs], Ms). 

然後添加跳躍和基本情況的規則。您編寫跳過案例的方式將影響上述規則,因此需要在此處進行剪輯。這是因爲Prolog 根據要求搜索替代品!我認爲增加的剪輯提高了'程序'的可讀性。

我測試與切割的版本:

?- local_maximum([3,2,3,4,5,2,7,3,6,5], Answer). 
Answer = [5, 7, 6]. 

?- local_maximum([1,2,1,2,1], Answer). 
Answer = [2, 2]. 
+0

當你說'跳過'時,你的意思是if和else語句嗎?我添加了以下內容。 local_maximum([Y | Xs],Ms); local_maximum([Y | Xs] ,[] | Ms))。 另外,我添加了幾個基本案例...如果最終有3個元素,則爲3;如果最後只有2個元素,則爲1。當我追蹤到這件事時發生了什麼,它將整個列表作爲一個元素處理......奇怪的... – GoldAK47 2013-02-16 08:46:01

+0

好的舊的Prolog通過其他規則編碼替代品。嘗試添加*另一個*規則處理跳過的情況,並保持不變(除了最終裁減),我顯示的規則。 – CapelliC 2013-02-16 09:35:58

+0

這太神奇了。謝啦。我不能相信我在調試時過於複雜。 – GoldAK47 2013-02-16 10:05:34

0

我不知道以前的解決方案,但嘗試這個問題我自己,這是我如何能夠解決這個問題了。

local_maximum([X,Y,Z], [Y|Ms]):- 
    nonvar(X), nonvar(Y), nonvar(Z), 
    Y>X, Y>Z, !. 

local_maximum([X,Y,Z|Xs], [Y|Ms]):- 
    nonvar(X), nonvar(Y), nonvar(Z), 
    Y>X, Y>Z, 
    local_maximum([X,Z|Xs], Ms). 

local_maximum([X,Y,Z|Xs], Ms):- 
    nonvar(X), nonvar(Y), nonvar(Z), 
    local_maximum([X,Z|Xs], Ms), !. 

所以通過測試你會得到。

| ?- local_maximum([3,2,3,4,5,2,7,3,6,5], Y). 
Y = [5,7,6|_] 
+0

您不需要'isInst/1'謂詞。只需使用標準的'nonvar/1'內置謂詞。 – 2015-02-22 19:05:47

+0

那麼這是尷尬的感謝指出,我會進行更正。另外在任何人注意到這個問題的側面說明你實際上並不需要實例化檢查它只是當我一直遇到我的變量沒有被實例化的問題,它拋棄了我的錯誤檢查,所以我添加了這個謂詞。 – Michael 2015-03-04 04:35:36