
%% febbraio 2013

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

:- [golog_swi].

%%% direttive discontiguous per i fluenti
% fluenti:
%libero(s) = il robot ha le mani libera nella sit s
%at(x,s) = il robot sta nel posto x nella sit s
%servito(x,s) = il paziente del letto x e' stato servito...
:- discontiguous libero/1, at/2, servito/2.

%%%%%%%%%%% dichiarazione delle azioni primitive
primitive_action(prendivassoio).
primitive_action(vai(_,_)).
primitive_action(consegnavassoio(_)).

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

%%%%%%% Action precondition axioms
%% esempio
poss(prendivassoio,S) :-
	libero(S), at(corridoio,S).

poss(vai(X,Y),S) :-
	at(X,S), X\=Y.

poss(consegnavassoio(X),S) :-
	at(X,S), letto(X), 
	\+ servito(X,S), \+ libero(S).

%%%%%%% Successor state axioms
libero(do(A,S)) :-
	A=consegnavassoio(_) ;
	libero(S), not(A=prendivassoio).

at(X,do(A,S)) :-
	A=vai(_,X) ;
	at(X,S) , \+ A=vai(X,_).

servito(X,do(A,S)) :-
	A=consegnavassoio(X) ;
	servito(X,S).

%%%%%%% definizione di eventuali predicati statici
letto(X) :-
	member(X,[lettoA,lettoB,lettoC,lettoD]).
posto(X) :-
	X=corridoio ; letto(X).

%%%% Initial situation
at(lettoA,s0).
libero(s0).
servito(lettoB,s0).

% procedura servi il letto X
% fallisce se X gia' servito
proc(servi(X),
     if(-libero,
	if(at(X),consegnavassoio(X),
	   pi(from,vai(from,X)) :consegnavassoio(X)),
	if(at(corridoio), prendivassoio,
	   pi(from,vai(from,corridoio)):prendivassoio) :
        servi(X))).

% variante
proc(servi2(X),
     if(-libero,
	star(pi(from,vai(from,X))) : consegnavassoio(X),
	star(pi(from,vai(from,corridoio))) :
           prendivassoio : servi2(X))).

proc(servi3(X),
     star(star(pi(from,vai(from,corridoio))) :
	 prendivassoio) :
    star(pi(from,vai(from,X))) : consegnavassoio(X)).
   
%%procedura servi_tutti
proc(servi_tutti,
     star(pi(x,?(letto(x) & - servito(x)) : servi(x))) :
    ?(all(x,letto(x) => servito(x)))).
     


%%% 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).
