2013-03-02 2 views
0

는 기본적으로 나는 현재 상태에서 모든 '다음 가능한 상태'를 찾을 수있는 조건을 정의한 bagof 그러나, 내장 bagof 술어하는 모든 국가의 목록을 통합하는 데 사용하는, 그러나 나는 한 사용 I 명령 창에서 호출하십시오. '전역 스택'에서 오류가 발생하여 추적을 시도 했으므로 다음 상태를 재귀 적으로 반복적으로 호출하므로 가능한 모든 '해결 방법'을 얻을 수 없습니다 무한한 수의 솔루션이 있다면!프롤로그 :

내가 요소의 특정 번호에 옵션을 가능한 현재 상태의 목록입니다 '제한'생각하지 않기 때문에 글로벌 스택 부족 오류없이 bagof 호출하는 어떤 다른 방법이있다?

죄송합니다.

답변

0

검색 트리의 각 지점은 어느 시점에서 종료해야합니다 그렇지 않으면 당신은 참으로이 오류가 발생합니다. 무한 루프가있는 곳을보기 위해 코드를 보는 것이 유용 할 것입니다. 아마도 어딘가에서 재귀 적 구조를 만들었을 것입니다. 예를 들어 bagof 여기에 같은 결과를 얻을 것입니다 : 당신이 1로 시작한다면
nextState(State1,State2):-
    State2 is State1+1.
nextState(State1,State3):-
    nextState(State1,State2),
    nextState(State2,State3).
는 2, 3, 4, 5, 6 ... inifinite 전까지 다음 스택 오버플로 찾을 것입니다!

1

그래프에 사이클이 있습니다. 그래서 당신은 임의의 횟수만큼 앞뒤로 움직입니다.

그것은 로컬 저장소에 내 집에서 모든 경로를 묻는 것과 같습니다. 마지막 반 블록을 가기 전에 임의의 횟수로 내 블록을 둘러 볼 수 있습니다. 그래서 그 숫자는 무한합니다.

이 해결책은 bagof를 잊는 것입니다. 재귀를 사용하지만, 내려갈 때 함께 있었던 장소의 목록을 유지하고 돌아 가지 마십시오.

1

난 당신이 call_with_depth_limit/3을 사용한다고 생각하지만, 그것은 당신의 상태 시스템이 어떻게 구성되어 있는지 모른 채 세부 사항에 어떤 힌트 어렵다. findall은 (다음 - : 당신은 루프 범인해야 재귀와 state(Curr, Next)을 말해봐, 당신은 (문헌 [Curr, ListNext) '가능한 상태 옆에'

처럼 뭔가 '다음'의 목록을 얻을 수 , call_with_depth_limit (state (Curr, Next), 2, _), ListNext).

findall은 변수 사용량을 정량화하는 데 정말로 관심이 없을 때 사용할 bagof보다 간단합니다.