program P(output);

   procedure R(MaxLevel, Maxi:integer);
      label 88;
      var a:array[1..4]of integer;

      procedure Fin; begin write(' Fail(0)'); goto 88 end;

      procedure S( Level:integer; procedure Fail);
	 label 99;
         var i, j :integer;

         procedure Again; begin write(' Fail(', Level:1, ')'); goto 99 end;
	 { NB. `99' must be at outermost statement level in S in Pascal }

      begin {S}
	 if Level > MaxLevel then
	 begin writeln; for j:=1 to MaxLevel do write(a[j]:2);
	       Fail
         end;
        {else Level <= MaxLevel}
        {for i:=1 to 3 do} i:=0; 99: i:=i+1;
               a[Level]:=i;
               if i<Maxi then S(Level+1, Again)
                         else S(Level+1, Fail);
        {end for} goto 99
      end   {S};

   begin {R}
      S(1, Fin);
      88: {skip}
   end   {R};

begin
   R(2,3)
end.

{\fB Passing Fail Points in a Backtracking Routine.\fP }
