죄송합니다. 이전에 죄송합니다.이 목록에 각 항목을 반복적으로 표시하고, 목록 항목을 방문한 다음 요소가 재귀에 체크인하는지 확인하려고합니다. 상태가 변경 될 목록에 없습니다. 왜 예상대로 작동하지 않는지 알아 내야합니다. 결과가 7,0,0,0, 0,4,7.4 인 것 같고 수표는이 프로그램 실행에서 동일한 4 가지 결과를 나타내는 것으로 보입니다. 무작위로 이들 중 하나를 뱉어내는 것은 행동 순서가 잘못되었습니다. 가장 어려운 조건에서 일치해야한다는 것을 알고 있기 때문에 목표는 solve (state (0,0)) 호출을 사용하여 이것을 채우는 것입니다. 그런 다음 최종 통화에서 용기에서 5를 얻어야하며 사용 된 경로를 보여주는 목록을 인쇄 한 다음 다른 해결책을 찾으십시오. 7L 주전자에 5L이있는 곳이 2 개 밖에 없기 때문입니다.Swi Prolog - 목록으로 물 주전자 프로그램을 구현
action(state(L,R), P, state(7,R)) :-
L < 4,
not(lists:member(state(7,R),P)),
print(state(7,R)).
action(state(L,R), P, state(L,4)) :-
R < 4,
not(lists:member(state(L,4),P)),
print(state(L,4)).
action(state(L,R), P, state(0,R)) :-
L > 0,
not(lists:member(state(0,R),P)),
print(state(0,R)).
action(state(L,R), P, state(L,0)) :-
R > 0,
not(lists:member(state(L,0),P)),
print(state(L,0)).
action(state(L,R), P, state(7,C)) :-
not(lists:member(state(7,C),P)),
C is L + R -7,
C > 7,
print(state(7,C)).
action(state(L,R), P, state(C,4)) :-
not(lists:member(state(C,4),P)),
C is L + R -4,
C > 4,
print(state(C,4)).
action(state(L,R), P, state(0,C)) :-
not(lists:member(state(0,C),P)),
C is L + R,
C @=< 4,
print(state(0,C)).
action(state(L,R), P, state(C,0)) :-
not(lists:member(state(C,0),P)),
C is L + R,
C @=< 7,
print(state(C,0)).
solve(X) :-
reachedgoal(X,[],A).
reachedgoal(state(5,_),L,L).
reachedgoal(State1,P,L) :-
action(State1,P,State2),
not(lists:member(State2,P)),
reachedgoal(State2,[State1|P],L).
이 코드는 위해이 목록의 경로를 기억하지 보인다 예를 다시하고 다시 처음 몇 절 주위에 –
갈 reachedgoal의 정의를 계속/1이 사실이 될 때 이것을 멈추게합니다. 해결책이나 주문이 누락 되었습니까? –
'추적'을 한 다음 조심스럽게 조사 했습니까? – lurker