2014-03-01 2 views
1

방금 ​​프롤로그를 배우기 시작했고 이해하지 못하는 문제가 발생했습니다. 내가 물어 보면 :프롤로그에서 분열의 환성

?- fail; true. 

프롤로그 답변 : 내가 예상 뭔가

true 

입니다. 그러나, 경우 내가 물어 :

?- true; fail. 

프롤로그 답변 :

true ; 
false. 

.. 그리고 나는 이유를 이해하지 않습니다를. 분리 연산자는 교환 가능해야합니다. 이 두 프롤로그 답변이 다른 이유는 무엇입니까?

+0

[Prolog에서 마지막으로 구현] ([http://stackoverflow.com/questions/11734986/implementing-last-in-prolog] – false

답변

1

이것은 최상위 레벨 상호 작용의 세부 사항 일뿐 아니라 사용중인 Prolog 인터프리터에 따라 다른 동작을 관찰 할 수 있습니다.

SWI - 프롤로그가 소개 documentation에, 몇 가지 정보를 제공합니다

2.1.2 프로그램을로드 한 후 쿼리

실행을, 하나는 프로그램에 대해 프롤로그 쿼리를 요청할 수 있습니다. 아래 질문은 Prolog에게`sam '이 좋아하는 음식을 묻습니다. 시스템은 특정 X에 대한 목표를 증명할 수있는 경우 X =로 응답합니다. 사용자가 다른 솔루션을 원할 경우 세미콜론 (;) 또는 스페이스 바 6을 입력 할 수 있습니다. 당신이 더 많은 답변을보고 싶지 않다면 리턴 키를 사용하십시오. 사용자가 리턴 키를 사용하거나 Prolog가 더 이상의 응답이 없다는 것을 알면 Prolog는 전체 정지 (.)로 출력을 완료합니다. Prolog가 (더) 답변을 찾을 수 없으면 false를 씁니다.

+0

) 가능한 해결책/다른 해결책/다른 답변 / – false

3

또한 프롤로그 논리합 연산자, (;)/2는 일반적 하지 가환되어 있습니다. 예를 들어 :

?- !; write(else). 
true. 

?- write(then); !. 
then 
true ; 
true. 

분리의 오른쪽 지점은 왼쪽 분기를 실행할 때 암시 적 선택 포인트가 절단되지 경우 역 추적에 시도됩니다.

foo :- (!; write(else)). 

은 동등하다 : 따라서

foo :- !. 
foo :- write(else). 

, 인하 (기타) 부작용 등의 논리합을 작동하지 (;)/2 결과 절 같은 참고.

1

혼란은 프롤로그가 결과를 표시하는 방법에 관한 것입니다. 프롤로그에서 쿼리를 만들면 가능한 모든 대답을 찾으려고 시도합니다. 즉, 첫 번째 사실 또는 절에서 시작하여 순차적으로 통과하고 결국 쿼리를 true로 만들면 대답을 표시합니다. 프롤로그에 선택 지점이있는 경우 프롤로그는 사용자에게보다 성공적인 솔루션을 찾도록 요청합니다.의 경우

는 :

?- false ; true. 

이 쿼리는 분리 ;이 이후, true; 후 절을 확인하고 실패하고 절 false,보고 시작합니다. 이 성공하고 프롤로그 표시 :이 솔루션을 발견했을 때, 더 이상 선택이 없었다

true 

하는 것으로, 그래서 더 솔루션에 대한 프롬프트가 없습니다. 이제

의 두 번째 예를 살펴 보자 :

?- true ; false. 

프롤로그 첫 번째 절 true에서보고, 성공하고 사용자 말한다 : '

true 

그러나이 경우

, 그것은 여태을 다른 선택을 만들었던 ;의 분리가 있기 때문에 가능한 모든 해결책을 다 써 버렸습니다. 그래서 당신은 프롬프트에서 ;를 입력 할 때 : 당신은 더 해결책을 찾기 위해 프롤로그에게

true ; 

. Prolog가 돌아가서 분리 후 절을 검사하고 false을 만난다. 이것은 실패하고 다른 해결책은 없습니다. 따라서, 상기 솔루션에 대한 요청이 실패 프롤로그 출력 false :

true ; 
false 

true이 성공한 것을 의미한다. false은 더 이상의 솔루션을 찾지 못했고 두 번째 시도에서 실패했음을 의미합니다.

프롤로그의 행동은 적절한 절을 통해 순차적으로 솔루션을 찾고 실패 할 때까지 요청하는 것입니다. 마침내 실패하면 false이됩니다. 일부 프롤로그는 no을 출력합니다. 위의 동작은 commutativity 문제가 아닙니다.