我想解决以下问题:

拼图由三个黑色钉子,三个白色钉子和中间的空白空间组成(“BBBOWWW”) .

该谜题有两个相关成本的移动:(a)一个挂钩可能会移动到相邻的空位置(成本为1) . (b)钉子可以跳过一个或两个其他钉子进入空位 . 这的成本等于跳过的钉子的数量 .

目标是将所有黑钉的所有白钉都放在左边 . 毛坯的位置并不重要 .

我被允许使用我选择的任何编程语言,并希望使用Prolog来解决这个问题以获得经验 . 我已经能够实现这个问题的简化版本,找到最短的路径,但我正在努力与A *和启发式实现 .

我附上了以下Prolog代码和我正在使用的查询 .

我的问题是如何在我的代码中实现A *算法?我无法找到有用的例子,并希望得到任何指导/提示 .

谢谢 .

查询:

length(Path, _),
initial_state(Initial),
phrase(moves(Initial), Path),
maplist(writeln, Path).

程序:

% Initial state
initial_state([b,b,b,o,w,w,w]).

% 7 possible goal states
goalState([w,w,w,o,b,b,b]).
goalState([w,w,w,b,o,b,b]).
goalState([w,w,w,b,b,b,o]).
goalState([w,w,o,w,b,b,b]).
goalState([w,o,w,w,b,b,b]).
goalState([o,w,w,w,b,b,b]).

% All possible moves
move([E|Es]) --> [E], move(Es).
move([b,o|Solution]) --> [o,b], list(Solution). 
move([o,w|Solution]) --> [w,o], list(Solution).
move([o,X,w|Solution]) --> [w,X,o], list(Solution).
move([b,X,o|Solution]) --> [o,X,b], list(Solution).
move([o,X,X,w|Solution]) --> [w,X,X,o], list(Solution).
move([b,X,X,o|Solution]) --> [o,X,X,b], list(Solution).
move([w,X,X,o|Solution]) --> [o,X,X,w], list(Solution).
move([o,X,X,b|Solution]) --> [b,X,X,o], list(Solution).

list([]) --> [].
list([L|Solution]) --> [L], list(Solution).

moves(S)  --> [S], {goalState(S)}.
moves(S0) --> [S0], {phrase(move(S0),S)}, moves(S).

我的初始解决方案基于以下内容:Prolog program that solves the peg jump puzzle