Skip to content
Browse chapters
Imports

Exact verifier-input semantics via filterMap, without certificate enumeration.

namespace CLRS.Chapter34.Turing.CookLevinnoncomputable sectionprivate theorem map_pairEncoding {α β : Type} (f : Option α → β) (c x : List α) : List.map f (pairEncoding c x) = List.map (f ∘ some) c ++ [f none] ++ List.map (f ∘ some) x := by simp [pairEncoding] private theorem map_inv_filterMap_eq_of_ne_none {α Γ : Type} (e : α ≃ Option Γ) (ys : List α) (h : ∀ y ∈ ys, e y ≠ none) : List.map (fun g => e.invFun (some g)) (ys.filterMap e) = ys := by induction ys with | nil => simp | cons y ys ih => have hy := h y (by simp) cases he : e y with | none => exact (hy he).elim | some g => have htail : ∀ z ∈ ys, e z ≠ none := by intro z hz exact h z (by simp [hz]) simp only [List.filterMap_cons, he, List.map_cons, List.cons.injEq] constructor · exact e.injective (by simp [he]) · exact ih htail private theorem verifierInputArmMatches_iff {Γ : Type} {L : Language Γ} (W : VerifierWitness L) (H : Nat) (x : List Γ) (bits : StackBits W.machine.tm H W.machine.tm.k₀) (ys : List (W.machine.tm.Γ W.machine.tm.k₀)) (hrep : bits.Represents ys) (length : Nat) : VerifierInputArmMatches W H x bits length ↔ ∃ c : List Γ, c.length = length ∧ ys = List.map W.machine.inputAlphabet.invFun (pairEncoding c x) := by constructor · rintro ⟨hfit, hheight, hprefix, hseparator, hfixed⟩ have hlen : ys.length = length + 1 + x.length := by exact (hrep.height_eq_true_iff _).mp hheight |>.symm let prefixList := ys.take length let c := prefixList.filterMap W.machine.inputAlphabet have hprefixNone : ∀ y ∈ prefixList, W.machine.inputAlphabet y ≠ none := by intro y hy hnone rcases List.mem_iff_getElem.mp hy with ⟨i, hi, hyget⟩ have hilength : i < length := by have := hi simp only [prefixList, List.length_take] at this omega have hiys : i < ys.length := by omega have hiy : ys.get ⟨i, by omega⟩ = y := by simpa [prefixList] using hyget have hcell := hprefix ⟨i, hilength⟩ have htrue := (hrep.active_cell_eq_true_iff ⟨i, by omega⟩ hiys (verifierInputSymbol W none)).2 have hsymbol : ys.get ⟨i, hiys⟩ = (verifierInputSymbol W none).val := by rw [hiy] exact W.machine.inputAlphabet.injective (by simp [hnone]) have hcontr := htrue hsymbol have hcell' : bits.cell ⟨i, by omega⟩ (verifierInputCode W none) = false := hcell change bits.cell ⟨i, by omega⟩ (verifierInputCode W none) = true at hcontr rw [hcell'] at hcontr exact Bool.noConfusion hcontr have hprefixMap : List.map (fun g => W.machine.inputAlphabet.invFun (some g)) c = prefixList := by exact map_inv_filterMap_eq_of_ne_none W.machine.inputAlphabet prefixList hprefixNone have hcLength : c.length = length := by have := congrArg List.length hprefixMap have hle : length ≤ ys.length := by omega simpa [c, prefixList, hle] using this have hsepGet : ys.get ⟨length, by omega⟩ = W.machine.inputAlphabet.invFun none := by have hactive : length < ys.length := by omega exact (hrep.active_cell_eq_true_iff ⟨length, by omega⟩ hactive (verifierInputSymbol W none)).mp hseparator have htail : ys.drop length = W.machine.inputAlphabet.invFun none :: List.map (fun g => W.machine.inputAlphabet.invFun (some g)) x := by apply List.ext_getElem · simp only [List.length_drop, List.length_cons, List.length_map] omega · intro i hi₁ hi₂ cases i with | zero => simpa using hsepGet | succ i => have hi : i < x.length := by simp only [List.length_drop] at hi₁ omega have hcellH : length + 1 + i < H := by omega have hactive : length + 1 + i < ys.length := by omega have hget := (hrep.active_cell_eq_true_iff ⟨length + 1 + i, hcellH⟩ hactive (verifierInputSymbol W (some x[i]))).mp (hfixed ⟨i, hi⟩) simpa [Nat.add_assoc, Nat.add_comm, Nat.add_left_comm] using hget refine ⟨c, hcLength, ?_⟩ calc ys = prefixList ++ ys.drop length := by change ys = ys.take length ++ ys.drop length exact (List.take_append_drop length ys).symm _ = List.map (fun g => W.machine.inputAlphabet.invFun (some g)) c ++ W.machine.inputAlphabet.invFun none :: List.map (fun g => W.machine.inputAlphabet.invFun (some g)) x := by rw [hprefixMap, htail] _ = List.map W.machine.inputAlphabet.invFun (pairEncoding c x) := by rw [map_pairEncoding] change List.map (fun g => W.machine.inputAlphabet.invFun (some g)) c ++ W.machine.inputAlphabet.invFun none :: List.map (fun g => W.machine.inputAlphabet.invFun (some g)) x = (List.map (fun g => W.machine.inputAlphabet.invFun (some g)) c ++ [W.machine.inputAlphabet.invFun none]) ++ List.map (fun g => W.machine.inputAlphabet.invFun (some g)) x exact (List.append_assoc _ [_] _).symm · rintro ⟨c, hcLength, rfl⟩ rcases hrep.eq_encode with ⟨_, hheightBound, _⟩ have hfit : length + 1 + x.length ≤ H := by simp only [List.length_map, pairEncoding_length, hcLength] at hheightBound omega refine ⟨hfit, ?_, ?_, ?_, ?_⟩ · apply (hrep.height_eq_true_iff _).2 simp only [List.length_map, pairEncoding_length, hcLength] omega · intro i have hactive : i.val < (List.map W.machine.inputAlphabet.invFun (pairEncoding c x)).length := by simp [pairEncoding, hcLength]; omega have hiff := hrep.active_cell_eq_true_iff ⟨i.val, by omega⟩ hactive (verifierInputSymbol W none) apply Bool.eq_false_of_not_eq_true intro htrue have heq := hiff.mp htrue have := congrArg W.machine.inputAlphabet heq simp [pairEncoding, hcLength] at this · apply (hrep.active_cell_eq_true_iff ⟨length, by omega⟩ (by simp [pairEncoding, hcLength]) (verifierInputSymbol W none)).2 simp [pairEncoding, hcLength] · intro i apply (hrep.active_cell_eq_true_iff ⟨length + 1 + i.val, by omega⟩ (by simp [pairEncoding, hcLength]; omega) (verifierInputSymbol W (some (x.get i)))).2 simp [pairEncoding, hcLength, Nat.add_comm, Nat.add_left_comm]

