%
% The parent transaction forces two interacting processes to execute
% concurrently while synchronizing themselves.  It is based on
% Example 4 in the DBPL'97 paper.  First, processes a and b interleave,
% then process a executes alone, then process b executes alone, then
% they interleave again.
%

parent :- process(a) # process(b).

process(a) :- task(a1) * task(a2) * task(a3) *
                     task(a4) * task(a5) * task(a6) *
                     ins(start(b3)) * start(a7) *
                     task(a7) * task(a8).

process(b) :- task(b1) * task(b2) *
                     start(b3) *
                     task(b3) * task(b4) * task(b5) * task(b6) *
                     ins(start(a7)) *
                     task(b7) * task(b8).

task(I) :- monitor(task(I)).


% Before executing the parent transaction a second time, cleanup the
% database by executing the following transaction.
%

cleanup :- del(start(A)) * del(start(B)).


