/* Monkey and bananas problem in Picat. Problem from Chapter 4 of Peter Norvig's Paradigms of Artificial Intelligence Programming (PAIP) This solves the Monkey and Banana problem using the GPS like module http://www.hakank.org/picat/gps_utils.pi This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ % import planner. import gps_utils. main => go. go => Init = $[[at,door], [on,floor], [has,ball], [hungry], [chair,at,door]], Final = $[[not,hungry]], cl_facts($[final2(Final)]), gps_best_plan(Init), nl. % % ensure that all goals in final2/1 are in the list L. % final(L) => final2(Final2), pre(L,Final2), writeln(final=L). table action(From,To,Move,Cost) ?=> pre(From, $[[chair,at,middle,room], [at,middle,room], [on,floor]]), Move = [climb,on,chair], To = From.del([$[at,middle,room], $[on,floor]]).add([$[at,bananas], $[on,chair]]), Cost = 1. action(From,To,Move,Cost) ?=> pre(From, $[[chair,at,door], [at,door]]), Move = [push,chair,from,door,to,middle,room], To = From.add( $[[chair,at,middle,room], [at,middle,room]]).del( $[[chair,at,door], [at,door]]), Cost = 1. action(From,To,Move,Cost) ?=> pre(From, $[[at,door], [on,floor]]), Move = [walk,from,door,to,middle,room], To = From.add( $[[at,middle,room]]).del( $[[at,door]]), Cost = 1. action(From,To,Move,Cost) ?=> pre(From, $[[at,bananas], [empty,handed]]), Move = [grasp,bananas], To = From.add( $[[has,bananas]]).del($[[empty,handed]]), Cost = 1. action(From,To,Move,Cost) ?=> pre(From, $[[has,ball]]), Move = [drop,ball], To = From.add( $[[empty,handed]]).del($[[has,ball]]), Cost = 1. action(From,To,Move,Cost) => pre(From, $[[has,bananas]]), Move = [eat,bananas], To = From.add( $[[empty,handed], [not,hungry]]).del( $[[has,bananas], [hungry]]), Cost = 1.