Documentation

Complexitylib.Models.TuringMachine.Universality

Generic universal-machine interfaces #

This module gives machine-independent definitions of semantic and efficient universality. A simulation compiler acts on arbitrary binary programs; its correctness does not mention a concrete description codec. Additive description overhead and an explicit program-sensitive clock are separate reusable hypotheses.

The default IsEfficientlyUniversal policy asks for a polynomial in source running time and source-program length. IsEfficientlyUniversalFor remains available for sharper policies.

Main results #

theorem Complexity.TM.Simulates.refl {firstTapes : } (machine : TM firstTapes) :
machine.Simulates machine id

Every machine simulates itself under the identity compiler.

theorem Complexity.TM.Simulates.comp {firstTapes secondTapes thirdTapes : } {first : TM firstTapes} {second : TM secondTapes} {third : TM thirdTapes} {compileFirst compileSecond : List BoolList Bool} (hFirst : first.Simulates second compileFirst) (hSecond : second.Simulates third compileSecond) :
first.Simulates third (compileFirst compileSecond)

Semantic simulations compose, with the inner compiler applied first.

The identity compiler has zero additive program overhead.

theorem Complexity.TM.HasAdditiveProgramOverhead.mono {compile : List BoolList Bool} {first second : } (hbound : first second) (hoverhead : HasAdditiveProgramOverhead compile first) :

A larger additive constant preserves a compiler-length bound.

theorem Complexity.TM.HasAdditiveProgramOverhead.comp {compileFirst compileSecond : List BoolList Bool} {first second : } (hFirst : HasAdditiveProgramOverhead compileFirst first) (hSecond : HasAdditiveProgramOverhead compileSecond second) :
HasAdditiveProgramOverhead (compileFirst compileSecond) (second + first)

Additive compiler-length bounds compose by addition.

theorem Complexity.TM.SimulatesInTime.refl {firstTapes : } (machine : TM firstTapes) :
machine.SimulatesInTime machine id fun (x : List Bool) (sourceTime : ) => sourceTime

Identity execution has the identity time overhead.

theorem Complexity.TM.SimulatesInTime.mono {firstTapes secondTapes : } {simulator : TM firstTapes} {source : TM secondTapes} {compile : List BoolList Bool} {firstClock secondClock : TimeOverhead} (hclock : ∀ (program : List Bool) (sourceTime : ), firstClock program sourceTime secondClock program sourceTime) (hsim : simulator.SimulatesInTime source compile firstClock) :
simulator.SimulatesInTime source compile secondClock

Enlarging a simulation clock preserves a timed simulation.

theorem Complexity.TM.SimulatesInTime.comp {firstTapes secondTapes thirdTapes : } {first : TM firstTapes} {second : TM secondTapes} {third : TM thirdTapes} {compileFirst compileSecond : List BoolList Bool} {clockFirst clockSecond : TimeOverhead} (hFirst : first.SimulatesInTime second compileFirst clockFirst) (hSecond : second.SimulatesInTime third compileSecond clockSecond) :
first.SimulatesInTime third (compileFirst compileSecond) fun (program : List Bool) (sourceTime : ) => clockFirst (compileSecond program) (clockSecond program sourceTime)

Timed simulations compose by feeding the inner compiled program and clock to the outer clock.

theorem Complexity.TM.PolynomialTimeOverhead.identity :
PolynomialTimeOverhead fun (_program : List Bool) (sourceTime : ) => sourceTime

The identity clock is polynomial.

theorem Complexity.TM.PolynomialTimeOverhead.comp {compileInner : List BoolList Bool} {additive : } {clockOuter clockInner : TimeOverhead} (hlength : HasAdditiveProgramOverhead compileInner additive) (hOuter : PolynomialTimeOverhead clockOuter) (hInner : PolynomialTimeOverhead clockInner) :
PolynomialTimeOverhead fun (program : List Bool) (sourceTime : ) => clockOuter (compileInner program) (clockInner program sourceTime)

Polynomial clocks compose through a compiler with additive length overhead.

theorem Complexity.TM.IsEfficientlyUniversalFor.isUniversal {firstTapes : } {simulator : TM firstTapes} {admissible : TimeOverheadProp} (h : simulator.IsEfficientlyUniversalFor admissible) :
simulator.IsUniversal

Universality for any admissible time policy implies semantic universality.

theorem Complexity.TM.IsEfficientlyUniversal.isUniversal {firstTapes : } {simulator : TM firstTapes} (h : simulator.IsEfficientlyUniversal) :
simulator.IsUniversal

Polynomially efficient universality implies semantic universality.

theorem Complexity.TM.IsEfficientlyUniversalFor.mono {firstTapes : } {simulator : TM firstTapes} {firstPolicy secondPolicy : TimeOverheadProp} (hpolicy : ∀ (clock : TimeOverhead), firstPolicy clocksecondPolicy clock) (h : simulator.IsEfficientlyUniversalFor firstPolicy) :
simulator.IsEfficientlyUniversalFor secondPolicy

Weakening the admissibility policy preserves efficient universality.

theorem Complexity.TM.Simulates.isUniversal {firstTapes secondTapes : } {first : TM firstTapes} {second : TM secondTapes} {compile : List BoolList Bool} (hsim : first.Simulates second compile) (huniversal : second.IsUniversal) :

A simulator of a universal machine is itself universal.