The lines of the Lean statement that state the theorem, then the definitions in the file that it uses.
Local definitions the statement names, followed through the definitions they name in turn. The match is by name in the source text, so a name reached only through notation can be missed; the full file is below.
abbreviation OAI.DepthThreeLowerBound.Cube line 9
abbrev Cube (V : Type uV) := V → Bool
abbreviation OAI.DepthThreeLowerBound.Literal line 10
abbrev Literal (V : Type uV) := V × Bool
definition OAI.DepthThreeLowerBound.Literal.eval line 16
def eval (l : Literal V) (x : Cube V) : Bool := decide (x l.1 = l.2)
abbreviation OAI.DepthThreeLowerBound.GateInput line 20
abbrev GateInput (V : Type uV) := Sum (Literal V) Bool
abbreviation OAI.DepthThreeLowerBound.RawClause line 21
abbrev RawClause (V : Type uV) := List (GateInput V)
structure OAI.DepthThreeLowerBound.Circuit3 line 39
structure Circuit3 (V : Type uV) where bottomCount : ℕ middleCount : ℕ bottom : Fin bottomCount → RawClause V middle : Fin middleCount → Finset (Fin bottomCount) top : Finset (Fin middleCount)
definition OAI.DepthThreeLowerBound.Circuit3.gateCount line 48
def gateCount (C : Circuit3 V) : ℕ := C.bottomCount + C.middleCount + 1
definition OAI.DepthThreeLowerBound.Circuit3.Computes line 59
def Computes (C : Circuit3 V) (f : Cube V → Bool) : Prop := ∀ x, C.eval x = f x
definition OAI.DepthThreeLowerBound.runSteps line 63
def runSteps {S : Type uS} (step : S → Option S) (n : ℕ) (c : Option S) : Option S := (fun oc => oc.bind step)^[n] c
inductive type OAI.DepthThreeLowerBound.HeadMove line 66
inductive HeadMove | left | stay | right
definition OAI.DepthThreeLowerBound.HeadMove.apply line 71
def HeadMove.apply {Γ : Type uGamma} [Inhabited Γ] : HeadMove → Turing.Tape Γ → Turing.Tape Γ | .left, t => t.move Turing.Dir.left | .stay, t => t | .right, t => t.move Turing.Dir.right
structure OAI.DepthThreeLowerBound.MultiTapeCfg line 76
structure MultiTapeCfg (K : Type uK) (Γ : Type uGamma) (Q : Type uQ) [Inhabited Γ] where q : Q tapes : K → Turing.Tape Γ
abbreviation OAI.DepthThreeLowerBound.MultiTapeCode line 80
abbrev MultiTapeCode (K : Type uK) (Γ : Type uGamma) (Q : Type uQ) := Q → (K → Γ) → Option (Q × (K → Γ) × (K → HeadMove))
definition OAI.DepthThreeLowerBound.multiTapeUpdate line 83
def multiTapeUpdate {K : Type uK} {Γ : Type uGamma} {Q : Type uQ} [Inhabited Γ] (c : MultiTapeCfg K Γ Q) (q : Q) (writes : K → Γ) (moves : K → HeadMove) : MultiTapeCfg K Γ Q := ⟨q, fun k => (moves k).apply ((c.tapes k).write (writes k))⟩
definition OAI.DepthThreeLowerBound.multiTapeStep line 87
def multiTapeStep {K : Type uK} {Γ : Type uGamma} {Q : Type uQ} [Inhabited Γ] (code : MultiTapeCode K Γ Q) (c : MultiTapeCfg K Γ Q) : Option (MultiTapeCfg K Γ Q) := (code c.q (fun k => (c.tapes k).head)).map fun out => multiTapeUpdate c out.1 out.2.1 out.2.2
structure OAI.DepthThreeLowerBound.FiniteMultiTapeMachine line 92
structure FiniteMultiTapeMachine where
Show the remaining 15 lines
K : Type [tapeFinite : Fintype K] [tapeDecidableEq : DecidableEq K] inputTape : K Γ : Type [alphabetInhabited : Inhabited Γ] [alphabetFinite : Fintype Γ] Q : Type [stateFinite : Fintype Q] initialState : Q inputSymbol : Bool → Γ input_injective : Function.Injective inputSymbol input_ne_blank : ∀ b, inputSymbol b ≠ default code : MultiTapeCode K Γ Q accept : Q → Bool
abbreviation OAI.DepthThreeLowerBound.FiniteMultiTapeMachine.Cfg line 115
abbrev Cfg (M : FiniteMultiTapeMachine) := MultiTapeCfg M.K M.Γ M.Q
abbreviation OAI.DepthThreeLowerBound.FiniteMultiTapeMachine.step line 117
abbrev step (M : FiniteMultiTapeMachine) : M.Cfg → Option M.Cfg := multiTapeStep M.code
definition OAI.DepthThreeLowerBound.FiniteMultiTapeMachine.init line 120
def init (M : FiniteMultiTapeMachine) (input : List Bool) : M.Cfg := ⟨M.initialState, fun k => if k = M.inputTape then Turing.Tape.mk₁ (input.map M.inputSymbol) else Turing.Tape.mk₁ []⟩
definition OAI.DepthThreeLowerBound.MultiTapeHaltsIn line 127
def MultiTapeHaltsIn (M : FiniteMultiTapeMachine) (input : List Bool) (output : Bool) (time : ℕ) : Prop := ∃ k ≤ time, ∃ c : M.Cfg, runSteps M.step k (some (M.init input)) = some c ∧ M.step c = none ∧ M.accept c.q = output