2014-12-02 3 views
2

나는 경로가 문제가 그 다음 거짓, true를 돌려입니다 프롤로그 컴파일러 반환 오류

/*city rules*/ 

edge(phx, tuc). 
edge(tuc, ccg). 
edge(ccg, sf). 

connected(C1, C2) :- 
    edge(C1, C2). 
connected(C1, C2) :- 
    edge(C1, X), 
    connected(X, C2). 

B.

지점까지 존재 여부를 확인하기 위해이 가상의 프로그램이 있습니다. 거짓은 어디에서 왔습니까?

답변

2

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).