/* Farmer's planning problem in Picat. This is an adjusted version of the Farmer's problem example at http://picat-lang.org/download/exs.pi 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.reverse()), nl, writeln(len=L.length), % writeln(cost=Cost), nl. initial_state(Init) => Init=[s,s,s,s]. goal_state(Goal) => Goal=[n,n,n,n]. table legal_move(From, Move, To) ?=> From= [F,F,G,C], Move=farmer_wolf, To = [F1,F1,G,C], safe(To), opposite(F,F1). legal_move(From,Move,To) ?=> From=[F,W,F,C], Move=farmer_goat, To=[F1,W,F1,C], safe(To), opposite(F,F1). legal_move(From,Move,To) ?=> From=[F,W,G,F], Move=farmer_cabbage, To=[F1,W,G,F1], safe(To), opposite(F,F1). legal_move(From,Move,To) => From=[F,W,G,C], Move=farmer_alone, To=[F1,W,G,C], safe(To), opposite(F,F1). index (+,-) (-,+) opposite(n,s). opposite(s,n). safe(Goal) => not unsafe(Goal). unsafe([F,W,G,_C]),W==G,F!==W => true. unsafe([F,_W,G,C]),G==C,F!==G => true.