2009-12-21 2 views
-1

임의의 목록이 대칭인지 테스트하는 방법이 있습니까?프롤로그 : 임의의 목록이 대칭인지 테스트합니다.

예를 들어

: 내이 시도는 마지막 요소에 첫 번째 요소를 비교하는 것이었다

?- symmetric([a,b,b,a]). 
true. 

?- symmetric([a,b,c,a]). 
false. 

?- symmetric([a,a]). 
true. 

그들을 제거하고 목록의 나머지를 진행할 동일한 경우 그렇지 않으면 실패합니다. 리스트에 2 개의 요소가있어, 그것들이 동일한 경우는 성공합니다. 그렇지 않으면 실패합니다.
last(L,[L]). 
last(L,[H|T]):-last(L,T). 

사람이 좋은 방법을 알고 있나요

이 작업을 수행 할 :

그러나이 술어를 사용하여 목록의 마지막에 정말 성능이 좋은 아니다 "발견"? 어떤 도움이라도 정말로 감사 할 것입니다!

Btw : 요소 수가 고르지 않은 목록은 신경 쓰지 않습니다.

답변

6

내 질문에 대한 답변을 찾았습니다.

대칭 목록은 회문 (때로는 나무의 숲을 볼 표시되지 않습니다) ... 그리고이 간단한 조건 테스트입니다 :

is_palindrome(L) :- reverse(L,L). 
+0

가장 간단한 답변은 최고입니다. –

2

하지만 당신의 알고리즘은 그럼에도 불구하고 흥미로웠다. 재귀 적 접근의 성능 저하를 겪지 않는 last/2 내장 (적어도 SWI Prolog에서)

symmetric([]). 
symmetric([L]). 
symmetric([H|T]):- 
    last(T,H),  % this forces the last element to equal the first 
    append(T1,[H],T), % this deconstructs the rest list in one without the last elem. 
    symmetric(T1). % and recurses on that 

흥미가 마지막 요소없이 나머지 목록에 초기 나머지 목록을 해체하는 append/3 술어의 사용이다 :이, 여기 당신의 아이디어를 구현하는 버전입니다.

편집 : last/2 없이도 할 수 있다는 것을 깨달았습니다. 바로 append/3입니다. 그래서 여기에 개선 된 버전입니다 :

symmetric([]). 
symmetric([L]). 
symmetric([H|T]):- 
    append(T1,[H],T), % deconstruct and assure symmetry 
    symmetric(T1). % and recurse 

append 모두를 수행 여기에, 이제 해체는 T1을 얻을뿐만 아니라,리스트의 마지막 요소는 첫 번째 :-) 일치하는지 보장합니다.