2010-12-08 2 views
0

:프롤로그 코드 예 : 내 클래스에 대한 오래된 마지막에서 통일

mystery(1, 1). 
mystery(N, F) :- 
    N1 is N-1, 
    mystery(N1,F1), 
    F is F1*N. 

질문 1 : 여기

는 일부 프롤로그 코드

mystery(3, P). 

에서 P와 통합되어 어떤 가치 질문 2 : Prolog가 수수께끼를 생성하고 답변 한 후에 세미콜론을 누르면 인터프리터는 결국 "ERROR : Out of local stack"을보고합니다. 왜 이런 일이 생기고 오류를 피하기 위해 신비를 수정할 수 있습니까? 나는 모든 답을 얻기 위해서 세미콜론을 누르면 내가 지역 스택 오류를 얻을, :


질문 1 : 나는

P = 6 ? 

질문 2를 얻을. 이 코드가 수행하려고하는 작업이나 해결 방법을 모르므로 로컬 스택을 벗어나지 않습니다. 어떤 아이디어?

+0

"질문 1"에 대한 질문이 있으십니까? 대답이 6 인 이유를 이해합니까? – aschepler

+0

나는 대답이 6 인 이유를 알았지 만, 어떻게 거기에 도달했는지 각 단계를 알지 못합니다. –

답변

2

스택 오류의 아웃, 당신은 mystery(0, F1)를 호출 다음 절을 명중 아마 당신이 아래로 mystery(1, 1)로 확인 mystery(1, F1)로 돌아가 더 많은 솔루션을 요구하는 경우, 때문이다. 이 시점에서 솔루션을 찾으려고하지만 일치하는 유일한 절은 mystery(-1, F1)을 호출하고 mystery(-2, F1) 등을 호출합니다. 이것은 보류중인 각 매치가 스택 공간을 차지하기 때문에 첫 번째 숫자가 1로 랩핑되거나 스택 오버 플로우가 발생할 때까지 호출되는 일치가 있음을 의미합니다.

0

@David Thornley는 더 많은 답변을 검색하는 것이 스택을 망칠 이유에 대해 이미 설명했습니다. 당신은 절단 연산자를 사용하여 문제를 해결할 수 있습니다 : 첫 번째 인수가 1 인 경우 두 번째 규칙이 적용되지 않을 수 있도록

mystery(1, F) :- !, F is 1. 
mystery(N, F) :- 
    N1 is N-1, 
    mystery(N1,F1), 
    F is F1*N. 

컷이 여기 있습니다.