/*  Esempio 2 delle slides su Golog */

:- [golog_swi].
:- discontiguous onTable/2, armempty/1.

/* Definizione azioni primitive */ 
primitive_action(pickup(_)). 
primitive_action(putOnTable(_)).
primitive_action(putOnFloor(_)). 

/* Assiomi delle precondizioni per le azioni primitive */
poss(pickup(_),S) :- armempty(S).
poss(putOnTable(X),S) :- holding(X,S).
poss(putOnFloor(X),S) :- holding(X,S).

/* Assiomi di stato successore per i fluenti primitivi*/
holding(X,do(A,S)) :- A=pickup(X);
                      holding(X,S), \+ A=putOnTable(X), \+ A=putOnFloor(X).
onTable(X,do(A,S)) :- A=putOnTable(X); onTable(X,S), \+ A=pickup(X).
onFloor(X,do(A,S)) :- A=putOnFloor(X); onFloor(X,S), \+ A=pickup(X).
armempty(do(A,S))  :- A=putOnTable(X); A=putOnFloor(X);
                      armempty(S), \+ A=pickup(X).
                      
/*Procedure Golog per azioni complesse*/
proc(clearTable, while(some(y,onTable(y)),
                       pi(x,(?(onTable(x)) : removeFromTable(x))))).
proc(removeFromTable(X), pickup(X) : putOnFloor(X)).

/*Assioma per lo stato iniziale*/
onTable(b,s0). onTable(a,s0). armempty(s0).

/* Regole per ripristinare gli argomenti situazione soppressi*/
restoreSitArg(onTable(X),S,onTable(X,S)).
restoreSitArg(onFloor(X),S,onFloor(X,S)).
restoreSitArg(holding(X),S,holding(X,S)).
restoreSitArg(armempty,S,armempty(S)).

