2010-02-01 7 views
1

A * 반복에 대한 모든 후속 주를 찾아서 [(비용, 주), ...]와 같은 목록에 넣을 술어를 작성 중입니다. 바로이 시점에이 자리에 있습니다 :이 Prolog 술어가 통합되지 않는 이유는 무엇입니까?

addSuccessors(L, [], _). 
addSuccessors(L, [X|T], OrigList) :- memb(OrigList, Index, X), 
            add((X, Index), L, List2), 
            addSuccessors(List2, T, OrigList). 
addSuccessors(L, [X|[]], OrigList) :- memb(OrigList, Index, X), 
            add((X, Index), L, L2), 
            addSuccessors(L2, [], OrigList). 

Add는 목록 끝에 무언가를 추가하면 memb은 목록의 (색인) 요소를 가져옵니다. 나는 그들이 일을 알고, 내가 맨 아래 조건에 L2 볼 때 나는 매우 실망이

?- addSuccessors(X, [1500, 3670], [0, 0, 0, 1500, 3670]). 
X = [] ; 
[ (1500, 3), (3670, 4)] 
X = [] ; 
X = [_G1175] ; 
[_G1175, (1500, 3), (3670, 4)] 
X = [_G1175] ; 
X = [_G1175, _G1181] ; 
[_G1175, _G1181, (1500, 3), (3670, 4)] 
X = [_G1175, _G1181] ; 
... 

같은를하기 때문에 [(1500, 3), (3670, 4)] 목록입니다 무엇을 얻을 I 내가 전화를 한 후에 X를 원해서 내가 원하는 것을하고있는 것처럼 보인다 ... 내가 원하는 곳에서.

제발, 어떻게 해결할 수 있습니까?

답변

1

Prolog에서 프로그래밍 한 이래로 얼마간의 시간이 걸렸지 만 작성한 목록을 반환하는 목록 (즉 다른 매개 변수 추가)에서 분리해야한다고 생각합니다. [X | []]에 대한 규칙은 출력 변수를 바인드해야하며 반복되지 않아야합니다.

1

L이 실제로 초기 값을 얻는 방법을 생각해보십시오. 글쎄, 그렇지 않습니다. 당신이하려는 것은 처음부터 목록을 작성하는 것이므로, 언 바운드 변수가 아닌 빈 목록으로 시작해야합니다. 이를 해결하는 한 가지 방}은 현재 술어가 누적 기 술어로 작동 할 수있게하는 랩퍼 술어를 작성하는 것입니다.

이렇게하면 addSuccessors_acc에 이미 정의 된 절이 포함될 수 있습니다.

addSuccessors(L, X, Y) :- 
    addSuccessors_acc(L,[],X,Y). 

아이디어는 addSuccessors_acc 술어에 두 번째 인수는 각 재귀 호출로 구축되고있는 목록입니다 당신의 축적, 역할을한다는 것입니다. 그런 다음 누산기 술어의 기본 경우에 누적 기 변수를 첫 번째 인수와 통합하여 최종 목록을 전달하면됩니다. 예 :

addSuccessors_acc(L,L,_,_). 

또한 ergosys가 지적 하듯이 세 번째 절은 실제로 기본 경우가 될 수 있습니다. 목록의 마지막 요소를 다루므로 재발 할 필요가 없습니다. 추가 작업을 한 번 더 수행하면 기본 작업이 지연됩니다.

관련 문제