我对prolog很新,并且遇到了8个益智启发式问题。我不确定如何比较两个列表(目标和开始)并找出我的h值。我要做的是发送compare_list两个列表目标并开始。它应该比较每个头部,如果它们不相等,则将总数加1,然后自动递归。我不知道怎么做如果在prolog中的其他陈述。
%T1,T2,T3 top
%M1,M2,M3 middle
%B1,B2,B3 bottom
goal([1/2/3/8/0/4/7/6/5]).
%Top row movements
%shift right
shift([T1/0/T3/M1/M2/M3/B1/B2/B3],
[0/T1/T3/M1/M2/M3/B1/B2/B3]).
shift([T1/T2/0/M1/M2/M3/B1/B2/B3],
[T1/0/T2/M1/M2/M3/B1/B2/B3]).
%shift left
shift([T1/T2/T3/M1/M2/M3/B1/B2/B3],
[T1/T2/T3/M1/M2/M3/B1/B2/B3]).
shift([T1/T2/T3/M1/M2/M3/B1/B2/B3],
[T1/T2/T3/M1/M2/M3/B1/B2/B3]).
%shift down
shift([T1/T2/T3/0/M2/M3/B1/B2/B3],
[0/T2/T3/T1/M2/M3/B1/B2/B3]).
shift([T1/T2/T3/M1/0/M3/B1/B2/B3],
[T1/0/T3/M1/T2/M3/B1/B2/B3]).
shift([T1/T2/T3/M1/M2/0/B1/B2/B3],
[T1/T2/0/M1/M2/T3/B1/B2/B3]).
%Middle row movements
%shift right
shift([T1/T2/T3/M1/0/M3/B1/B2/B3],
[T1/T2/T3/0/M1/M3/B1/B2/B3]).
shift([T1/T2/T3/M1/M2/0/B1/B2/B3],
[T1/T2/T3/M1/0/M2/B1/B2/B3]).
%shift left
shift([T1/T2/T3/0/M2/M3/B1/B2/B3],
[T1/T2/T3/M2/0/M3/B1/B2/B3]).
shift([T1/T2/T3/M1/0/M3/B1/B2/B3],
[T1/T2/T3/M1/M3/0/B1/B2/B3]).
%shift up
shift([0/T2/T3/M1/M2/M3/B1/B2/B3],
[M1/T2/T3/0/M2/M3/B1/B2/B3]).
shift([T1/0/T3/M1/M2/M3/B1/B2/B3],
[T1/M2/T3/M1/0/M3/B1/B2/B3]).
shift([T1/T2/0/M1/M2/M3/B1/B2/B3],
[T1/T2/M3/M1/M2/0/B1/B2/B3]).
%shift down
shift([T1/T2/T3/M1/M2/M3/0/B2/B3],
[T1/T2/T3/0/M2/M3/M1/B2/B3]).
shift([T1/T2/T3/M1/M2/M3/B1/0/B3],
[T1/T2/T3/M1/0/M3/B1/M2/B3]).
shift([T1/T2/T3/M1/M2/M3/B1/B2/0],
[T1/T2/T3/M1/M2/0/B1/B2/M3]).
%bottom row movements
%shift right
shift([T1/T2/T3/M1/M2/M3/B1/0/B3],
[T1/T2/T3/M1/M2/M3/0/B1/B3]).
shift([T1/T2/T3/M1/M2/M3/B1/B2/0],
[T1/T2/T3/M1/M2/M3/B1/0/B2]).
%shift left
shift([T1/T2/T3/M1/M2/M3/0/B2/B3],
[T1/T2/T3/M1/M2/M3/B2/0/B3]).
shift([T1/T2/T3/M1/M2/M3/B1/0/B3],
[T1/T2/T3/M1/M2/M3/B1/B3/0]).
%shift up
shift([T1/T2/T3/0/M2/M3/B1/B2/B3],
[T1/T2/T3/B1/M2/M3/0/B2/B3]).
shift([T1/T2/T3/M1/0/M3/B1/B2/B3],
[T1/T2/T3/M1/B2/M3/B1/0/B3]).
shift([T1/T2/T3/M1/M2/0/B1/B2/B3],
[T1/T2/T3/M1/M2/B3/B1/B2/0]).
h(State):-
compare_list(State, goal, 1).
compare_list([H1 | T1], [H2 | T2], I) :-
H1 \= H2,
compare_list(T1, T2, I1),
I is I1 +1.
答案 0 :(得分:0)
肯定您使用了错误的语法:list使用逗号作为分隔符。例如
goal([1,2,3,8,0,4,7,6,5]).
我认为您可以进行全局搜索和替换,以便立即执行所有更改。
之后compare_list / 3可以开始工作,但我想知道计数器I
的效用。这似乎毫无用处。
我无法发现你在哪里应用轮班。然后我不确定你是否正在寻找解决方案。
如果您有兴趣,我几天前发布this回答。对不起,这与你的完全不同。