%Esercizio 3:


%%%%%%%%%%%%%%%%%%%%%%%
%Stato iniziale 
%%%%%%%%%%%%%%%%%%%%%%%

holds(in(carico1,carrello1),s0).
holds(at(carrello1,milano), s0).
holds(connected(milano,bologna),s0).
holds(connected(bologna,roma),s0).
holds(carrello(carrello1),s0).
 
%%%%%%%%%%%%%%%%%%%%%%%
%Caricamento di un oggetto:
%%%%%%%%%%%%%%%%%%%%%%%
%effetti azione

holds(in(Oggetto,Carrello),do1(load(Oggetto,Carrello,Z),S)).
 
%Frame axiom
holds(V, do1(load(Oggetto,Carrello,Location),S)):-
    holds(V,S),
    V\==at(Oggetto,Location).
 
%Precondizioni
pact(load(Oggetto,Carrello,Location),S):-
	holds(at(Oggetto,Location),S), 
holds(at(Carrello,Location),S).
 
 
%%%%%%%%%%%%%%%%%%%%%%%
%Scaricamento di un oggetto:
%%%%%%%%%%%%%%%%%%%%%%%%effetti azione
holds(at(Ogg,Location),do1(unload(Ogg,Carrello,Location),S)).
 
%Frame axiom
holds(V, do1(unload(Oggetto,Carrello,Location), S)):-
    holds(V,S),
    V\== in(Oggetto,Carrello).
 
%Precondizioni
pact(unload(Oggetto,Carrello,Location),S):-
	holds(in(Oggetto,Carrello),S), 
holds(at(Carrello,Location),S).
 
 

%%%%%%%%%%%%%%%%%%%%%%%
%Trasporto
%%%%%%%%%%%%%%%%%%%%%%%
%effetti azione
holds(at(Carrello,Location2),do1(drive(Carrello,Location1,Location2),S)).
 
%Frame axiom
holds(V, do1(drive(Carrello,Location1,Location2),S)):-
    holds(V,S),
    V\== at(Carrello, Location1).
 
%Precondizioni
pact(drive(Carrello,Location1,Location2),S):-
	holds(connected(Location1,Location2),S), 
holds(at(Carrello,Location1),S), 
holds(carrello(Carrello), S). 
 
 
%Clausola per esprimere la raggiungibilità di uno stato:
poss(s0).
poss(do1(U,S)):-
    poss(S),
    pact(U,S).