Exact semantic characterization of the verifier-input shape circuit.

theorem verifierInputShapeCircuit_eval_iff {Γ : Type} {L : Language Γ} (W : VerifierWitness L) (H : Nat) (base : CircuitBuilder) (pool : base.BoolWirePool) (inputStack : StackWires W.machine.tm H W.machine.tm.k₀) (hinputStack : inputStack.ValidIn base) (x : List Γ) (inputs : Nat → Bool) (ys : List (W.machine.tm.Γ W.machine.tm.k₀)) (hrep : (evalStackBits base inputs inputStack).Represents ys) : let result := verifierInputShapeCircuit W H base pool inputStack hinputStack x result.builder.evalWire inputs result.wire = true ↔ IsVerifierInput W x ys := by change (verifierInputShapeCircuit W H base pool inputStack hinputStack x).builder.evalWire inputs (verifierInputShapeCircuit W H base pool inputStack hinputStack x).wire = true ↔ IsVerifierInput W x ys have hstruct : (verifierInputShapeCircuit W H base pool inputStack hinputStack x).builder.evalWire inputs (verifierInputShapeCircuit W H base pool inputStack hinputStack x).wire = true ↔ ∃ length, length ≤ W.certificateBound.eval x.length ∧ VerifierInputArmMatches W H x (evalStackBits base inputs inputStack) length := verifierInputShapeCircuit_eval_iff_exists_length W H base pool inputStack hinputStack x inputs rw [hstruct] constructor · rintro ⟨length, hlength, hmatches⟩ rcases (verifierInputArmMatches_iff W H x _ ys hrep length).mp hmatches with ⟨c, hcLength, hys⟩ exact ⟨c, by omega, hys⟩ · rintro ⟨c, hcBound, hys⟩ refine ⟨c.length, hcBound, ?_⟩ exact (verifierInputArmMatches_iff W H x _ ys hrep c.length).2 ⟨c, rfl, hys⟩

