0

私はプロローグが初めてで、8パズルのヒューリスティックに問題があります。2 つのリスト (ゴールとスタート) を比較して、自分の h 値を計算する方法がわかりません。私がやろうとしているのは、compare_list の 2 つのリストに目標を送信して開始することです。各ヘッドを比較し、等しくない場合は合計に1を追加し、それ以外の場合は自己再帰的に呼び出します。プロローグの 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.
4

1 に答える 1

0

確かに間違った構文を使用しています: リストはコンマを区切り文字として使用します。例えば

goal([1,2,3,8,0,4,7,6,5]).

すべての変更を一度に行うために、グローバル検索と置換を実行できると思います。その後、compare_list/3 は機能し始めましたが、 counter の有用性について疑問がありますI。駄目そうです。

そして、シフトを適用する場所を見つけることができません。それでは、解決に向けて正しい道を進んでいるかどうかわかりません。

興味がある場合は、数日前にこの回答を投稿しました。すみません、あなたとは全然違います。

于 2013-02-19T03:57:11.377 に答える