Documentation

Mathlib.Computability.TMComputable

Computable functions #

This file contains the definition of a Turing machine with some finiteness conditions (bundling the definition of TM2 in TuringMachine.lean), a definition of when a TM gives a certain output (in a certain time), and the definition of computability (in polynomial time or any time function) of a function between two types that have an encoding (as in Encoding.lean).

Main theorems #

Implementation notes #

To count the execution time of a Turing machine, we have decided to count the number of times the step function is used. Each step executes a statement (of type Stmt); this is a function, and generally contains multiple "fundamental" steps (pushing, popping, and so on). However, as functions only contain a finite number of executions and each one is executed at most once, this execution time is up to multiplication by a constant the amount of fundamental steps.

structure Turing.FinTM2 :

A bundled TM2 (an equivalent of the classical Turing machine, defined starting from the namespace Turing.TM2 in TuringMachine.lean), with an input and output stack, a main function, an initial state and some finiteness guarantees.

  • K : Type

    index type of stacks

  • kDecidableEq : DecidableEq self.K
  • kFin : Fintype self.K

    A TM2 machine has finitely many stacks.

  • k₀ : self.K

    input resp. output stack

  • k₁ : self.K

    input resp. output stack

  • Γ : self.KType

    type of stack elements

  • Λ : Type

    type of function labels

  • main : self.Λ

    a main function: the initial function that is executed, given by its label

  • ΛFin : Fintype self.Λ

    A TM2 machine has finitely many function labels.

  • σ : Type

    type of states of the machine

  • initialState : self.σ

    the initial state of the machine

  • σFin : Fintype self.σ

    a TM2 machine has finitely many internal states.

  • Γk₀Fin : Fintype (self.Γ self.k₀)

    Each internal stack is finite.

  • m : self.ΛTM2.Stmt self.Γ self.Λ self.σ

    the program itself, i.e. one function for every function label

Equations

The type of statements (functions) corresponding to this TM.

Equations

The type of configurations (functions) corresponding to this TM.

Equations
def Turing.FinTM2.step (tm : FinTM2) :
tm.CfgOption tm.Cfg

The step function corresponding to this TM.

Equations
def Turing.initList (tm : FinTM2) (s : List (tm.Γ tm.k₀)) :
tm.Cfg

The initial configuration corresponding to a list in the input alphabet.

Equations
def Turing.haltList (tm : FinTM2) (s : List (tm.Γ tm.k₁)) :
tm.Cfg

The final configuration corresponding to a list in the output alphabet.

Equations
structure Turing.EvalsTo {σ : Type u_1} (f : σOption σ) (a : σ) (b : Option σ) :

A "proof" of the fact that f eventually reaches b when repeatedly evaluated on a, remembering the number of steps it takes.

structure Turing.EvalsToInTime {σ : Type u_1} (f : σOption σ) (a : σ) (b : Option σ) (m : ) extends Turing.EvalsTo f a b :

A "proof" of the fact that f eventually reaches b in at most m steps when repeatedly evaluated on a, remembering the number of steps it takes.

def Turing.EvalsTo.refl {σ : Type u_1} (f : σOption σ) (a : σ) :
EvalsTo f a (some a)

Reflexivity of EvalsTo in 0 steps.

Equations
def Turing.EvalsTo.trans {σ : Type u_1} (f : σOption σ) (a b : σ) (c : Option σ) (h₁ : EvalsTo f a (some b)) (h₂ : EvalsTo f b c) :
EvalsTo f a c

Transitivity of EvalsTo in the sum of the numbers of steps.

Equations
def Turing.EvalsToInTime.refl {σ : Type u_1} (f : σOption σ) (a : σ) :

Reflexivity of EvalsToInTime in 0 steps.

Equations
def Turing.EvalsToInTime.trans {σ : Type u_1} (f : σOption σ) (m₁ m₂ : ) (a b : σ) (c : Option σ) (h₁ : EvalsToInTime f a (some b) m₁) (h₂ : EvalsToInTime f b c m₂) :
EvalsToInTime f a c (m₂ + m₁)

Transitivity of EvalsToInTime in the sum of the numbers of steps.

Equations
def Turing.TM2Outputs (tm : FinTM2) (l : List (tm.Γ tm.k₀)) (l' : Option (List (tm.Γ tm.k₁))) :

A proof of tm outputting l' when given l.

Equations
def Turing.TM2OutputsInTime (tm : FinTM2) (l : List (tm.Γ tm.k₀)) (l' : Option (List (tm.Γ tm.k₁))) (m : ) :

A proof of tm outputting l' when given l in at most m steps.

Equations
def Turing.TM2OutputsInTime.toTM2Outputs {tm : FinTM2} {l : List (tm.Γ tm.k₀)} {l' : Option (List (tm.Γ tm.k₁))} {m : } (h : TM2OutputsInTime tm l l' m) :
TM2Outputs tm l l'

The forgetful map, forgetting the upper bound on the number of steps.

Equations
structure Turing.TM2ComputableAux (Γ₀ Γ₁ : Type) :

A (bundled TM2) Turing machine with input alphabet equivalent to Γ₀ and output alphabet equivalent to Γ₁.

  • tm : FinTM2

    the underlying bundled TM2

  • inputAlphabet : self.tm.Γ self.tm.k₀ Γ₀

    the input alphabet is equivalent to Γ₀

  • outputAlphabet : self.tm.Γ self.tm.k₁ Γ₁

    the output alphabet is equivalent to Γ₁

structure Turing.TM2Computable {α β : Type} (ea : Computability.FinEncoding α) (eb : Computability.FinEncoding β) (f : αβ) extends Turing.TM2ComputableAux ea.Γ eb.Γ :

A Turing machine + a proof it outputs f.

structure Turing.TM2ComputableInTime {α β : Type} (ea : Computability.FinEncoding α) (eb : Computability.FinEncoding β) (f : αβ) extends Turing.TM2ComputableAux ea.Γ eb.Γ :

A Turing machine + a time function + a proof it outputs f in at most time(input.length) steps.

structure Turing.TM2ComputableInPolyTime {α β : Type} (ea : Computability.FinEncoding α) (eb : Computability.FinEncoding β) (f : αβ) extends Turing.TM2ComputableAux ea.Γ eb.Γ :

A Turing machine + a polynomial time function + a proof it outputs f in at most time(input.length) steps.

A forgetful map, forgetting the time bound on the number of steps.

Equations

A forgetful map, forgetting that the time function is polynomial.

Equations

A Turing machine computing the identity on α.

Equations
  • One or more equations did not get rendered due to their size.

A proof that the identity map on α is computable in polytime.

Equations
  • One or more equations did not get rendered due to their size.

A proof that the identity map on α is computable in time.

Equations

A proof that the identity map on α is computable.

Equations