:- prompt(_, '').
:- use_module(library(readutil)).
% monkey grasps banana
act(state(middle, onbox, middle, hasnot),
grasp,
state(middle, onbox, middle, has) ).
% monkey climbs box
act(state(P, onfloor, P, H),
climb,
state(P, onbox, P, H) ).
% monkey pushes box from P1 to P2
act(state(P1, onfloor, P1, H),
push(P1, P2),
state(P2, onfloor, P2, H) ).
% monkey moves from P1 to P2
act(state(P1, onfloor, B, H),
walk(P1, P2),
state(P2, onfloor, B, H) ).
% define (recursively) how the monkey can get the banana
canget(state(_, _, _, has), []).
canget(State1, [State1Action | State2Plan]) :-
act(State1, State1Action, State2),
canget(State2, State2Plan).
% define the initial starting condition
go(Plan) :- canget(state(atdoor, onfloor, atwindow, hasnot), Plan), !.
main:-
go(Plan),
:- main.
Oi0gc2V0X3Byb2xvZ19mbGFnKHZlcmJvc2Usc2lsZW50KS4KOi0gcHJvbXB0KF8sICcnKS4KOi0gdXNlX21vZHVsZShsaWJyYXJ5KHJlYWR1dGlsKSkuCgoKJSBtb25rZXkgZ3Jhc3BzIGJhbmFuYQphY3Qoc3RhdGUobWlkZGxlLCBvbmJveCwgbWlkZGxlLCBoYXNub3QpLAogICAgZ3Jhc3AsCiAgICBzdGF0ZShtaWRkbGUsIG9uYm94LCBtaWRkbGUsIGhhcykgKS4KCiUgbW9ua2V5IGNsaW1icyBib3gKYWN0KHN0YXRlKFAsIG9uZmxvb3IsIFAsIEgpLAogICAgY2xpbWIsCiAgICBzdGF0ZShQLCBvbmJveCwgICBQLCBIKSApLgoKJSBtb25rZXkgcHVzaGVzIGJveCBmcm9tIFAxIHRvIFAyCmFjdChzdGF0ZShQMSwgb25mbG9vciwgUDEsIEgpLAogICAgcHVzaChQMSwgUDIpLAogICAgc3RhdGUoUDIsIG9uZmxvb3IsIFAyLCBIKSApLgoKJSBtb25rZXkgbW92ZXMgZnJvbSBQMSB0byBQMgphY3Qoc3RhdGUoUDEsIG9uZmxvb3IsIEIsIEgpLAogICAgd2FsayhQMSwgUDIpLAogICAgc3RhdGUoUDIsIG9uZmxvb3IsIEIsIEgpICkuCgolIGRlZmluZSAocmVjdXJzaXZlbHkpIGhvdyB0aGUgbW9ua2V5IGNhbiBnZXQgdGhlIGJhbmFuYQpjYW5nZXQoc3RhdGUoXywgXywgXywgaGFzKSwgW10pLgpjYW5nZXQoU3RhdGUxLCBbU3RhdGUxQWN0aW9uIHwgU3RhdGUyUGxhbl0pIDotCiAgICBhY3QoU3RhdGUxLCBTdGF0ZTFBY3Rpb24sIFN0YXRlMiksCiAgICBjYW5nZXQoU3RhdGUyLCBTdGF0ZTJQbGFuKS4KCiUgZGVmaW5lIHRoZSBpbml0aWFsIHN0YXJ0aW5nIGNvbmRpdGlvbgpnbyhQbGFuKSA6LSBjYW5nZXQoc3RhdGUoYXRkb29yLCBvbmZsb29yLCBhdHdpbmRvdywgaGFzbm90KSwgUGxhbiksICEuCgoKCm1haW46LQoJZ28oUGxhbiksCgl3cml0ZShQbGFuKSwKCWhhbHQuCgo6LSBtYWluLgo=