/* Flat tire problem (planning) in Picat. Inspired by http://www.idi.ntnu.no/emner/tdt4136/PRO/shoeson.txt Attributed to AIMA, Fig 10.13 This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ % import util. import gps_utils. main => go. /* start remove(spare,trunk) remove(flat,axle) puton(spare,axle) finish */ go => Init = $[at(flat,axle),at(spare,trunk)], % Final = $[at(spare,axle)], Final = $[finish], cl_facts($[final2(Final)]), gps_plan(Init), nl. final(L) => final2(Final2), pre(L,Final2), writeln(final=L). action(From,To,Move,Cost) ?=> pre(From,$[at(spare,axle)]), Move = $[finish], To = From.add($[finish]), Cost = 1. action(From,To,Move,Cost) ?=> pre(From,$[at(spare,trunk)]), Move = $[remove(spare,trunk)], To = From.del($[at(spare,trunk)]).add($[at(spare,ground)]), Cost = 1. action(From,To,Move,Cost) ?=> pre(From,$[at(flat,axle)]), Move = $[remove(flat,axle)], To = From.del($[at(flat,axle)]).add($[at(flat,ground)]), Cost = 1. action(From,To,Move,Cost) ?=> pre(From,$[at(spare,ground)]), pre_neg(From,$[at(flat,axle)]), % negative precondition Move = $[puton(spare,axle)], To = From.del($[at(spare,ground)]).add($[at(spare,axle)]), Cost = 1. action(From,To,Move,Cost) ?=> Move = $[leaveovernight], To = From.del($[at(spare,ground),at(spare,axle), at(spare,trunk),at(flat,ground), at(flat,axle)]), Cost = 1.