Prolog에서받은 정확한 답장을 살펴 보겠습니다. 먼저 true
을 하나 받고 SPACE 또는 을 누르면; 당신은 결국 가지고 :
?- connected(phx,sf).
true ;
false.
그래서 당신이 완전한 답변으로
true ; false.
을 얻었다.
;
은 "또는"을 의미합니다. 따라서 Prolog는 본질적으로 다음과 같이 말합니다. 귀하의 질의
connected(phx,sf).
은
true ; false.
과 동일하므로 전체적인 의미를 이해해야합니다. 물론 그것은 다소 이상합니다.
true.
으로 충분할 것입니다.
그러나 처음의 또 다른 예를 보자 :
여기
?- connected(phx,X).
X = tuc ;
X = ccg ;
X = sf ;
false.
프롤로그의 완전한 답변은 다음과 같습니다 connected(phx,X).
는 false
가 생략 될 경우 다시 짧아 질 것 X = tuc ; X = ccg ; X = fg ; false.
같은 솔루션의 동일한 집합을 설명합니다.
그렇다면 Prolog는 왜 이것을 false
에 써야합니까? 프롤로그는 응답을 점진적으로 계산합니다. 처음에는 당신에게 X = tuc
을 보여주고 당신이 무엇을 할 것인지를 기다립니다. 어떤 의미에서는 한 번에 모든 것을 보여주지 않는 게 게으른 것입니다. 때때로, 프롤로그는 더 이상 답이있을 수 없다는 것을 알고 있지,이 경우, 직접적 점을 기록 :
?- member(X,[1,2]).
X = 1 ;
X = 2.
을 여기에 프롤로그가 말한다 : DIXI를! 나는 말했다.
하지만 가끔은, 그것은 확인되지 않습니다 :
?- member(1,[1,2]).
true ;
false.
하나가 구성원 인 것을 증명 한 후, 그렇지 않으면 더 목록을 탐색 할 것, 중지합니다.
그래서이 ; false.
을 의미합니다. 마지막 답변/해결책 이후, Prolog는 모든 것이 탐험되었다고 확신하지 못했습니다. 이는 비효율적 일 수 있으며, 뭔가 개선 될 수 있음을 나타낼 수 있습니다. 그러나 절대 절대로 이것을 프로그램에 삽입하기위한 구실로 삼으십시오. 다른 대답에서의 삭감은 완전히 malaprop입니다. 그것은 많은, 많은 오류의 원천입니다. 컷을 사용하기 전에 먼저 Prolog의 순수하고 순수한 부분을 먼저 배워야합니다.
BTW : 여기에 closure/3
을 사용하여 무한 루프를 방지하는 connected/2
의 더 나은 정의가 있습니다 (정의를 보려면 클릭하십시오).
connected(C0,C) :-
edge(C0,C1)
closure0(edge,C1,C).