Soundness wrapper for downstream assembly.

theorem verifierInputShapeCircuit_sound {Γ : Type} {L : Language Γ} (W : VerifierWitness L) (H : Nat) (base : CircuitBuilder) (pool : base.BoolWirePool) (inputStack : StackWires W.machine.tm H W.machine.tm.k₀) (hinputStack : inputStack.ValidIn base) (x : List Γ) (inputs : Nat → Bool) (ys : List (W.machine.tm.Γ W.machine.tm.k₀)) (hrep : (evalStackBits base inputs inputStack).Represents ys) (htrue : (verifierInputShapeCircuit W H base pool inputStack hinputStack x).builder.evalWire inputs (verifierInputShapeCircuit W H base pool inputStack hinputStack x).wire = true) : IsVerifierInput W x ys := (verifierInputShapeCircuit_eval_iff W H base pool inputStack hinputStack x inputs ys hrep).mp htrue

Completeness wrapper for downstream assembly.

theorem verifierInputShapeCircuit_complete {Γ : Type} {L : Language Γ} (W : VerifierWitness L) (H : Nat) (base : CircuitBuilder) (pool : base.BoolWirePool) (inputStack : StackWires W.machine.tm H W.machine.tm.k₀) (hinputStack : inputStack.ValidIn base) (x : List Γ) (inputs : Nat → Bool) (ys : List (W.machine.tm.Γ W.machine.tm.k₀)) (hrep : (evalStackBits base inputs inputStack).Represents ys) (hinput : IsVerifierInput W x ys) : let result := verifierInputShapeCircuit W H base pool inputStack hinputStack x result.builder.evalWire inputs result.wire = true := (verifierInputShapeCircuit_eval_iff W H base pool inputStack hinputStack x inputs ys hrep).mpr hinput

Evaluation of the shape output is stable in every later builder.

theorem verifierInputShapeCircuit_eval_extends {Γ : Type} {L : Language Γ} (W : VerifierWitness L) (H : Nat) (base : CircuitBuilder) (pool : base.BoolWirePool) (inputStack : StackWires W.machine.tm H W.machine.tm.k₀) (hinputStack : inputStack.ValidIn base) (x : List Γ) (inputs : Nat → Bool) {next : CircuitBuilder} (hext : (verifierInputShapeCircuit W H base pool inputStack hinputStack x).builder.Extends next) : next.evalWire inputs (verifierInputShapeCircuit W H base pool inputStack hinputStack x).wire = (verifierInputShapeCircuit W H base pool inputStack hinputStack x).builder.evalWire inputs (verifierInputShapeCircuit W H base pool inputStack hinputStack x).wire := hext.evalWire_eq inputs (verifierInputShapeCircuit_wireValid W H base pool inputStack hinputStack x)

The output value is independent of the proof supplied for input-stack wire validity.

theorem verifierInputShapeCircuit_eval_proof_irrel {Γ : Type} {L : Language Γ} (W : VerifierWitness L) (H : Nat) (base : CircuitBuilder) (pool : base.BoolWirePool) (inputStack : StackWires W.machine.tm H W.machine.tm.k₀) (hinputStack₁ hinputStack₂ : inputStack.ValidIn base) (x : List Γ) (inputs : Nat → Bool) : (verifierInputShapeCircuit W H base pool inputStack hinputStack₁ x).builder.evalWire inputs (verifierInputShapeCircuit W H base pool inputStack hinputStack₁ x).wire = (verifierInputShapeCircuit W H base pool inputStack hinputStack₂ x).builder.evalWire inputs (verifierInputShapeCircuit W H base pool inputStack hinputStack₂ x).wire := by rw [verifierInputShapeCircuit_proof_irrel W H base pool inputStack hinputStack₁ hinputStack₂ x]
endend CLRS.Chapter34.Turing.CookLevin