抱歉,之前在此发布的新手,试图让此列表通过每个操作进行递归,保持其已访问的列表项,然后如果元素不在状态将更改为的列表中,则检查递归。我需要找出为什么这不能按预期工作,它似乎得到了结果 7,0、0,0、0,4 和 7,4,并且检查似乎在该程序的一次运行中显示了相同的 4 个结果,随机吐出其中一个,是动作顺序错误,因为我知道你必须从最困难的条件开始匹配,目标是使用调用solve(state(0,0))填充它。然后你应该在结束调用中得到 5 在水罐中,并打印出显示它使用的路径的列表,然后找到另一个解决方案,因为在 7L 水罐中有 5L 的地方只能有两个。
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).