/* 2x3-puzzle in Picat. This is a stripped down 8-puzzle, inspired by the Prolog code in Thinking as Computation. This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ % import util. % import cp. import bplan. main => go. go => initial_state(Init), time(bplan(Init,L)), % time(plan2(Init,L,Cost)), write(L), nl, writeln(len=L.length), % writeln(cost=Cost), nl. % This is a 2x3 version of the 15 puzzle. % Initial state: %%%%%%%%% % 1 5 % % 4 3 2 % %%%%%%%%% initial_state(Init) => Init=[0,1,5,4,3,2]. goal_state(Goal) => Goal=[1,2,3,4,5,0]. % Up <-> Down legal_move(From,Move,To) ?=> From=[0,B,C, X,E,F],Move=$up(X),To=[X,B,C, 0,E,F]. legal_move(From,Move,To) ?=> From=[A,0,C, D,X,F],Move=$up(X),To=[A,X,C, D,0,F]. legal_move(From, Move, To) ?=> From=[A,B,0, D,E,X],Move=$up(X),To=[A,B,X, D,E,0]. legal_move(From,Move,To) ?=> % From=S1,Move=$down(X),To=S2, % legal_move(S2,$up(X),S1). Move=$down(X), legal_move(To, $up(X), From). % Left <-> Right legal_move(From,Move,To) ?=> From=[0,X,C, D,E,F],Move=$left(X),To=[X,0,C, D,E,F]. legal_move(From,Move,To) ?=> From=[A,0,X, D,E,F],Move=$left(X),To=[A,X,0, D,E,F]. legal_move(From,Move,To) ?=> From=[A,B,C, 0,X,F],Move=$left(X),To=[A,B,C, X,0,F]. legal_move(From,Move,To) ?=> From=[A,B,C, D,0,X],Move=$left(X),To=[A,B,C, D,X,0]. legal_move(From,Move,To) => % From=S1,Move=$right(X),To=S2, % legal_move(S2,$left(X),S1). Move=$right(X), legal_move(To,$left(X),From).