Prolog 解决8个难题的启发式方法

Prolog 解决8个难题的启发式方法,prolog,sliding-tile-puzzle,Prolog,Sliding Tile Puzzle,我对prolog非常陌生,在8个益智启发法方面遇到了麻烦。我不知道如何比较这两个列表(目标和开始)并计算出我的h值。我想做的是发送比较列表2列出目标和开始。它应该比较每个头部,如果它们不相等,则将1添加到总数中,否则将其自身递归调用。我不知道如何在prolog中执行if-else语句 %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 righ

我对prolog非常陌生,在8个益智启发法方面遇到了麻烦。我不知道如何比较这两个列表(目标和开始)并计算出我的h值。我想做的是发送比较列表2列出目标和开始。它应该比较每个头部,如果它们不相等,则将1添加到总数中,否则将其自身递归调用。我不知道如何在prolog中执行if-else语句

%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.

您肯定使用了错误的语法:列表使用逗号作为分隔符。比如说

goal([1,2,3,8,0,4,7,6,5]).
我认为您可以进行全局搜索和替换,一次完成所有更改。 在那之后,比较列表/3可以开始工作,但我想知道计数器
I
的实用性。看起来没用

我也看不出你在哪里换班。那么我不确定你是否走上了解决问题的正确道路


如果你感兴趣,我在几天前发布了答案。很抱歉,它与您的完全不同。

我想知道为什么Prolog从未真正流行起来。。。