/* Simple robot planner in Picat. From http://www.stanford.edu/class/cs227/Lectures/lec16.pdf‎ page 11ff This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import gps_utils. import ordset. main => go. go => Init = $[in_room(robot,room1),in_room(box1,room2), box(box1), connects(door1,room1,room2), connects(door2,room2,room3), connects(door1,room2,room1), connects(door2,room3,room2)], Final = $[in_room(box1,room1)], cl_facts($[final2(Final)],$[final2(-)]), gps_best_plan(Init), nl. final(L) => final2(Final2), pre(L,Final2), writeln(final=L). % % push_thru(Object,Door,Room1,Room2) % action(From,To,Move,Cost), From.pre($[in_room(Robot,Room1),box(Box),in_room(Box,Room1),connects(Door,Room1,Room2)]) ?=> Box != Robot, To = From.del($[in_room(Robot,Room1),in_room(Box,Room1)]).add($[in_room(Robot,Room2),in_room(Box,Room2)]), Move=$[push_thru(push,Box,thru,Door,from,Room1,to,Room2)], Cost = 1. % % go_thru(Door,Room1,Room2) % action(From,To,Move,Cost), From.pre($[in_room(robot,Room1),connects(Door,Room1,Room2)]) ?=> To = From.del($[in_room(robot,Room1)]).add($[in_room(robot,Room2)]), Move=$[go_thru(go,thru,Door,from,Room1,to,Room2)], Cost = 1.