Documentation

Mathlib.Computability.Halting

Computability theory and the halting problem #

A universal partial recursive function, Rice's theorem, and the halting problem.

References #

theorem Nat.Partrec.merge' {f : ℕ →. ℕ} {g : ℕ →. ℕ} (hf : Nat.Partrec f) (hg : Nat.Partrec g) :
∃ (h : ℕ →. ℕ), Nat.Partrec h ∧ ∀ (a : ℕ), (∀ x ∈ h a, x ∈ f a ∨ x ∈ g a) ∧ ((h a).Dom ↔ (f a).Dom ∨ (g a).Dom)
theorem Partrec.merge' {α : Type u_1} {σ : Type u_4} [Primcodable α] [Primcodable σ] {f : α →. σ} {g : α →. σ} (hf : Partrec f) (hg : Partrec g) :
∃ (k : α →. σ), Partrec k ∧ ∀ (a : α), (∀ x ∈ k a, x ∈ f a ∨ x ∈ g a) ∧ ((k a).Dom ↔ (f a).Dom ∨ (g a).Dom)
theorem Partrec.merge {α : Type u_1} {σ : Type u_4} [Primcodable α] [Primcodable σ] {f : α →. σ} {g : α →. σ} (hf : Partrec f) (hg : Partrec g) (H : ∀ (a : α), ∀ x ∈ f a, ∀ y ∈ g a, x = y) :
∃ (k : α →. σ), Partrec k ∧ ∀ (a : α) (x : σ), x ∈ k a ↔ x ∈ f a ∨ x ∈ g a
theorem Partrec.cond {α : Type u_1} {σ : Type u_4} [Primcodable α] [Primcodable σ] {c : α → Bool} {f : α →. σ} {g : α →. σ} (hc : Computable c) (hf : Partrec f) (hg : Partrec g) :
Partrec fun (a : α) => bif c a then f a else g a
theorem Partrec.sum_casesOn {α : Type u_1} {β : Type u_2} {γ : Type u_3} {σ : Type u_4} [Primcodable α] [Primcodable β] [Primcodable γ] [Primcodable σ] {f : α → β ⊕ γ} {g : α → β →. σ} {h : α → γ →. σ} (hf : Computable f) (hg : Partrec₂ g) (hh : Partrec₂ h) :
Partrec fun (a : α) => Sum.casesOn (f a) (g a) (h a)
def ComputablePred {α : Type u_1} [Primcodable α] (p : α → Prop) :

A computable predicate is one whose indicator function is computable.

