2013-02-16 2 views
1

목록에서 최대 값을 찾으려고합니다. 기본적으로 목록 앞의 요소와 요소 뒤에 오는 값보다 큰 값을 찾고 결과는 모든 로컬 최대 값의 목록이어야합니다.프롤로그 : 목록의 로컬 최대 값

예 : 그래서 쿼리 local_maximum([3,2,3,4,5,2,7,3,6,5], Answer) 당신이 목록 만 3 요소에 도달 할 때까지 재귀 호출을하고 계속 할

내 논리가 Answer=[5,7,6] (5>4 , 5>2... 7>2, 7>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 문을 의미합니까? 나는 다음을 추가했다. [Y | Xs] local_maximum ([Z | Xs], Ms), local_maximum ([X | Y | Xs] , [] | Ms)). 또한 기본 사례 몇 개를 추가했습니다 ...마지막에 3 개의 요소가있는 경우 3 개의 사례가 있고 끝에 2 개의 요소 만있는 경우 1 개가 있습니다. 내가 이것을 추적했을 때 일어난 일은 전체 목록을 하나의 요소로 취급했기 때문입니다 .... Odd ... – GoldAK47

+0

좋은 오래된 Prolog는 대안 규칙을 사용하여 대안을 인코딩했습니다. 스킵 케이스를 처리하는 다른 * 규칙을 추가하고, 내가 나타낸 규칙을 변경하지 않고 (최종 절단과 별도로) 남겨 둡니다. – 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

관련 문제