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

%%%%%%%%%%%%%%% direttive iniziali

:- [golog_swi].

%%% direttive discontiguous per i fluenti
%%% esempio
%%%% :- discontiguous currentFloor/2, on/2.

%%%%%%%%%%% dichiarazione delle azioni primitive
%% esempio
%%% primitive_action(move(_,_)).

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

%%%%%%% definizione di eventuali predicati statici
%% esempio
%% top(10).

%%%%%%% Action precondition axioms
%% esempio
%%% poss(move(X,Y),S) :- clear(X,S), clear(Y,S), not(X = Y).

%%%%%%% Successor state axioms
%% esempio
%% on(X,Y,do(A,S)) :- A = move(X,Y) ;
%%                   on(X,Y,S), not(A = moveToTable(X)), not(A = move(X,_)).

%%%% Initial situation
%% esempio
%% on(b,c,s0). on(c,a,s0). on(a,d,s0). ontable(d,s0). clear(b,s0).

%%% Sintassi del Golog
%%% sequenze di azioni: A1 : A2
%%% test: ?(Formula)
%%%         congiunzione: F & G
%%%         disgiunzione: F v G
%%%         implicazione: F => G
%%%         doppia implicazione: F <=> G
%%%         negazione: - F
%%%         quantificatore universale: all(V,F)
%%%         quantificatore esistenziale: some(V,F)
%%% scelta non deterministica di due azioni: A1 # A2
%%% if-then-else: if(Cond,A1,A2)
%%% ciclo: while(Cond,A)
%%% scelta non deterministica dell'argomento di un'azione:
%%%             pi(x,A)
%%% iterazione 0 o piu' volte: star(A)
%%% procedure: proc(Testa,Corpo)
%%%          parametri della procedura: variabili prolog


%%% esegui
% stampa la lista di azioni che eseguono una procedura
esegui(P) :- esegui(P,List), printlist(List).

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

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

printlist([]).
printlist([X|Rest]) :-
	writeln(X),printlist(Rest).