Equations
Instances For
    def RePred {α : Type u_1} [Primcodable α] (p : α → Prop) :

    A recursively enumerable predicate is one which is the domain of a computable partial function.

    Equations
    Instances For
      theorem RePred.of_eq {α : Type u_1} [Primcodable α] {p : α → Prop} {q : α → Prop} (hp : RePred p) (H : ∀ (a : α), p a ↔ q a) :
      theorem Partrec.dom_re {α : Type u_1} {β : Type u_2} [Primcodable α] [Primcodable β] {f : α →. β} (h : Partrec f) :
      RePred fun (a : α) => (f a).Dom
      theorem ComputablePred.of_eq {α : Type u_1} [Primcodable α] {p : α → Prop} {q : α → Prop} (hp : ComputablePred p) (H : ∀ (a : α), p a ↔ q a) :
      theorem ComputablePred.computable_iff {α : Type u_1} [Primcodable α] {p : α → Prop} :
      ComputablePred p ↔ ∃ (f : α → Bool), Computable f ∧ p = fun (a : α) => f a = true
      theorem ComputablePred.not {α : Type u_1} [Primcodable α] {p : α → Prop} (hp : ComputablePred p) :
      ComputablePred fun (a : α) => ¬p a
      theorem ComputablePred.to_re {α : Type u_1} [Primcodable α] {p : α → Prop} (hp : ComputablePred p) :
      theorem ComputablePred.rice (C : Set (ℕ →. ℕ)) (h : ComputablePred fun (c : Nat.Partrec.Code) => Nat.Partrec.Code.eval c ∈ C) {f : ℕ →. ℕ} {g : ℕ →. ℕ} (hf : Nat.Partrec f) (hg : Nat.Partrec g) (fC : f ∈ C) :
      g ∈ C

      Rice's Theorem

      theorem ComputablePred.rice₂ (C : Set Nat.Partrec.Code) (H : ∀ (cf cg : Nat.Partrec.Code), Nat.Partrec.Code.eval cf = Nat.Partrec.Code.eval cg → (cf ∈ C ↔ cg ∈ C)) :
      (ComputablePred fun (c : Nat.Partrec.Code) => c ∈ C) ↔ C = ∅ ∨ C = Set.univ

      The Halting problem is recursively enumerable

      The Halting problem is not computable

      theorem ComputablePred.computable_iff_re_compl_re' {α : Type u_1} [Primcodable α] {p : α → Prop} :
      ComputablePred p ↔ RePred p ∧ RePred fun (a : α) => ¬p a
      inductive Nat.Partrec' {n : ℕ} :

      A simplified basis for Partrec.

      Instances For
        theorem Nat.Partrec'.of_eq {n : ℕ} {f : Vector ℕ n →. ℕ} {g : Vector ℕ n →. ℕ} (hf : Nat.Partrec' f) (H : ∀ (i : Vector ℕ n), f i = g i) :
        theorem Nat.Partrec'.of_prim {n : ℕ} {f : Vector ℕ n → ℕ} (hf : Primrec f) :
        theorem Nat.Partrec'.head {n : ℕ} :
        Nat.Partrec' ↑Vector.head
        theorem Nat.Partrec'.tail {n : ℕ} {f : Vector ℕ n →. ℕ} (hf : Nat.Partrec' f) :
        Nat.Partrec' fun (v : Vector ℕ (Nat.succ n)) => f (Vector.tail v)
        theorem Nat.Partrec'.bind {n : ℕ} {f : Vector ℕ n →. ℕ} {g : Vector ℕ (n + 1) →. ℕ} (hf : Nat.Partrec' f) (hg : Nat.Partrec' g) :
        Nat.Partrec' fun (v : Vector ℕ n) => Part.bind (f v) fun (a : ℕ) => g (a ::ᵥ v)
        theorem Nat.Partrec'.map {n : ℕ} {f : Vector ℕ n →. ℕ} {g : Vector ℕ (n + 1) → ℕ} (hf : Nat.Partrec' f) (hg : Nat.Partrec' ↑g) :
        Nat.Partrec' fun (v : Vector ℕ n) => Part.map (fun (a : ℕ) => g (a ::ᵥ v)) (f v)
        def Nat.Partrec'.Vec {n : ℕ} {m : ℕ} (f : Vector ℕ n → Vector ℕ m) :

        Analogous to Nat.Partrec' for ℕ-valued functions, a predicate for partial recursive vector-valued functions.

        Equations
        Instances For
          theorem Nat.Partrec'.nil {n : ℕ} :
          Nat.Partrec'.Vec fun (x : Vector ℕ n) => Vector.nil
          theorem Nat.Partrec'.cons {n : ℕ} {m : ℕ} {f : Vector ℕ n → ℕ} {g : Vector ℕ n → Vector ℕ m} (hf : Nat.Partrec' ↑f) (hg : Nat.Partrec'.Vec g) :
          Nat.Partrec'.Vec fun (v : Vector ℕ n) => f v ::ᵥ g v
          theorem Nat.Partrec'.comp' {n : ℕ} {m : ℕ} {f : Vector ℕ m →. ℕ} {g : Vector ℕ n → Vector ℕ m} (hf : Nat.Partrec' f) (hg : Nat.Partrec'.Vec g) :
          Nat.Partrec' fun (v : Vector ℕ n) => f (g v)
          theorem Nat.Partrec'.comp₁ {n : ℕ} (f : ℕ →. ℕ) {g : Vector ℕ n → ℕ} (hf : Nat.Partrec' fun (v : Vector ℕ 1) => f (Vector.head v)) (hg : Nat.Partrec' ↑g) :
          Nat.Partrec' fun (v : Vector ℕ n) => f (g v)
          theorem Nat.Partrec'.rfindOpt {n : ℕ} {f : Vector ℕ (n + 1) → ℕ} (hf : Nat.Partrec' ↑f) :
          Nat.Partrec' fun (v : Vector ℕ n) => Nat.rfindOpt fun (a : ℕ) => Denumerable.ofNat (Option ℕ) (f (a ::ᵥ v))