Prolog 序言中的四骑士之谜

Prolog 序言中的四骑士之谜,prolog,puzzle,Prolog,Puzzle,问题是在3x3棋盘上用两个白骑士交换两个黑骑士的位置,请参见链接 我必须让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 sma

问题是在3x3棋盘上用两个白骑士交换两个黑骑士的位置,请参见链接 我必须让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

%???
%movement可能性
mouv(2,1)。
mouv(-2,1)。
mouv(2,-1)。
mouv(-2,-1)。
mouv(1,2)。
mouv(-1,2)。
mouv(1,-2)。
mouv(-1,-2)。
%有效移动的条件
%不出小棋盘
位置(X,Y):-X0,Y0。
%自由位置
%????????
%初始位置
克格特(b,3,1)。
克格特(b,3,3)。
kgt(w,1,3)。
kgt(w,1,1)。
%莫夫骑士
%???
下一步该怎么办?

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

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

一个棋盘可以是一个经过排序的棋子列表,当它用来查看我们是否到达目标位置时很方便,而且移动后的棋盘还没有被访问过

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).
看看你能不能填上省略号