
   %   Implementation of World's Simplest Breadth-First Planner

proc(wspbf(N), ?(initializeSitCount) : ?(initializeCPU) : plans(0,N)).

proc(plans(M,N),
          ?(M =< N) :
          (actionSequence(M) : ?(goal) :
           ?(reportSuccess) : ?(prettyPrintSituation) #
           pi(m1, ?(m1 is M + 1) :
           ?(reportLevel(m1)) : plans(m1,N)))).

proc(actionSequence(N),
        ?(N = 0) #
        ?(N > 0) : pi(a,?(primitive_action(a)) : a) :
        ?(-badSituation) : ?(incrementSitCount) :
        pi(n1, ?(n1 is N - 1) : actionSequence(n1))).

planbf(N) :- do(wspbf(N),s0,S), askForMore.

reportLevel(N) :- write('Starting level '), write(N),
                  reportCPUtime, write('  Good situations: '),
                  getval(sitCount,C), write(C), nl.

initializeSitCount :- setval(sitCount,0). /* Eclipse Prolog provides
                                             global variables.  */

initializeCPU :- cputime(T), setval(cpu,T).

incrementSitCount :- incval(sitCount).  % Increment global variable.

reportCPUtime :- cputime(T),  write('  CPU time (sec): '),
                 getval(cpu,T2), T1 is T - T2, write(T1).

reportSuccess :- nl, write('Success.'), reportCPUtime,
    write('  Good situations: '), getval(sitCount,C), write(C), 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(badSituation,S,badSituation(S)).
restoreSitArg(goal,S,goal(S)).

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

