prolog中的四个骑士拼图

时间:2013-01-21 13:18:36

标签: prolog puzzle

问题是在3x3棋盘中用两个白色骑士交换2个黑骑士位置,请参阅链接http://www.puzzles.com/puzzleplayground/FourKnights/FourKnights.htm 我必须让Prolog给我至少一个解决方案,我完全失去了这些步骤。

%mouvement possibilities
mouv(2,1).
mouv(-2,1).
mouv(2,-1).
mouv(-2,-1).
mouv(1,2).
mouv(-1,2).
mouv(1,-2).
mouv(-1,-2).
%conditions for valid mouvement

%not going out of the small chessboard
pos(X,Y):- X<4 ,X>0,Y<4,Y>0.

%free position
%????????

%initial positions
kgt(b,3,1).
kgt(b,3,3).
kgt(w,1,3).
kgt(w,1,1).
%mouv knight

%???

接下来我该怎么做?

1 个答案:

答案 0 :(得分:3)

一种简单(且效率低下)的方式可以应用于一个有效的移动,并迭代直到所需的位置出现。当然,我们应该避免重复已经访问过的位置,因为这会导致无限循环。

然后我们需要一种方法来表示这个搜索空间。董事会名单是显而易见的选择。

董事会可以是一个分类的分段列表,当我们看到我们是否达到目标位置时,它们很方便,并且移动后的董事会尚未被访问过。

puzzle :-
  setof(kgt(C,X,Y), kgt(C,X,Y), InitialBoard),
  apply_moves([InitialBoard], Boards),
  maplist(writeln, Boards).

apply_moves([Board|Visited], Solution) :-
  move_knight(Board, Moved),
  not_visited(Moved, Visited),
  Next = [Moved,Board|Visited],
  (  is_target(Moved)
  -> Solution = Next
  ;  apply_moves(Next, Solution)
  ).

move_knight(Board, Moved) :-
  select(kgt(C,X,Y), Board, B1),
  ...

is_target(Board) :-
  ...

not_visited(Moved, Visited) :-
  \+ memberchk(Moved, Visited).

看看你是否可以填写省略号。