2014-04-04 2 views
1

오늘 Prolog에서 시험을 보았으며 이전 질문을 사용하여 개정했습니다.프롤로그 술어 - 스왑

답이 잘못 되었습니까? 아무도 나에게 이것을 설명해 주시겠습니까? 그것은 매우 도움이 될 것입니다.

다음과 같은 조건을 고려 주셔서 감사합니다 : 쌍 대답 다음 쿼리와
swap([], []). 
swap([X1, X2 | L], [X2, X1 | S]) :- swap(L, S). 

이 잘못되었습니다 :

(a) ?- swap([a,b,c,d], S). 
S = [b, a, d, c]. 

(b) ?- swap([a,b,d], H). 
false. 

(c) ?- swap([a,a,b,b], S). 
S = [b, b, a, a]. 

(d) ?- swap([], S). 
S = []. 
+0

C가 잘못되었습니다. 술어를주의 깊게보고 프롤 로그 인터프리터 인 것처럼 가장하십시오. 그런 다음 입력 내용을 roght 절과 일치시키고 결과를 확인하십시오. – lurker

답변

0

(c)는 참으로 잘못된 답변입니다. 수동이 쿼리를 실행하면 명확 그런 다음 두 번째 절과 일치 않는 절 swap([], []). 일치하지 않는,

swap([a,a,b,b], S). 

: swap([X1,X2|L], [X2,X1|S]) :-...를 항목 (c)는 다음 쿼리를 가지고있다.

swap([a, a, b, b], S). 
swap([X1, X2 | L], [X2, X1 | S]) :- swap(L, S). 
==> X1 = a, X2 = a, L = [b, b] 
==> swap([a, a| [b,b]], [a, a | S]) :- swap([b, b], S). 

프롤로그은 주어진 목록 [a,a,b,b]와 함께 첫 번째 인수 [X1,X2|L]를 인스턴스화 할 수 있습니다. 즉, X1 = a, X2 = a 및 나머지 목록은 L = [b,b]입니다. 이미이 정보를 통해 목록 [X2,X1|S][a,a|S]이지만 (c)로 표시된 대답은 [b,b,a,a]입니다. [a,a|S][b,b,a,a]과 일치하지 않으므로 알 수 없으므로 S을 찾을 필요조차 없습니다.