2012-04-02 4 views

답변

2

프롤로그 실행은 모두 선택 사항에 관한 것입니다. 여기서 선택 점은 각 재귀 단계에서 bit/1 술어로 남습니다. Prolog에 다른 솔루션을 제공 할 것을 요청하면 가장 어린 선택 지점으로 돌아갑니다. 여기에서 첫 번째 절인 bit/1을 건너 뛰고 H0에 바인딩하는 대신 두 번째 절을 통과하여 H1에 바인딩합니다. 일단 두 절이 모두 선택되면 Prolog는 이전 선택 지점 등으로 돌아갑니다. 궁극적으로 모든 선택 지점이 모두 소모되어 프로그램이 false.을 반환 할 때까지 계속됩니다.

당신은 trace/0 술어이 직접 시도 할 수 있습니다 : 모든 재귀 부분이 지금은 일부에 숨겨진이 정의에서

gen(N, Xs) :- 
    length(Xs, N), 
    maplist(between(0,1), Xs). 

:

?- trace, gen(3, Result). 
+0

예. 감사합니다. –

2

내가 당신에게 더 정직하고 첫 번째 정의를 제공 할 수 있음 내장 기능. 첫 번째 목표는 Xs이 길이 N의 목록임을 보장합니다.

 
?- gen(4, Xs). 
Xs = [0,0,0,0] ; 
Xs = [0,0,0,1] ; 
Xs = [0,0,1,0] ; 
Xs = [0,0,1,1] ; 
Xs = [0,1,0,0] ; 
Xs = [0,1,0,1] ; 
Xs = [0,1,1,0] ; ... 
0

이 술어가 이진 (주문) 모든 숫자를 생성하고 다음 목표는 각각의 요소는 당신이 답변을 보면, 당신이 솔루션을 열거 어떤 순서로 알게 될 것이다 0과 1입니다 보장 시스템 잘 이해하면 프롤로그 백 트랙킹을 이해해야합니다. 이해할 수있는 대체 트리를 그려야합니다.