%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % A GOLOG INTERPRETER IN SWI-PROLOG % % % (Adapted from the ECLIPSE version by Sebastian Sardina) % % % March 2000 % % This software was developed by the Cognitive Robotics Group under the % direction of Hector Levesque and Ray Reiter. % % Do not distribute without permission. % Include this notice in any copy made. % % % Copyright (c) 1992-1997 by The University of Toronto, % Toronto, Ontario, Canada. % % All Rights Reserved % % Permission to use, copy, and modify, this software and its % documentation for research purpose is hereby granted without fee, % provided that the above copyright notice appears in all copies and % that both the copyright notice and this permission notice appear in % supporting documentation, and that the name of The University of % Toronto not be used in advertising or publicity pertaining to % distribution of the software without specific, written prior % permission. The University of Toronto makes no representations about % the suitability of this software for any purpose. It is provided "as % is" without express or implied warranty. % % THE UNIVERSITY OF TORONTO DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS % SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND % FITNESS, IN NO EVENT SHALL THE UNIVERSITY OF TORONTO BE LIABLE FOR ANY % SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER % RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF % CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN % CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% :- style_check(-discontiguous). :- set_prolog_flag(optimise, true). :- dynamic proc/2, restoreSitArg/3. /* Compiler directives. Be sure */ :- multifile proc/2. :- op(800, xfy, [&]). /* Conjunction */ :- op(850, xfy, [v]). /* Disjunction */ :- op(870, xfy, [=>]). /* Implication */ :- op(880,xfy, [<=>]). /* Equivalence */ :- op(950, xfy, [:]). /* Action sequence */ :- op(960, xfy, [#]). /* Nondeterministic action choice */ do(E1 : E2,S,S1) :- do(E1,S,S2), do(E2,S2,S1). do(?(P),S,S) :- holds(P,S). do(E1 # E2,S,S1) :- do(E1,S,S1) ; do(E2,S,S1). do(if(P,E1,E2),S,S1) :- do((?(P) : E1) # (?(-P) : E2),S,S1). do(star(E),S,S1) :- S1 = S ; do(E : star(E),S,S1). do(while(P,E),S,S1):- do(star(?(P) : E) : ?(-P),S,S1). do(pi(V,E),S,S1) :- sub(V,_,E,E1), do(E1,S,S1). do(E,S,S1) :- proc(E,E1), do(E1,S,S1). do(E,S,do(E,S)) :- primitive_action(E), poss(E,S). /* sub(Name,New,Term1,Term2): Term2 is Term1 with Name replaced by New. */ sub(_,_,T1,T2) :- var(T1), T2 = T1. sub(X1,X2,T1,T2) :- \+ var(T1), T1 = X1, T2 = X2. sub(X1,X2,T1,T2) :- \+ T1 = X1, T1 =..[F|L1], sub_list(X1,X2,L1,L2), T2 =..[F|L2]. sub_list(_,_,[],[]). sub_list(X1,X2,[T1|L1],[T2|L2]) :- sub(X1,X2,T1,T2), sub_list(X1,X2,L1,L2). /* The holds predicate implements the revised Lloyd-Topor transformations on test conditions. */ holds(P & Q,S) :- holds(P,S), holds(Q,S). holds(P v Q,S) :- holds(P,S); holds(Q,S). holds(P => Q,S) :- holds(-P v Q,S). holds(P <=> Q,S) :- holds((P => Q) & (Q => P),S). holds(-(-P),S) :- holds(P,S). holds(-(P & Q),S) :- holds(-P v -Q,S). holds(-(P v Q),S) :- holds(-P & -Q,S). holds(-(P => Q),S) :- holds(-(-P v Q),S). holds(-(P <=> Q),S) :- holds(-((P => Q) & (Q => P)),S). holds(-all(V,P),S) :- holds(some(V,-P),S). holds(-some(V,P),S) :- \+ holds(some(V,P),S). /* Negation */ holds(-P,S) :- isAtom(P), \+ holds(P,S). /* by failure */ holds(all(V,P),S) :- holds(-some(V,-P),S). holds(some(V,P),S) :- sub(V,_,P,P1), holds(P1,S). /* The following clause treats the holds predicate for non fluents, including Prolog system predicates. For this to work properly, the GOLOG programmer must provide, for all fluents, a clause giving the result of restoring situation arguments to situation-suppressed terms, for example: restoreSitArg(ontable(X),S,ontable(X,S)). */ holds(A,S) :- restoreSitArg(A,S,F), F ; \+ restoreSitArg(A,S,F), isAtom(A), A. isAtom(A) :- \+ (A = -W ; A = (W1 & W2) ; A = (W1 => W2) ; A = (W1 <=> W2) ; A = (W1 v W2) ; A = some(X,W) ; A = all(X,W)). %restoreSitArg(poss(A),S,poss(A,S)). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % added by Yves Lesperance % an iterative deepening planning procedure % % To use it you must define the goal fluent goal(s) and % the forward filtering fluent acceptable(a,s) proc(idPlan(N), idPlan(0,N)). proc(idPlan(M,N), dfPlan(M) # ?(M < N) : pi(m1, ?(m1 is M + 1) : idPlan(m1,N))). proc(dfPlan(N), ?(goal) # ?(N > 0) : pi(a, ?(acceptable(a)) : a) : pi(n1, ?(n1 is N - 1) : dfPlan(n1))). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % EOF: golog_swi.pl %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%