/* simplePlanners_noControl: versione semplificata dei pianificatori
GOLOG, che non utilizzano conoscenza di controllo.  Richiede l'uso di
golog_swi, che viene caricato inizialmente */

:- [golog_swi].
:- discontiguous proc/2.
:- multifile restoreSitArg/3.

%  Implementation of a simple depth-first planner.
% plandf(N): ricerca un piano di lunghezza massima N
%            la ricerca e' in profondita'
plandf(N) :- do(depthFirstPlanner(N),s0,_), askForMore.

askForMore :- write('More? '), read(n).

% procedura per la ricerca in profondita' limitata 
proc(depthFirstPlanner(N),   
     ?(goal) : ?(prettyPrintSituation) #
    ?(N > 0) : pi(a,?(primitive_action(a)) : a) : 
    pi(n1, ?(n1 is N - 1) : depthFirstPlanner(n1))). 

%   Implementation of World's Simplest Breadth-First Planner

planbf(N) :- do(breadthFirstPlanner(0,N),s0,_), askForMore.


% ricerca di un piano di lunghezza massima M
% se M non supera N
proc(breadthFirstPlanner(M,N),
     ?(M =< N) :
    (actionSequence(M) : ?(goal) :
    ?(prettyPrintSituation) #
    pi(m1, ?(m1 is M + 1) :
      ?(reportLevel(m1)) : breadthFirstPlanner(m1,N)))).

% esecuzione di una qualunque sequenza di azioni di lunghezza N:
% do(actionSequence(N),S,S') = S' e' il risultato dell'esecuzione
% a partire da S di una qualunque sequenza di azioni di lunghezza N
proc(actionSequence(N),
     ?(N = 0) #
    ?(N > 0) : pi(a,?(primitive_action(a)) : a) :
    pi(n1, ?(n1 is N - 1) : actionSequence(n1))).

reportLevel(N) :- write('Starting level '), write(N), nl.

/* ------------------------------------------ */

prettyPrintSituation(S) :- makeActionList(S,Alist), nl,
                           write(Alist), nl.
 
makeActionList(s0,[]).
makeActionList(do(A,S), L) :- makeActionList(S,L1),
                              append(L1, [A], L).
 
restoreSitArg(prettyPrintSituation,S,prettyPrintSituation(S)).
restoreSitArg(goal,S,goal(S)).

