MODULE MutualRecursion; IMPORT Out; TYPE Fn = PROCEDURE(n:INTEGER):INTEGER; PROCEDURE^ M(n:INTEGER):INTEGER; PROCEDURE F(n:INTEGER):INTEGER; BEGIN IF n=0 THEN RETURN 1 ELSE RETURN n-M(F(n-1)) END; END F; PROCEDURE M(n:INTEGER):INTEGER; BEGIN IF n=0 THEN RETURN 0 ELSE RETURN n-F(M(n-1)) END; END M; (* Print the first few values of one of the functions *) PROCEDURE Show(name:ARRAY OF CHAR;fn:Fn); CONST Max = 15; VAR i:INTEGER; BEGIN Out.String(name); Out.String(": "); FOR i := 0 TO Max DO Out.Int(fn(i),0); Out.String(" "); END; Out.Ln; END Show; (* Show the first values of both F and M *) BEGIN Show("F", F); Show("M", M); END MutualRecursion.