% % changes made to GOLOG to avoid unnecessary backtracking points do(?(P),S,S) :- holds(P,S), !. do(E1#E2,S,S1) :- do(E1,S,S1), !; do(E2,S,S1). % % Mailbot in GOLOG :- dynamic(request/2). create_requests(Max,Max) :- !. create_requests(N,Max) :- N1 is N+1, create_request(N1,0,Max), create_requests(N1,Max). create_request(_,Max,Max) :- !. create_request(N,M,Max) :- M1 is M+1, ( M1 \= N -> assert(request(N,M1)) ; true ), create_request(N,M1,Max). /* Primitive Control Actions */ primitive_action(go(_)). primitive_action(pickup(_,_)). primitive_action(deliver(_)). /* Procedures */ proc(main,[deliver(_),main] # [pickup(_,_),main] # [continue_delivery,main] # []). proc(continue_delivery, [[?(empty(_)),?(request(R,_))] # ?(carries(_,R)), ?(at(R1)), [?(less(R1,R)),go(up)] # go(down) ]). /* Preconditions for Primitive Actions */ poss(pickup(B,R), S) :- holds(empty(B), S), holds(at(R1), S), holds(request(R1,R), S). poss(deliver(B), S) :- holds(at(R), S), holds(carries(B,R), S). poss(go(_), _). /* Successor State Axioms for Primitive Actions */ holds(at(R),do(A,S)) :- A = go(up), holds(at(R1),S), R is R1+1 ; A = go(down), holds(at(R1),S), R is R1-1 ; \+ A = go(_), holds(at(R),S). holds(request(R,R1),do(A,S)) :- holds(request(R,R1),S), ( A = pickup(_,R1) -> holds(at(R2),S), R2 \= R ; true ). holds(empty(B),do(A,S)) :- A = deliver(B), ! ; holds(empty(B),S), \+ A = pickup(B,_). holds(carries(B,R),do(A,S)) :- A = pickup(B,R) ; holds(carries(B,R),S), \+ A = deliver(B). /* Initial Situation */ holds(request(O,D),s0) :- request(O,D). holds(at(1),s0). holds(empty(bag1),s0). holds(empty(bag2),s0). holds(empty(bag3),s0). /* Defined Fluents */ holds(less(R1,R2),_) :- R1