2013-02-16 4 views
1

Я пытаюсь выяснить местный максимум в списке. В основном я должен найти значения, которые больше, чем элемент перед списком и элементом после него, и результат должен быть списком всех локальных максимальных значений.пролог: локальный максимум в списке

Пример: поэтому запрос 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

Я рад, что вы решили свою проблему. Но, сказав это, вы уничтожили свой вопрос. Я собираюсь вернуть ваши изменения, чтобы они могли помочь другим. –

ответ

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 ([X, Y, Z | Xs], [Y | Ms]): - (Y> X, Y> Z -> local_maximum ([Z | Xs], Ms); local_maximum ([Y | Xs] , [] | Ms)). Кроме того, я добавил несколько базовых футляров ...3 случая, если он заканчивается наличием 3 элементов в конце и 1 для, если он имеет только 2 элемента в конце. Что произошло, когда я проследил это, он рассматривал весь список как один элемент ... Нечетный ... – GoldAK47

+0

Хорошо старый пролог закодировал альтернативу с помощью, ну, альтернативных правил. Попробуйте добавить * другое * правило, которое обрабатывает случай пропуска, и оставляя неизменным (кроме возможного сокращения), правило, которое я показал. – CapelliC

+0

Это потрясающе. Спасибо чувак. Не могу поверить, что я слишком сложный, когда я отлаживал. – GoldAK47

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'. –

+0

Хорошо, что это неловкое спасибо за указание на то, что я сделаю исправление. Кроме того, на стороне примечания для тех, кто замечает эту проблему, на самом деле вам не нужна проверка подлинности именно так, что в то время я постоянно сталкивался с проблемой не инициализации моих переменных, и она отбрасывала мою проверку ошибок, поэтому я добавил это сказуемое. – Michael

Смежные вопросы