첫 번째 질문은 왜 프로그램이 충돌했다. 어떤 종류의 프롤로그 시스템을 사용하고 있는지 잘 모르겠지만 많은 시스템은 프롤로그 내에서 처리 할 수있는 깨끗한 "자원 오류"를 생성합니다.
실제 문제는 프로그램이 쿼리 likes(john, X)
에 대해 종료되지 않는다는 것입니다. 그것은 당신에게 예상되는 답변을주고 그때 만 반복합니다.
?- likes(john,X).
X = book ;
X = mary ;
X = tom ;
ERROR: Out of local stack
당신은 그 문제를 너무 빨리 발견 한 것을 매우 행운아하게 생각합니다. 더 많은 해답을 상상해보십시오. 그리고 모든 해답을 거치려면 인내심을 가지고 있다는 것이 분명하지 않았을 것입니다. 그러나 바로 가기가 있습니다. 대신 묻기 :
?- likes(john, X), false.
이 false
목표는 사실이 아닙니다. 그래서 그것은 쉽게 모든 대답을 방지합니다. 기껏해야 false
이 끝나는 쿼리가 종료됩니다. 현재로서는 그렇지 않습니다. 다음 failure-slice (자세한 내용은 찾아 다른 답변)을 고려할 때이 아닌 종료에 대한 이유는 최고의 볼 수 있습니다 :
?- likes(john,X), false.
likes(tom,jerry) :- false.
likes(mary,john) :- false.
likes(mary,mary) :- false.
likes(tom,mouse) :- false.
likes(jerry,jerry) :- false.
likes(jerry,cheese) :- false.
likes(mary,fruit) :- false.
likes(john,book) :- false.
likes(mary,book) :- false.
likes(tom,john) :- false.
likes(john,X) :-
likes(X,john), false,
X\=john.
는 그래서 스택 오버 플로우에 대한 책임이 프로그램의 아주 작은 부분이다. 문제를 해결하려면 무언가을 사용해야합니다. 여기에 하나입니다 규칙이 지금 읽고되도록 목표 dif(X, john)
을 추가 경우, SICStus, SWI, YAP, B :
likes(john,X) :-
dif(X, john),
likes(X,john).
dif/2
이 같은 많은 프롤로그 시스템에서 사용할 수 있습니다.
호기심에서 X \ = john이 좋아요 앞에 오면 어떻게됩니까? – pedrofurla
이상하게도, 몸의 앞에 놓으면 프롤로그가 돌아올 것입니다 : 'X = book; 거짓 .' '책'바로 뒤에 멈추는 이유를 모르겠습니다. –