
%% settembre 2013

%%%%% definizioni necessarie per la rappresentazione di un dominio

%%%%%%%%%%%%%%% direttive iniziali
:- [golog_swi].

%%% direttive discontiguous per i fluenti
%%% esempio
:- discontiguous at/2, in/3.

%%%%%%%%%%% dichiarazione delle azioni primitive
primitive_action(attraversa(_,_,_)).
primitive_action(spingi(_,_,_,_)).

%%%%%% Restore suppressed situation arguments.
%% (un fatto per ogni fluente).
restoreSitArg(at(X),S,at(X,S)).
restoreSitArg(in(X,Y),S,in(X,Y,S)).

%%%%%%% Action precondition axioms
%% esempio
poss(attraversa(P,From,To),S) :-
	at(From,S),
	(connects(P,From,To); connects(P,To,From)).
poss(spingi(C,P,From,To),S) :-
	at(From,S), in(C,From,S),
	(connects(P,From,To); connects(P,To,From)).

%%%%%%% Successor state axioms
at(X,do(A,S)) :-
	(A=attraversa(_,_,X) ; A=spingi(_,_,_,X)) ;
	at(X,S),
	\+ (A=attraversa(_,X,_) ; A=spingi(_,_,X,_)).

in(C,X,do(A,S)) :-
	A=spingi(C,_,_,X) ;
	in(C,X,S),
	\+(A=spingi(C,_,X,_)).


%%%% Initial situation
at(a,s0).
in(cariola,a,s0).
in(pippo,b,s0).
in(pluto,c,s0).
in(paperino,d,s0).

%%%%%%% definizione di eventuali predicati statici
connects(1,a,b).
connects(2,b,c).
connects(3,a,c).
connects(4,b,d).

proc(porta(C,Start,Dest),
     aux(C,Start,Dest,[])).

proc(aux(C,Start,Dest,Visited),
     ?(Start=Dest) #
    pi(stanza,
       pi(porta,
	  ?(connects(porta,stanza,Start) v
	   connects(porta,Start,stanza)) :
	 ?(- member(stanza,Visited)) :
	 spingi(C,porta,Start,stanza) :
	 aux(C,stanza,Dest,[stanza|Visited])))).

%%% esegui
esegui(P,Alist) :-
	do(P,s0,S), tolist(S,Alist).

tolist(s0,[]).
tolist(do(A,S),Alist) :-
	tolist(S,Tmp),
	append(Tmp,[A],Alist).
