/* 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 planner. main => go. go => nolog, initial_state(Init), time(best_plan(Init,L)), write(L), nl, writeln(len=L.length), nl. go2 => nolog, initial_state(Init), time(best_plan_nondet(Init,L)), write(L), nl, writeln(len=L.length), fail, 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]. final(Goal) => Goal=[1,2,3,4,5,0]. % Up <-> Down action(From,To,Move,Cost) ?=> Cost=1, From=[0,B,C, X,E,F],Move=$up(X),To=[X,B,C, 0,E,F]. action(From,To,Move,Cost) ?=> Cost=1, From=[A,0,C, D,X,F],Move=$up(X),To=[A,X,C, D,0,F]. action(From, To, Move,Cost) ?=> Cost=1, From=[A,B,0, D,E,X],Move=$up(X),To=[A,B,X, D,E,0]. action(From,To,Move,Cost) ?=> % From=S1,Move=$down(X),To=S2, % action(S2,$up(X),S1). Cost=1, Move=$down(X), action(To, From, $up(X),Cost). % Left <-> Right action(From,To,Move,Cost) ?=> Cost=1, From=[0,X,C, D,E,F],Move=$left(X),To=[X,0,C, D,E,F]. action(From,To,Move,Cost) ?=> Cost=1, From=[A,0,X, D,E,F],Move=$left(X),To=[A,X,0, D,E,F]. action(From,To,Move,Cost) ?=> Cost=1, From=[A,B,C, 0,X,F],Move=$left(X),To=[A,B,C, X,0,F]. action(From,To,Move,Cost) ?=> Cost=1, From=[A,B,C, D,0,X],Move=$left(X),To=[A,B,C, D,X,0]. action(From,To,Move,Cost) => % From=S1,Move=$right(X),To=S2, % action(S2,$left(X),S1). Cost=1, Move=$right(X), action(To,From,$left(X),Cost).