Efficient Kleene recursion #
The efficient fixed-point theorem efficient_fixed_point (blueprint lem:kleene;
[MNY, Lemma 2.3]), by the classical construction: for a polynomial-time map F on
programs, let G be the program that on cons x v (with x the description of a program
x') computes s(x', x') = hardcode x' (encode x'), applies F to it, and runs the result
on v through the universal machine; the fixed point is e = hardcode G (encode G), since
e on v is G on cons (encode G) v, which runs F (hardcode G (encode G)) = F e on
v. The time transfer is the universal machine's, plus the fixed cost of computing F e
and a copy of the input.
The two-argument program of the fixed-point construction: on cons x v, compute the
description of hardcode x' (encode x') (where x = encode x'), apply F to it, and run
the result on v through the universal program univ.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The run of the s-m-n step of kleeneProg.
The run of the final pairing step of kleeneProg.
Forward run of kleeneProg: a run of F (hardcode x (encode x)) on v yields a run of
kleeneProg on cons (encode x) v, at the universal machine's overhead plus the fixed
cost of computing F (hardcode x (encode x)) and copies of the input.
Backward: a run of kleeneProg on cons (encode x) v yields a run of
F (hardcode x (encode x)) on v (through UniversalMachine.halts_of).
The fixed-point theorem (blueprint lem:kleene; [MNY, Lemma 2.3]) #
Efficient Kleene fixed point: for a polynomial-time map on programs, a closed
program e with the same input/output behavior as F e, whose runs are bounded by the
runs of F e at polynomial overhead. The construction is e = hardcode G (encode G) for
the program G = kleeneProg U.univ F, and the polynomial p is the universal machine's
bound shifted by the size of F e, plus a linear term and a constant covering the
fixed computation of F e and the copies of the input.
Departure from [MNY, Lemma 2.3], which states the runtimes of e and F e as
polynomially equivalent: only the direction "runs of F e bound runs of e" is used by
the recursive compression argument (it is what makes the fixed point polynomial-time), and
only that direction follows from UniversalMachine.time_le. The converse would need a
lower-bound clause on the universal machine ("a simulation is never faster than the
simulated run"); it is omitted to keep the universal-machine obligation minimal and can be
restored with such a clause if a consumer needs it.