Plectis Atlas
Search

↑ and ↓ move, Enter opens, Esc closes.

Lean statement

Thomason model structures and nerve detection in all positive strict dimensions

Lean is a language for mathematical statements and proofs that a computer can verify. This page shows one statement file from OpenAI’s release, possible paper matches and independent reports. The code-like names below identify the definitions or theorems selected by the proof-verification settings.

Theorems selected for verification: OAI.Thomason.main OAI.Thomason.nerveDetection_allDimensions

Lean statement file: ThomasonModelStructures.leanShow on the mapOpenAI’s Lean catalogue does not list this as a main result; the release’s Lean notes for family 317 link it.

The Lean statement

The lines of the Lean statement that state the theorem, then the definitions in the file that it uses.

theorem Thomason.main : OAI.Thomason.FullMain.{u} := by  sorrytheorem Thomason.nerveDetection_allDimensions :    OAI.Thomason.thomasonWeakEquivalences.{u} =      OAI.Thomason.simplicialWeakEquivalences.inverseImage OAI.Thomason.streetNerveFunctor ∧    ∀ n : ℕ, OAI.Thomason.thomasonWeakEquivalencesFinite.{u} n =      OAI.Thomason.simplicialWeakEquivalences.inverseImage (OAI.Thomason.streetNerveFinite n) := by  sorry

A Lean statement states the theorem and leaves its proof as sorry on purpose. OpenAI’s proof is in a separate solution module, and a program called Comparator checks that proof against this statement.

Definitions needed to read it

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.

  • structure OAI.Thomason.OmegaCategory line 12

    structure OmegaCategory where
    Show the remaining 39 lines
      Cell : Type u  source : ℕ → Cell → Cell  target : ℕ → Cell → Cell  source_source (i j : ℕ) (x : Cell) : source i (source j x) = source (min i j) x  target_target (i j : ℕ) (x : Cell) : target i (target j x) = target (min i j) x  source_target (i j : ℕ) (x : Cell) :    source i (target j x) = if i < j then source i x else target j x  target_source (i j : ℕ) (x : Cell) :    target i (source j x) = if i < j then target i x else source j x  comp (k : ℕ) (x y : Cell) : target k x = source k y → Cell  source_comp_le (i k : ℕ) (hik : i ≤ k) (x y : Cell)      (h : target k x = source k y) : source i (comp k x y h) = source i x  target_comp_le (i k : ℕ) (hik : i ≤ k) (x y : Cell)      (h : target k x = source k y) : target i (comp k x y h) = target i y  source_comp_gt (i k : ℕ) (hki : k < i) (x y : Cell)      (h : target k x = source k y)      (hs : target k (source i x) = source k (source i y)) :    source i (comp k x y h) = comp k (source i x) (source i y) hs  target_comp_gt (i k : ℕ) (hki : k < i) (x y : Cell)      (h : target k x = source k y)      (ht : target k (target i x) = source k (target i y)) :    target i (comp k x y h) = comp k (target i x) (target i y) ht  unit_left (k : ℕ) (x : Cell) (h : target k (source k x) = source k x) :    comp k (source k x) x h = x  unit_right (k : ℕ) (x : Cell) (h : target k x = source k (target k x)) :    comp k x (target k x) h = x  assoc (k : ℕ) (x y z : Cell)      (hxy : target k x = source k y) (hyz : target k y = source k z)      (hxy_z : target k (comp k x y hxy) = source k z)      (hx_yz : target k x = source k (comp k y z hyz)) :    comp k (comp k x y hxy) z hxy_z = comp k x (comp k y z hyz) hx_yz  interchange (k l : ℕ) (hkl : k < l) (a b c d : Cell)      (hab : target l a = source l b) (hcd : target l c = source l d)      (hac : target k a = source k c) (hbd : target k b = source k d)      (hab_cd : target k (comp l a b hab) = source k (comp l c d hcd))      (hac_bd : target l (comp k a c hac) = source l (comp k b d hbd)) :    comp k (comp l a b hab) (comp l c d hcd) hab_cd =      comp l (comp k a c hac) (comp k b d hbd) hac_bd  finite_dimension (x : Cell) : ∃ k, source k x = x
  • structure OAI.Thomason.OmegaCategory.Functor line 62

    structure Functor (C : OAI.Thomason.OmegaCategory.{u}) (D : OAI.Thomason.OmegaCategory.{v}) where  map : C.Cell → D.Cell  map_source (k : ℕ) (x : C.Cell) : map (C.source k x) = D.source k (map x)  map_target (k : ℕ) (x : C.Cell) : map (C.target k x) = D.target k (map x)  map_comp (k : ℕ) (x y : C.Cell) (h : C.target k x = C.source k y)      (h' : D.target k (map x) = D.source k (map y)) :    map (C.comp k x y h) = D.comp k (map x) (map y) h'
  • definition OAI.Thomason.OmegaCategory.Functor.id line 79

    noncomputable def id (C : OAI.Thomason.OmegaCategory.{u}) : OAI.Thomason.OmegaCategory.Functor C C where  map x := x  map_source _ _ := rfl  map_target _ _ := rfl  map_comp _ _ _ _ _ := rfl
  • definition OAI.Thomason.OmegaCategory.Functor.comp line 85

    noncomputable def comp (F : OAI.Thomason.OmegaCategory.Functor C D) (G : OAI.Thomason.OmegaCategory.Functor D B) : OAI.Thomason.OmegaCategory.Functor C B := by
    Show the remaining 12 lines
      classical  have proof_map_composable_0 {C : OAI.Thomason.OmegaCategory.{u}} {D : OAI.Thomason.OmegaCategory.{v}}  (F : OAI.Thomason.OmegaCategory.Functor C D) {k : ℕ} {x y : C.Cell}      (h : C.target k x = C.source k y) :      D.target k (F.map x) = D.source k (F.map y) := by    rw [← F.map_target, ← F.map_source, h]  exact {    map x := G.map (F.map x)    map_source k x := by rw [F.map_source, G.map_source]    map_target k x := by rw [F.map_target, G.map_target]    map_comp k x y h h' := by      rw [F.map_comp k x y h (proof_map_composable_0 F h), G.map_comp]  }
  • definition OAI.Thomason.OmegaCategory.IsTruncated line 112

    noncomputable def IsTruncated (n : ℕ) : Prop := ∀ x : C.Cell, C.source n x = x
  • definition OAI.Thomason.OmegaCategory.NCategory line 114

    noncomputable def NCategory (n : ℕ) := {C : OAI.Thomason.OmegaCategory.{u} // C.IsTruncated n}
  • structure OAI.Thomason.DirectedComplex line 129

    structure DirectedComplex where  Chain : ℕ → Type u  group : ∀ p, AddCommGroup (Chain p)  d : (p : ℕ) → Chain (p+1) →+ Chain p  d_d (p : ℕ) (x : Chain (p+2)) : d p (d (p+1) x) = 0  augmentation : Chain 0 →+ ℤ  augmentation_d (x : Chain 1) : augmentation (d 0 x) = 0  positive : (p : ℕ) → AddSubmonoid (Chain p)
  • structure OAI.Thomason.DirectedComplex.Hom line 148

    structure Hom (K : OAI.Thomason.DirectedComplex.{u}) (L : OAI.Thomason.DirectedComplex.{v}) where  map (p : ℕ) : K.Chain p →+ L.Chain p  map_d (p : ℕ) (x : K.Chain (p+1)) : map p (K.d p x) = L.d p (map (p+1) x)  map_augmentation (x : K.Chain 0) : L.augmentation (map 0 x) = K.augmentation x  map_positive (p : ℕ) (x : K.Chain p) : x ∈ K.positive p → map p x ∈ L.positive p
  • structure OAI.Thomason.DirectedComplex.Table line 189

    structure Table (K : OAI.Thomason.DirectedComplex.{u}) where  row : (p : ℕ) → Bool → K.Chain p  positive (p : ℕ) (b : Bool) : row p b ∈ K.positive p  boundary (p : ℕ) (b : Bool) :    K.d p (row (p+1) b) = row p true - row p false  augmentation (b : Bool) : K.augmentation (row 0 b) = 1  bounded : ∃ k, ∀ p, k < p → ∀ b, row p b = 0
  • definition OAI.Thomason.DirectedComplex.Table.truncate line 205

    noncomputable def truncate (k : ℕ) (e : Bool) (x : OAI.Thomason.DirectedComplex.Table K) : OAI.Thomason.DirectedComplex.Table K where
    Show the remaining 28 lines
      row p b := if p < k then x.row p b else if p = k then x.row p e else 0  positive p b := by    split_ifs <;> first | exact x.positive _ _ | exact (K.positive _).zero_mem  boundary p b := by    by_cases hp : p < k    · by_cases hp' : p+1 < k      · simp only [hp, hp', ite_eq_left]        exact x.boundary p b      · have he : p+1 = k := by omega        simp only [ite_eq_left hp, ite_eq_right hp', ite_eq_left he]        exact x.boundary p e    · by_cases he : p = k      · have hp' : ¬p+1 < k := by omega        have he' : ¬p+1 = k := by omega        simp only [ite_eq_right hp, ite_eq_right hp', ite_eq_right he', ite_eq_left he, map_zero, sub_self]      · have hp' : ¬p+1 < k := by omega        have he' : ¬p+1 = k := by omega        simp only [hp, hp', he', he, ite_false, map_zero, sub_self]  augmentation b := by    by_cases hk : k = 0    · subst k      simpa using x.augmentation e    · have hk' : 0 < k := Nat.pos_of_ne_zero hk      simpa only [hk', ite_eq_left] using x.augmentation b  bounded := by    refine ⟨k, ?_⟩    intro p hp b    simp only [show ¬p < k by omega, show ¬p = k by omega, ite_false]
  • definition OAI.Thomason.DirectedComplex.nu line 309

    noncomputable def nu (K : OAI.Thomason.DirectedComplex.{u}) : OAI.Thomason.OmegaCategory.{u} := by
    Show the remaining 191 lines
      classical  have proof_truncate_row_3 {K : OAI.Thomason.DirectedComplex.{u}}  (k : ℕ) (e : Bool) (x : OAI.Thomason.DirectedComplex.Table K) (p : ℕ) (b : Bool) :      (OAI.Thomason.DirectedComplex.Table.truncate k e x).row p b =        if p < k then x.row p b else if p = k then x.row p e else 0 := rfl  have proof_truncate_truncate_5 {K : OAI.Thomason.DirectedComplex.{u}}  (i j : ℕ) (e f : Bool) (x : OAI.Thomason.DirectedComplex.Table K) :      OAI.Thomason.DirectedComplex.Table.truncate i e (OAI.Thomason.DirectedComplex.Table.truncate j f x) =        if i < j then OAI.Thomason.DirectedComplex.Table.truncate i e x else OAI.Thomason.DirectedComplex.Table.truncate j f x := by    ext p b    by_cases hij : i < j    · simp only [hij, ite_eq_left, OAI.Thomason.DirectedComplex.Table.truncate]      by_cases hpi : p < i      · have hpj : p < j := lt_trans hpi hij        simp [hpi, hpj]      · by_cases hpe : p = i        · subst p          simp [hij]        · simp [hpi, hpe]    · simp only [hij, ite_false, OAI.Thomason.DirectedComplex.Table.truncate]      by_cases hpj : p < j      · have hpi : p < i := by omega        simp [hpj, hpi]      · by_cases hpje : p = j        · subst p          by_cases hji : j < i          · simp [hji]          · have hi : i = j := by omega            subst i            simp []        · by_cases hpi : p < i          · simp [hpi, hpj, hpje]          · by_cases hpie : p = i            · subst p              simp [hij]            · simp [hpi, hpie, hpj, hpje]  have proof_truncate_truncate_same_4 {K : OAI.Thomason.DirectedComplex.{u}}  (i j : ℕ) (e : Bool) (x : OAI.Thomason.DirectedComplex.Table K) :      OAI.Thomason.DirectedComplex.Table.truncate i e (OAI.Thomason.DirectedComplex.Table.truncate j e x) = OAI.Thomason.DirectedComplex.Table.truncate (min i j) e x := by    rw [proof_truncate_truncate_5]    split_ifs with h    · rw [min_eq_left (le_of_lt h)]    · rw [min_eq_right (le_of_not_gt h)]  have proof_comp_row_14 {K : OAI.Thomason.DirectedComplex.{u}}  (k : ℕ) (x y : OAI.Thomason.DirectedComplex.Table K)      (h : OAI.Thomason.DirectedComplex.Table.truncate k true x = OAI.Thomason.DirectedComplex.Table.truncate k false y) (p : ℕ) (b : Bool) :      (OAI.Thomason.DirectedComplex.Table.comp k x y h).row p b = if p < k then x.row p b else if p = k then        (if b then y.row p true else x.row p false) else x.row p b + y.row p b := rfl  have proof_source_comp_le_6 {K : OAI.Thomason.DirectedComplex.{u}}  (i k : ℕ) (hik : i ≤ k) (x y : OAI.Thomason.DirectedComplex.Table K)      (h : OAI.Thomason.DirectedComplex.Table.truncate k true x = OAI.Thomason.DirectedComplex.Table.truncate k false y) :      OAI.Thomason.DirectedComplex.Table.truncate i false (OAI.Thomason.DirectedComplex.Table.comp k x y h) = OAI.Thomason.DirectedComplex.Table.truncate i false x := by    ext p b    by_cases hpi : p < i    · have hpk : p < k := lt_of_lt_of_le hpi hik      simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp, hpi, hpk]    · by_cases hpe : p = i      · subst p        by_cases hik' : i < k        · simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp, hik']        · have he : i = k := by omega          subst i          simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp]      · simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp, hpi, hpe]  have proof_lower_rows_eq_1 {K : OAI.Thomason.DirectedComplex.{u}}  {k : ℕ} {x y : OAI.Thomason.DirectedComplex.Table K}      (h : OAI.Thomason.DirectedComplex.Table.truncate k true x = OAI.Thomason.DirectedComplex.Table.truncate k false y) {p : ℕ} (hp : p < k) (b : Bool) :      x.row p b = y.row p b := by    have hr := congrArg (fun z : OAI.Thomason.DirectedComplex.Table K => z.row p b) h    simpa only [OAI.Thomason.DirectedComplex.Table.truncate, hp, ite_eq_left] using hr  have proof_target_comp_le_7 {K : OAI.Thomason.DirectedComplex.{u}}  (i k : ℕ) (hik : i ≤ k) (x y : OAI.Thomason.DirectedComplex.Table K)      (h : OAI.Thomason.DirectedComplex.Table.truncate k true x = OAI.Thomason.DirectedComplex.Table.truncate k false y) :      OAI.Thomason.DirectedComplex.Table.truncate i true (OAI.Thomason.DirectedComplex.Table.comp k x y h) = OAI.Thomason.DirectedComplex.Table.truncate i true y := by    ext p b    by_cases hpi : p < i    · have hpk : p < k := lt_of_lt_of_le hpi hik      simp only [OAI.Thomason.DirectedComplex.Table.truncate, ite_eq_left hpi, OAI.Thomason.DirectedComplex.Table.comp, ite_eq_left hpk]      exact proof_lower_rows_eq_1 h hpk b    · by_cases hpe : p = i      · subst p        by_cases hik' : i < k        · simpa [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp, hik'] using proof_lower_rows_eq_1 h hik' true        · have he : i = k := by omega          subst i          simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp]      · simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp, hpi, hpe]  have proof_truncate_comp_gt_8 {K : OAI.Thomason.DirectedComplex.{u}}  (i k : ℕ) (hki : k < i) (e : Bool) (x y : OAI.Thomason.DirectedComplex.Table K)      (h : OAI.Thomason.DirectedComplex.Table.truncate k true x = OAI.Thomason.DirectedComplex.Table.truncate k false y)      (h' : OAI.Thomason.DirectedComplex.Table.truncate k true (OAI.Thomason.DirectedComplex.Table.truncate i e x) = OAI.Thomason.DirectedComplex.Table.truncate k false (OAI.Thomason.DirectedComplex.Table.truncate i e y)) :      OAI.Thomason.DirectedComplex.Table.truncate i e (OAI.Thomason.DirectedComplex.Table.comp k x y h) = OAI.Thomason.DirectedComplex.Table.comp k (OAI.Thomason.DirectedComplex.Table.truncate i e x) (OAI.Thomason.DirectedComplex.Table.truncate i e y) h' := by    ext p b    by_cases hpk : p < k    · have hpi : p < i := lt_trans hpk hki      simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp, hpk, hpi]    · by_cases hpe : p = k      · subst p        simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp, hki]      · by_cases hpi : p < i        · simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp, hpk, hpe, hpi]        · by_cases hpie : p = i          · subst p            have hik : ¬i < k := by omega            have hie : ¬i = k := by omega            simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp, hik, hie]          · simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp, hpk, hpe, hpi, hpie]  have proof_unit_left_9 {K : OAI.Thomason.DirectedComplex.{u}}  (k : ℕ) (x : OAI.Thomason.DirectedComplex.Table K)      (h : OAI.Thomason.DirectedComplex.Table.truncate k true (OAI.Thomason.DirectedComplex.Table.truncate k false x) = OAI.Thomason.DirectedComplex.Table.truncate k false x) :      OAI.Thomason.DirectedComplex.Table.comp k (OAI.Thomason.DirectedComplex.Table.truncate k false x) x h = x := by    ext p b    by_cases hp : p < k    · simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp, hp]    · by_cases he : p = k      · subst p        cases b <;> simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp]      · simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp, hp, he]  have proof_unit_right_10 {K : OAI.Thomason.DirectedComplex.{u}}  (k : ℕ) (x : OAI.Thomason.DirectedComplex.Table K)      (h : OAI.Thomason.DirectedComplex.Table.truncate k true x = OAI.Thomason.DirectedComplex.Table.truncate k false (OAI.Thomason.DirectedComplex.Table.truncate k true x)) :      OAI.Thomason.DirectedComplex.Table.comp k x (OAI.Thomason.DirectedComplex.Table.truncate k true x) h = x := by    ext p b    by_cases hp : p < k    · simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp, hp]    · by_cases he : p = k      · subst p        cases b <;> simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp]      · simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp, hp, he]  have proof_assoc_11 {K : OAI.Thomason.DirectedComplex.{u}}  (k : ℕ) (x y z : OAI.Thomason.DirectedComplex.Table K)      (hxy : OAI.Thomason.DirectedComplex.Table.truncate k true x = OAI.Thomason.DirectedComplex.Table.truncate k false y)      (hyz : OAI.Thomason.DirectedComplex.Table.truncate k true y = OAI.Thomason.DirectedComplex.Table.truncate k false z)      (hxy_z : OAI.Thomason.DirectedComplex.Table.truncate k true (OAI.Thomason.DirectedComplex.Table.comp k x y hxy) = OAI.Thomason.DirectedComplex.Table.truncate k false z)      (hx_yz : OAI.Thomason.DirectedComplex.Table.truncate k true x = OAI.Thomason.DirectedComplex.Table.truncate k false (OAI.Thomason.DirectedComplex.Table.comp k y z hyz)) :      OAI.Thomason.DirectedComplex.Table.comp k (OAI.Thomason.DirectedComplex.Table.comp k x y hxy) z hxy_z = OAI.Thomason.DirectedComplex.Table.comp k x (OAI.Thomason.DirectedComplex.Table.comp k y z hyz) hx_yz := by    ext p b    by_cases hp : p < k    · simp [OAI.Thomason.DirectedComplex.Table.comp, hp]    · by_cases he : p = k      · subst p        cases b <;> simp [OAI.Thomason.DirectedComplex.Table.comp]      · simp [OAI.Thomason.DirectedComplex.Table.comp, hp, he, add_assoc]  have proof_interchange_12 {K : OAI.Thomason.DirectedComplex.{u}}  (k l : ℕ) (hkl : k < l) (a b c d : OAI.Thomason.DirectedComplex.Table K)      (hab : OAI.Thomason.DirectedComplex.Table.truncate l true a = OAI.Thomason.DirectedComplex.Table.truncate l false b)      (hcd : OAI.Thomason.DirectedComplex.Table.truncate l true c = OAI.Thomason.DirectedComplex.Table.truncate l false d)      (hac : OAI.Thomason.DirectedComplex.Table.truncate k true a = OAI.Thomason.DirectedComplex.Table.truncate k false c)      (hbd : OAI.Thomason.DirectedComplex.Table.truncate k true b = OAI.Thomason.DirectedComplex.Table.truncate k false d)      (hab_cd : OAI.Thomason.DirectedComplex.Table.truncate k true (OAI.Thomason.DirectedComplex.Table.comp l a b hab) = OAI.Thomason.DirectedComplex.Table.truncate k false (OAI.Thomason.DirectedComplex.Table.comp l c d hcd))      (hac_bd : OAI.Thomason.DirectedComplex.Table.truncate l true (OAI.Thomason.DirectedComplex.Table.comp k a c hac) = OAI.Thomason.DirectedComplex.Table.truncate l false (OAI.Thomason.DirectedComplex.Table.comp k b d hbd)) :      OAI.Thomason.DirectedComplex.Table.comp k (OAI.Thomason.DirectedComplex.Table.comp l a b hab) (OAI.Thomason.DirectedComplex.Table.comp l c d hcd) hab_cd =        OAI.Thomason.DirectedComplex.Table.comp l (OAI.Thomason.DirectedComplex.Table.comp k a c hac) (OAI.Thomason.DirectedComplex.Table.comp k b d hbd) hac_bd := by    ext p e    by_cases hpk : p < k    · have hpl : p < l := lt_trans hpk hkl      simp [OAI.Thomason.DirectedComplex.Table.comp, hpk, hpl]    · by_cases hpe : p = k      · subst p        cases e <;> simp [OAI.Thomason.DirectedComplex.Table.comp, hkl]      · by_cases hpl : p < l        · simp [OAI.Thomason.DirectedComplex.Table.comp, hpk, hpe, hpl]        · by_cases hple : p = l          · subst p            have hlk : ¬l < k := by omega            have hlke : ¬l = k := by omega            cases e <;> simp [OAI.Thomason.DirectedComplex.Table.comp, hlk, hlke]          · simp only [OAI.Thomason.DirectedComplex.Table.comp, ite_eq_right hpk, ite_eq_right hpe, ite_eq_right hpl, ite_eq_right hple]            abel  have proof_finite_dimension_13 {K : OAI.Thomason.DirectedComplex.{u}}  (x : OAI.Thomason.DirectedComplex.Table K) : ∃ k, OAI.Thomason.DirectedComplex.Table.truncate k false x = x := by    obtain ⟨k, hk⟩ := x.bounded    have ht : x.row k true = x.row k false := by      have hb := x.boundary k false      rw [hk (k+1) (by omega) false, map_zero] at hb      exact sub_eq_zero.mp hb.symm    refine ⟨k, ?_⟩    ext p b    by_cases hp : p < k    · simp [OAI.Thomason.DirectedComplex.Table.truncate, hp]    · by_cases he : p = k      · subst p        cases b <;> simp [OAI.Thomason.DirectedComplex.Table.truncate, ht]      · have hkp : k < p := by omega        simp [OAI.Thomason.DirectedComplex.Table.truncate, hp, he, hk p hkp b]  exact {    Cell := OAI.Thomason.DirectedComplex.Table K    source k := OAI.Thomason.DirectedComplex.Table.truncate k false    target k := OAI.Thomason.DirectedComplex.Table.truncate k true    source_source i j x := proof_truncate_truncate_same_4 i j false x    target_target i j x := proof_truncate_truncate_same_4 i j true x    source_target i j x := proof_truncate_truncate_5 i j false true x    target_source i j x := proof_truncate_truncate_5 i j true false x    comp := OAI.Thomason.DirectedComplex.Table.comp    source_comp_le := proof_source_comp_le_6    target_comp_le := proof_target_comp_le_7    source_comp_gt i k hki x y h hs := proof_truncate_comp_gt_8 i k hki false x y h hs    target_comp_gt i k hki x y h ht := proof_truncate_comp_gt_8 i k hki true x y h ht    unit_left := proof_unit_left_9    unit_right := proof_unit_right_10    assoc := proof_assoc_11    interchange := proof_interchange_12    finite_dimension := proof_finite_dimension_13  }
  • definition OAI.Thomason.DirectedComplex.nuFunctor line 559

    noncomputable def nuFunctor : CategoryTheory.Functor OAI.Thomason.DirectedComplex.{u} OAI.Thomason.OmegaCategory.{u} where
    Show the remaining 10 lines
      obj := OAI.Thomason.DirectedComplex.nu  map := OAI.Thomason.DirectedComplex.Hom.nu  map_id K := by    change OAI.Thomason.DirectedComplex.Hom.nu (OAI.Thomason.DirectedComplex.Hom.id K) = OAI.Thomason.OmegaCategory.Functor.id K.nu    ext x    rfl  map_comp f g := by    change OAI.Thomason.DirectedComplex.Hom.nu (OAI.Thomason.DirectedComplex.Hom.comp f g) = OAI.Thomason.OmegaCategory.Functor.comp f.nu g.nu    ext x    rfl
  • abbreviation OAI.Thomason.NormalizedChains.Word line 579

    noncomputable abbrev Word (E : Type u) [PartialOrder E] :=  {l : List E // l.Pairwise (· < ·)}
  • abbreviation OAI.Thomason.NormalizedChains.Chains line 582

    noncomputable abbrev Chains (E : Type u) [PartialOrder E] := OAI.Thomason.NormalizedChains.Word E →₀ ℤ
  • definition OAI.Thomason.NormalizedChains.bracket line 584

    noncomputable def bracket (l : List E) : OAI.Thomason.NormalizedChains.Chains E := by  classical  exact if h : l.Pairwise (· < ·) then Finsupp.single ⟨l, h⟩ 1 else 0
  • definition OAI.Thomason.NormalizedChains.prepend line 588

    noncomputable def prepend (a : E) : OAI.Thomason.NormalizedChains.Chains E →ₗ[ℤ] OAI.Thomason.NormalizedChains.Chains E :=  Finsupp.linearCombination ℤ (fun l : OAI.Thomason.NormalizedChains.Word E => OAI.Thomason.NormalizedChains.bracket (a :: l.val))
  • definition OAI.Thomason.NormalizedChains.wordBoundary line 591

    noncomputable def wordBoundary : List E → OAI.Thomason.NormalizedChains.Chains E  | [] => 0  | a :: l => OAI.Thomason.NormalizedChains.bracket l - OAI.Thomason.NormalizedChains.prepend a (wordBoundary l)
  • definition OAI.Thomason.NormalizedChains.boundary line 595

    noncomputable def boundary : OAI.Thomason.NormalizedChains.Chains E →ₗ[ℤ] OAI.Thomason.NormalizedChains.Chains E :=  Finsupp.linearCombination ℤ (fun l : OAI.Thomason.NormalizedChains.Word E => OAI.Thomason.NormalizedChains.wordBoundary l.val)
  • definition OAI.Thomason.NormalizedChains.faces line 608

    noncomputable def faces (H : List E → M) : List E → M  | [] => 0  | a :: l => H l - faces (fun m => H (a :: m)) l
  • definition OAI.Thomason.NormalizedChains.grade line 620

    noncomputable def grade (k : ℕ) : Submodule ℤ (OAI.Thomason.NormalizedChains.Chains E) :=  Finsupp.supported ℤ ℤ {w : OAI.Thomason.NormalizedChains.Word E | w.val.length = k}
  • definition OAI.Thomason.NormalizedChains.emptyWord line 623

    noncomputable def emptyWord : OAI.Thomason.NormalizedChains.Word E := ⟨[], List.Pairwise.nil⟩
  • definition OAI.Thomason.NormalizedChains.emptyCoefficient line 625

    noncomputable def emptyCoefficient : OAI.Thomason.NormalizedChains.Chains E →ₗ[ℤ] ℤ := Finsupp.lapply OAI.Thomason.NormalizedChains.emptyWord
  • definition OAI.Thomason.NormalizedChains.Positive line 627

    noncomputable def Positive (c : OAI.Thomason.NormalizedChains.Chains E) : Prop := ∀ l, 0 ≤ c l
  • definition OAI.Thomason.NormalizedChains.positiveGrade line 629

    noncomputable def positiveGrade (p : ℕ) : AddSubmonoid (OAI.Thomason.NormalizedChains.grade (E := E) (p+1)) where  carrier := {c | Positive c.val}  zero_mem' _ := le_rfl  add_mem' ha hb w := add_nonneg (ha w) (hb w)

70 more definitions are reached the same way; the full file lists them.

Possible paper match, with no recorded review

No paper statement clearly matched the Lean wording. Statement Map, the program that collects Atlas’s source records, selected this possible match using words in OpenAI’s catalogue and Lean note. No review of whether the statements mean the same thing is recorded.

Shared with the catalogue’s wording or OpenAI’s note, none of them matched in the Lean text: combinatorial, model, proper, quillen and structure.

Theorem 1.1 of Thomason Model Structures in Every Strict Higher Dimension

Theorem

For every n\in\{1,2,3,\ldots\}\cup\{\infty\}, the classes (C_n,W_n,F_n) in (eq:prescribed-classes) form a proper combinatorial model structure on \nCat. It is cofibrantly generated by (L_nI,L_nJ), where

I=\{\partial\Delta[m]\hookrightarrow\Delta[m]:m\ge0\},\qquad J=\{\Lambda^k[m]\hookrightarrow\Delta[m]:m\ge1,\ 0\le k\le m\}.

Moreover,

L_n:\sSet_{\KQ}\rightleftarrows(\nCat,C_n,W_n,F_n):R_n

is a Quillen equivalence.

Section 1, Introduction Read it in the paper TeX source, line 41
Show the TeX
For every $n\in\{1,2,3,\ldots\}\cup\{\infty\}$, the classes
$(C_n,W_n,F_n)$ in \eqref{eq:prescribed-classes} form a proper
combinatorial model structure on $\nCat$. It is cofibrantly generated by
$(L_nI,L_nJ)$, where
\[
 I=\{\partial\Delta[m]\hookrightarrow\Delta[m]:m\ge0\},\qquad
 J=\{\Lambda^k[m]\hookrightarrow\Delta[m]:m\ge1,\ 0\le k\le m\}.
\]
Moreover,
\[
 L_n:\sSet_{\KQ}\rightleftarrows(\nCat,C_n,W_n,F_n):R_n
\]
is a Quillen equivalence.

Other possible paper matches, closest wording first

  • Proposition 5.3 of Thomason Model Structures in Every Strict Higher Dimension. Words of the Lean statement, its names split into words, that also appear in the theorem: homotopy, natural, unit, adjunction, finite, street and two more. Shared only with the release’s name for the Lean statement or OpenAI’s note on it: small.
  • Proposition A.3 of Thomason Model Structures in Every Strict Higher Dimension. Words of the Lean statement, its names split into words, that also appear in the theorem: complete, colimits, bound, cocomplete, presentable, locally and four more. Shared only with the release’s name for the Lean statement or OpenAI’s note on it: small.
  • Proposition 7.4 of Thomason Model Structures in Every Strict Higher Dimension. Words of the Lean statement, its names split into words, that also appear in the theorem: sd, simplicial, two, unit, street, weak and two more.
  • Proposition 6.1 of Thomason Model Structures in Every Strict Higher Dimension. Words of the Lean statement, its names split into words, that also appear in the theorem: upward, monomorphism, simplicial, natural, functor, street and three more. Shared only with the release’s name for the Lean statement or OpenAI’s note on it: small.
  • Corollary 6.4 of Thomason Model Structures in Every Strict Higher Dimension. Words of the Lean statement, its names split into words, that also appear in the theorem: horn, inclusion and pushout.
  • Theorem 7.5 of Thomason Model Structures in Every Strict Higher Dimension. Words of the Lean statement, its names split into words, that also appear in the theorem: quillen, adjunction and equivalence.

How Atlas selects possible matches: it compares words in the Lean statement with every statement in the family. It also splits Lean names into words. The release’s label and note receive less weight; a main theorem wins a close match. If the Lean wording yields no clear match, Atlas uses the catalogue description. This selects passages to compare; it does not establish that they mean the same thing.

Reported Comparator runs

two independent groups report that Comparator accepted runs for this Lean statement file: Carlos Toledo’s cert-machine; MathVet. Each group reports its own Comparator run for this statement file. Atlas has not repeated the runs.

For a configured theorem, Comparator tests whether OpenAI’s proof proves the exact Lean statement. Some files instead configure definitions for comparison by name and type. Acceptance does not establish that the statement means the same thing as the paper’s theorem.

Carlos Toledo’s cert-machine

How they ran it, in their words

Every Comparator challenge re-run on Linux with nanoda switched on, decided by a preregistered rule; every family’s challenge statements read against OpenAI’s headline, clause by clause. Decider: Comparator (leanprover/comparator d03acab1 = tag v4.34.0, built with the release’s toolchain v4.34.1), lean4export 076e8e57, landrun 811cfff5, nanoda_lib 3a240721 — on GitHub’s Linux runners (.github/workflows/openai-math-kernel.yml), one j…

  • Accepted Their term: “CERTIFIED”.

    Re-run through Comparator with the independent nanoda kernel switched on: Lean’s kernel and nanoda both accept OpenAI’s solution.

    Reported 10 October 2026, at the release version shown here. Original verification report

MathVet

How they ran it, in their words

An independent, model-assisted, pre-referee reading of each family’s challenge statements against its headline claim under a published rubric (PROTOCOL.md), with its own Comparator runs per challenge. Its protocol describes a planned error-rate study; this import does not establish that the study has been completed.

  • Accepted Their term: “comparator-sandboxed-pass”.

    Re-run through Comparator in a sandboxed virtual machine: accepted.

    Reported 8 October 2026, at the release version shown here. Original verification report

What an accepted Comparator run would establish

If Comparator is run under this configuration and accepts, the solution proves the configured theorem using only the allowed axioms, and the Lean kernel accepts every step.

This configuration lists no definition holes, so every definition the statement uses is compared as it is written in this file.

Allowed axioms: propext, Quot.sound, Classical.choice

Acceptance leaves open whether the Lean statement means the same thing as the paper’s theorem, whether the paper’s other claims are correct, and whether the result is new. Those questions require comparing the definitions and statements, reviewing the paper’s arguments, and reading the earlier literature.

Do family 317’s Lean statements express the advertised result?

These assessments compare all the family’s Lean statements with the whole result OpenAI describes in its catalogue. They do not assess this statement alone. Each group uses its own published rules.

MathVet and cert-machine agree on how much of the advertised result the Lean statements express.

  • MathVet

    Finds the whole advertised result stated or implied Their term: “full”.

    The challenge statements imply the headline claim after unpacking definitions or one routine step. Their record

    Their note: Thomason.main : FullMain asserts, for strict ω-categories and for every n ≥ 1 for n-categories (NCategory n), an ExactModelEndpoint for the adjunction (Sd² ⋙ categorification) ⊣ (Street nerve ⋙ Ex ⋙ Ex): a model structure with weak equivalences and fibrations created by the right adjoint, cofibrantly generated by boundary/horn images, complete, cocomplete, locally presentable, left and right proper, with the Quillen-equivalence criterion against simplicial sets (plus the Kan-Quillen model on SSet). nerveDetection_allDimensions identifies the weak equivalences with Street-nerve detection for ω and every n, matching the summary and docs.

    Definitions the group asks readers to compare with the paper: structure OmegaCategory (cells with source/target : ℕ → Cell → Cell, partial comp k, interchange, finite_dimension : ∃ k, source k x = x) and NCategory n := {C // ∀ x, C.source n x = x} are hand-built strict globular ω-/n-categories (no Mathlib counterpart); Classical.choose only picks cell dimensions in the presentation colimit ; ExactModelEndpoint bundles the model structure, its classes and the Quillen-equivalence criterion by hand (quillenEquivalence : ∀ K Y fibrant, ∀ f : L K ⟶ Y, weq f ↔ sweq (adj.homEquiv f)); simplicialWeakEquivalences = weak homotopy equivalences of geometric realizations (π₀ bijection and π_n for all n ≥ 1 at all basepoints)

  • Carlos Toledo’s cert-machine

    Finds the whole advertised result stated or implied Their term: “MATCHES”.

    The challenge statements state the headline as OpenAI wrote it. Their record

Read the complete assessments on the family page.

OpenAI’s own note on what this Lean statement covers

“The formalization proves the higher-dimensional Thomason model-structure theorem for small strict globular $n$-categories in every positive finite dimension and in dimension $\omega$. Each category has the stated proper combinatorial model structure, Quillen equivalent to simplicial sets through the twice-subdivided categorification and twice-extended Street nerve adjunction.”

An AI agent drafted an interpretation of that note, classifying this statement as “states a paper’s theorem as the paper does”. No human review of the draft is recorded.

Supporting material

The complete Lean statement file

2,473 lines, copied from release version fd4aeeb. A name defined in this file links to its line; pointing at the name shows its definition.

Declared in this fileOpenAI’s library at fd4aeebOther linked names open the current documentation for Mathlib, Lean’s mathematical library.

Links in the file: 1,058 to its own declarations, 885 to Mathlib’s documentation. 107 declared names also link to the same declaration in OpenAI’s library. 63 identifiers stay plain because they resolve to no single declaration: variables Lean binds automatically, notation, or names the scan of the pinned sources did not find. 54 of them could name more than one declaration. OpenAI uses Mathlib version d13f23b. The linked documentation describes the current version, so names that have since changed may be missing there.

import Mathlib/-! Definitions for the Thomason model structures and their Street-nerve detection statement. -/noncomputable sectionuniverse u v wsectionnamespace OAI.Thomasonstructure OmegaCategory where  Cell : Type u  source : ℕ → Cell → Cell  target : ℕ → Cell → Cell  source_source (i j : ℕ) (x : Cell) : source i (source j x) = source (min i j) x  target_target (i j : ℕ) (x : Cell) : target i (target j x) = target (min i j) x  source_target (i j : ℕ) (x : Cell) :    source i (target j x) = if i < j then source i x else target j x  target_source (i j : ℕ) (x : Cell) :    target i (source j x) = if i < j then target i x else source j x  comp (k : ℕ) (x y : Cell) : target k x = source k y → Cell  source_comp_le (i k : ℕ) (hik : i ≤ k) (x y : Cell)      (h : target k x = source k y) : source i (comp k x y h) = source i x  target_comp_le (i k : ℕ) (hik : i ≤ k) (x y : Cell)      (h : target k x = source k y) : target i (comp k x y h) = target i y  source_comp_gt (i k : ℕ) (hki : k < i) (x y : Cell)      (h : target k x = source k y)      (hs : target k (source i x) = source k (source i y)) :    source i (comp k x y h) = comp k (source i x) (source i y) hs  target_comp_gt (i k : ℕ) (hki : k < i) (x y : Cell)      (h : target k x = source k y)      (ht : target k (target i x) = source k (target i y)) :    target i (comp k x y h) = comp k (target i x) (target i y) ht  unit_left (k : ℕ) (x : Cell) (h : target k (source k x) = source k x) :    comp k (source k x) x h = x  unit_right (k : ℕ) (x : Cell) (h : target k x = source k (target k x)) :    comp k x (target k x) h = x  assoc (k : ℕ) (x y z : Cell)      (hxy : target k x = source k y) (hyz : target k y = source k z)      (hxy_z : target k (comp k x y hxy) = source k z)      (hx_yz : target k x = source k (comp k y z hyz)) :    comp k (comp k x y hxy) z hxy_z = comp k x (comp k y z hyz) hx_yz  interchange (k l : ℕ) (hkl : k < l) (a b c d : Cell)      (hab : target l a = source l b) (hcd : target l c = source l d)      (hac : target k a = source k c) (hbd : target k b = source k d)      (hab_cd : target k (comp l a b hab) = source k (comp l c d hcd))      (hac_bd : target l (comp k a c hac) = source l (comp k b d hbd)) :    comp k (comp l a b hab) (comp l c d hcd) hab_cd =      comp l (comp k a c hac) (comp k b d hbd) hac_bd  finite_dimension (x : Cell) : ∃ k, source k x = xend OAI.Thomasonendsectionnamespace OAI.Thomason.OmegaCategoryvariable (C : OmegaCategory.{u})@[ext]structure Functor (C : OAI.Thomason.OmegaCategory.{u}) (D : OAI.Thomason.OmegaCategory.{v}) where  map : C.Cell → D.Cell  map_source (k : ℕ) (x : C.Cell) : map (C.source k x) = D.source k (map x)  map_target (k : ℕ) (x : C.Cell) : map (C.target k x) = D.target k (map x)  map_comp (k : ℕ) (x y : C.Cell) (h : C.target k x = C.source k y)      (h' : D.target k (map x) = D.source k (map y)) :    map (C.comp k x y h) = D.comp k (map x) (map y) h'end OAI.Thomason.OmegaCategoryendsectionnamespace OAI.Thomason.OmegaCategory.Functorvariable (C : OmegaCategory.{u})variable {C : OmegaCategory.{u}} {D : OmegaCategory.{v}} {B : OmegaCategory.{w}}noncomputable def id (C : OAI.Thomason.OmegaCategory.{u}) : OAI.Thomason.OmegaCategory.Functor C C where  map x := x  map_source _ _ := rfl  map_target _ _ := rfl  map_comp _ _ _ _ _ := rflnoncomputable def comp (F : OAI.Thomason.OmegaCategory.Functor C D) (G : OAI.Thomason.OmegaCategory.Functor D B) : OAI.Thomason.OmegaCategory.Functor C B := by  classical  have proof_map_composable_0 {C : OAI.Thomason.OmegaCategory.{u}} {D : OAI.Thomason.OmegaCategory.{v}}  (F : OAI.Thomason.OmegaCategory.Functor C D) {k : ℕ} {x y : C.Cell}      (h : C.target k x = C.source k y) :      D.target k (F.map x) = D.source k (F.map y) := by    rw [← F.map_target, ← F.map_source, h]  exact {    map x := G.map (F.map x)    map_source k x := by rw [F.map_source, G.map_source]    map_target k x := by rw [F.map_target, G.map_target]    map_comp k x y h h' := by      rw [F.map_comp k x y h (proof_map_composable_0 F h), G.map_comp]  }end OAI.Thomason.OmegaCategory.Functorendsectionnamespace OAI.Thomason.OmegaCategoryvariable (C : OmegaCategory.{u})noncomputable instance : CategoryTheory.Category OAI.Thomason.OmegaCategory.{u} where  Hom C D := OAI.Thomason.OmegaCategory.Functor C D  id := OAI.Thomason.OmegaCategory.Functor.id  comp := OAI.Thomason.OmegaCategory.Functor.compnoncomputable def IsTruncated (n : ℕ) : Prop := ∀ x : C.Cell, C.source n x = xnoncomputable def NCategory (n : ℕ) := {C : OAI.Thomason.OmegaCategory.{u} // C.IsTruncated n}noncomputable instance (n : ℕ) : CategoryTheory.Category (OAI.Thomason.OmegaCategory.NCategory.{u} n) where  Hom C D := OAI.Thomason.OmegaCategory.Functor C.val D.val  id C := OAI.Thomason.OmegaCategory.Functor.id C.val  comp := OAI.Thomason.OmegaCategory.Functor.compend OAI.Thomason.OmegaCategoryendsectionnamespace OAI.Thomasonstructure DirectedComplex where  Chain : ℕ → Type u  group : ∀ p, AddCommGroup (Chain p)  d : (p : ℕ) → Chain (p+1) →+ Chain p  d_d (p : ℕ) (x : Chain (p+2)) : d p (d (p+1) x) = 0  augmentation : Chain 0 →+ ℤ  augmentation_d (x : Chain 1) : augmentation (d 0 x) = 0  positive : (p : ℕ) → AddSubmonoid (Chain p)end OAI.Thomasonendattribute [instance] OAI.Thomason.DirectedComplex.groupsectionnamespace OAI.Thomason.DirectedComplex@[ext]structure Hom (K : OAI.Thomason.DirectedComplex.{u}) (L : OAI.Thomason.DirectedComplex.{v}) where  map (p : ℕ) : K.Chain p →+ L.Chain p  map_d (p : ℕ) (x : K.Chain (p+1)) : map p (K.d p x) = L.d p (map (p+1) x)  map_augmentation (x : K.Chain 0) : L.augmentation (map 0 x) = K.augmentation x  map_positive (p : ℕ) (x : K.Chain p) : x ∈ K.positive p → map p x ∈ L.positive pend OAI.Thomason.DirectedComplexendsectionnamespace OAI.Thomason.DirectedComplex.Homvariable {K : DirectedComplex.{u}} {L : DirectedComplex.{v}} {M : DirectedComplex.{w}}noncomputable def id (K : OAI.Thomason.DirectedComplex.{u}) : OAI.Thomason.DirectedComplex.Hom K K where  map _ := AddMonoidHom.id _  map_d _ _ := rfl  map_augmentation _ := rfl  map_positive _ _ h := hnoncomputable def comp (f : OAI.Thomason.DirectedComplex.Hom K L) (g : OAI.Thomason.DirectedComplex.Hom L M) : OAI.Thomason.DirectedComplex.Hom K M where  map p := (g.map p).comp (f.map p)  map_d p x := by simp only [AddMonoidHom.comp_apply, f.map_d, g.map_d]  map_augmentation x := by simp only [AddMonoidHom.comp_apply,    g.map_augmentation, f.map_augmentation]  map_positive p x hx := g.map_positive p _ (f.map_positive p x hx)end OAI.Thomason.DirectedComplex.Homendsectionnamespace OAI.Thomason.DirectedComplexnoncomputable instance : CategoryTheory.Category OAI.Thomason.DirectedComplex.{u} where  Hom := OAI.Thomason.DirectedComplex.Hom  id := OAI.Thomason.DirectedComplex.Hom.id  comp := OAI.Thomason.DirectedComplex.Hom.comp@[ext]structure Table (K : OAI.Thomason.DirectedComplex.{u}) where  row : (p : ℕ) → Bool → K.Chain p  positive (p : ℕ) (b : Bool) : row p b ∈ K.positive p  boundary (p : ℕ) (b : Bool) :    K.d p (row (p+1) b) = row p true - row p false  augmentation (b : Bool) : K.augmentation (row 0 b) = 1  bounded : ∃ k, ∀ p, k < p → ∀ b, row p b = 0end OAI.Thomason.DirectedComplexendsectionnamespace OAI.Thomason.DirectedComplex.Tablevariable {K : DirectedComplex.{u}}noncomputable def truncate (k : ℕ) (e : Bool) (x : OAI.Thomason.DirectedComplex.Table K) : OAI.Thomason.DirectedComplex.Table K where  row p b := if p < k then x.row p b else if p = k then x.row p e else 0  positive p b := by    split_ifs <;> first | exact x.positive _ _ | exact (K.positive _).zero_mem  boundary p b := by    by_cases hp : p < k    · by_cases hp' : p+1 < k      · simp only [hp, hp', ite_eq_left]        exact x.boundary p b      · have he : p+1 = k := by omega        simp only [ite_eq_left hp, ite_eq_right hp', ite_eq_left he]        exact x.boundary p e    · by_cases he : p = k      · have hp' : ¬p+1 < k := by omega        have he' : ¬p+1 = k := by omega        simp only [ite_eq_right hp, ite_eq_right hp', ite_eq_right he', ite_eq_left he, map_zero, sub_self]      · have hp' : ¬p+1 < k := by omega        have he' : ¬p+1 = k := by omega        simp only [hp, hp', he', he, ite_false, map_zero, sub_self]  augmentation b := by    by_cases hk : k = 0    · subst k      simpa using x.augmentation e    · have hk' : 0 < k := Nat.pos_of_ne_zero hk      simpa only [hk', ite_eq_left] using x.augmentation b  bounded := by    refine ⟨k, ?_⟩    intro p hp b    simp only [show ¬p < k by omega, show ¬p = k by omega, ite_false]noncomputable def comp (k : ℕ) (x y : OAI.Thomason.DirectedComplex.Table K)    (h : OAI.Thomason.DirectedComplex.Table.truncate k true x = OAI.Thomason.DirectedComplex.Table.truncate k false y) : OAI.Thomason.DirectedComplex.Table K := by  classical  have proof_truncate_row_3 {K : OAI.Thomason.DirectedComplex.{u}}  (k : ℕ) (e : Bool) (x : OAI.Thomason.DirectedComplex.Table K) (p : ℕ) (b : Bool) :      (OAI.Thomason.DirectedComplex.Table.truncate k e x).row p b =        if p < k then x.row p b else if p = k then x.row p e else 0 := rfl  have proof_lower_rows_eq_1 {K : OAI.Thomason.DirectedComplex.{u}}  {k : ℕ} {x y : OAI.Thomason.DirectedComplex.Table K}      (h : OAI.Thomason.DirectedComplex.Table.truncate k true x = OAI.Thomason.DirectedComplex.Table.truncate k false y) {p : ℕ} (hp : p < k) (b : Bool) :      x.row p b = y.row p b := by    have hr := congrArg (fun z : OAI.Thomason.DirectedComplex.Table K => z.row p b) h    simpa only [OAI.Thomason.DirectedComplex.Table.truncate, hp, ite_eq_left] using hr  have proof_matching_row_eq_2 {K : OAI.Thomason.DirectedComplex.{u}}  {k : ℕ} {x y : OAI.Thomason.DirectedComplex.Table K}      (h : OAI.Thomason.DirectedComplex.Table.truncate k true x = OAI.Thomason.DirectedComplex.Table.truncate k false y) : x.row k true = y.row k false := by    have hr := congrArg (fun z : OAI.Thomason.DirectedComplex.Table K => z.row k false) h    simpa [OAI.Thomason.DirectedComplex.Table.truncate] using hr  exact {    row p b := if p < k then x.row p b else if p = k then      (if b then y.row p true else x.row p false) else x.row p b + y.row p b    positive p b := by      split_ifs <;> first        | exact x.positive _ _        | exact y.positive _ _        | exact (K.positive _).add_mem (x.positive _ _) (y.positive _ _)    boundary p b := by      by_cases hp : p < k      · by_cases hp' : p+1 < k        · simp only [ite_eq_left hp, ite_eq_left hp']          exact x.boundary p b        · have he : p+1 = k := by omega          simp only [ite_eq_left hp, ite_eq_right hp', ite_eq_left he]          cases b with          | false => exact x.boundary p false          | true =>            change K.d p (y.row (p+1) true) = x.row p true - x.row p false            rw [y.boundary, proof_lower_rows_eq_1 h hp true, proof_lower_rows_eq_1 h hp false]      · by_cases he : p = k        · subst p          have hp' : ¬k+1 < k := by omega          have he' : ¬k+1 = k := by omega          simp only [ite_eq_right (Nat.lt_irrefl k), ite_eq_right hp', ite_eq_right he',            ↓reduceIte, map_add, x.boundary, y.boundary]          rw [proof_matching_row_eq_2 h]          abel_nf          exact add_comm _ _        · have hp' : ¬p+1 < k := by omega          have he' : ¬p+1 = k := by omega          simp only [ite_eq_right hp, ite_eq_right hp', ite_eq_right he', ite_eq_right he, map_add,            x.boundary, y.boundary]          abel    augmentation b := by      by_cases hk : 0 < k      · simp only [ite_eq_left hk]        exact x.augmentation b      · have he : 0 = k := by omega        simp only [ite_eq_right hk, ite_eq_left he]        cases b <;> first | exact x.augmentation _ | exact y.augmentation _    bounded := by      obtain ⟨nx, hx⟩ := x.bounded      obtain ⟨ny, hy⟩ := y.bounded      refine ⟨max nx ny, ?_⟩      intro p hp b      have hx' := hx p (lt_of_le_of_lt (le_max_left _ _) hp)      have hy' := hy p (lt_of_le_of_lt (le_max_right _ _) hp)      split_ifs <;> simp only [hx', hy', zero_add]  }end OAI.Thomason.DirectedComplex.Tableendsectionnamespace OAI.Thomason.DirectedComplexnoncomputable def nu (K : OAI.Thomason.DirectedComplex.{u}) : OAI.Thomason.OmegaCategory.{u} := by  classical  have proof_truncate_row_3 {K : OAI.Thomason.DirectedComplex.{u}}  (k : ℕ) (e : Bool) (x : OAI.Thomason.DirectedComplex.Table K) (p : ℕ) (b : Bool) :      (OAI.Thomason.DirectedComplex.Table.truncate k e x).row p b =        if p < k then x.row p b else if p = k then x.row p e else 0 := rfl  have proof_truncate_truncate_5 {K : OAI.Thomason.DirectedComplex.{u}}  (i j : ℕ) (e f : Bool) (x : OAI.Thomason.DirectedComplex.Table K) :      OAI.Thomason.DirectedComplex.Table.truncate i e (OAI.Thomason.DirectedComplex.Table.truncate j f x) =        if i < j then OAI.Thomason.DirectedComplex.Table.truncate i e x else OAI.Thomason.DirectedComplex.Table.truncate j f x := by    ext p b    by_cases hij : i < j    · simp only [hij, ite_eq_left, OAI.Thomason.DirectedComplex.Table.truncate]      by_cases hpi : p < i      · have hpj : p < j := lt_trans hpi hij        simp [hpi, hpj]      · by_cases hpe : p = i        · subst p          simp [hij]        · simp [hpi, hpe]    · simp only [hij, ite_false, OAI.Thomason.DirectedComplex.Table.truncate]      by_cases hpj : p < j      · have hpi : p < i := by omega        simp [hpj, hpi]      · by_cases hpje : p = j        · subst p          by_cases hji : j < i          · simp [hji]          · have hi : i = j := by omega            subst i            simp []        · by_cases hpi : p < i          · simp [hpi, hpj, hpje]          · by_cases hpie : p = i            · subst p              simp [hij]            · simp [hpi, hpie, hpj, hpje]  have proof_truncate_truncate_same_4 {K : OAI.Thomason.DirectedComplex.{u}}  (i j : ℕ) (e : Bool) (x : OAI.Thomason.DirectedComplex.Table K) :      OAI.Thomason.DirectedComplex.Table.truncate i e (OAI.Thomason.DirectedComplex.Table.truncate j e x) = OAI.Thomason.DirectedComplex.Table.truncate (min i j) e x := by    rw [proof_truncate_truncate_5]    split_ifs with h    · rw [min_eq_left (le_of_lt h)]    · rw [min_eq_right (le_of_not_gt h)]  have proof_comp_row_14 {K : OAI.Thomason.DirectedComplex.{u}}  (k : ℕ) (x y : OAI.Thomason.DirectedComplex.Table K)      (h : OAI.Thomason.DirectedComplex.Table.truncate k true x = OAI.Thomason.DirectedComplex.Table.truncate k false y) (p : ℕ) (b : Bool) :      (OAI.Thomason.DirectedComplex.Table.comp k x y h).row p b = if p < k then x.row p b else if p = k then        (if b then y.row p true else x.row p false) else x.row p b + y.row p b := rfl  have proof_source_comp_le_6 {K : OAI.Thomason.DirectedComplex.{u}}  (i k : ℕ) (hik : i ≤ k) (x y : OAI.Thomason.DirectedComplex.Table K)      (h : OAI.Thomason.DirectedComplex.Table.truncate k true x = OAI.Thomason.DirectedComplex.Table.truncate k false y) :      OAI.Thomason.DirectedComplex.Table.truncate i false (OAI.Thomason.DirectedComplex.Table.comp k x y h) = OAI.Thomason.DirectedComplex.Table.truncate i false x := by    ext p b    by_cases hpi : p < i    · have hpk : p < k := lt_of_lt_of_le hpi hik      simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp, hpi, hpk]    · by_cases hpe : p = i      · subst p        by_cases hik' : i < k        · simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp, hik']        · have he : i = k := by omega          subst i          simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp]      · simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp, hpi, hpe]  have proof_lower_rows_eq_1 {K : OAI.Thomason.DirectedComplex.{u}}  {k : ℕ} {x y : OAI.Thomason.DirectedComplex.Table K}      (h : OAI.Thomason.DirectedComplex.Table.truncate k true x = OAI.Thomason.DirectedComplex.Table.truncate k false y) {p : ℕ} (hp : p < k) (b : Bool) :      x.row p b = y.row p b := by    have hr := congrArg (fun z : OAI.Thomason.DirectedComplex.Table K => z.row p b) h    simpa only [OAI.Thomason.DirectedComplex.Table.truncate, hp, ite_eq_left] using hr  have proof_target_comp_le_7 {K : OAI.Thomason.DirectedComplex.{u}}  (i k : ℕ) (hik : i ≤ k) (x y : OAI.Thomason.DirectedComplex.Table K)      (h : OAI.Thomason.DirectedComplex.Table.truncate k true x = OAI.Thomason.DirectedComplex.Table.truncate k false y) :      OAI.Thomason.DirectedComplex.Table.truncate i true (OAI.Thomason.DirectedComplex.Table.comp k x y h) = OAI.Thomason.DirectedComplex.Table.truncate i true y := by    ext p b    by_cases hpi : p < i    · have hpk : p < k := lt_of_lt_of_le hpi hik      simp only [OAI.Thomason.DirectedComplex.Table.truncate, ite_eq_left hpi, OAI.Thomason.DirectedComplex.Table.comp, ite_eq_left hpk]      exact proof_lower_rows_eq_1 h hpk b    · by_cases hpe : p = i      · subst p        by_cases hik' : i < k        · simpa [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp, hik'] using proof_lower_rows_eq_1 h hik' true        · have he : i = k := by omega          subst i          simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp]      · simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp, hpi, hpe]  have proof_truncate_comp_gt_8 {K : OAI.Thomason.DirectedComplex.{u}}  (i k : ℕ) (hki : k < i) (e : Bool) (x y : OAI.Thomason.DirectedComplex.Table K)      (h : OAI.Thomason.DirectedComplex.Table.truncate k true x = OAI.Thomason.DirectedComplex.Table.truncate k false y)      (h' : OAI.Thomason.DirectedComplex.Table.truncate k true (OAI.Thomason.DirectedComplex.Table.truncate i e x) = OAI.Thomason.DirectedComplex.Table.truncate k false (OAI.Thomason.DirectedComplex.Table.truncate i e y)) :      OAI.Thomason.DirectedComplex.Table.truncate i e (OAI.Thomason.DirectedComplex.Table.comp k x y h) = OAI.Thomason.DirectedComplex.Table.comp k (OAI.Thomason.DirectedComplex.Table.truncate i e x) (OAI.Thomason.DirectedComplex.Table.truncate i e y) h' := by    ext p b    by_cases hpk : p < k    · have hpi : p < i := lt_trans hpk hki      simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp, hpk, hpi]    · by_cases hpe : p = k      · subst p        simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp, hki]      · by_cases hpi : p < i        · simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp, hpk, hpe, hpi]        · by_cases hpie : p = i          · subst p            have hik : ¬i < k := by omega            have hie : ¬i = k := by omega            simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp, hik, hie]          · simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp, hpk, hpe, hpi, hpie]  have proof_unit_left_9 {K : OAI.Thomason.DirectedComplex.{u}}  (k : ℕ) (x : OAI.Thomason.DirectedComplex.Table K)      (h : OAI.Thomason.DirectedComplex.Table.truncate k true (OAI.Thomason.DirectedComplex.Table.truncate k false x) = OAI.Thomason.DirectedComplex.Table.truncate k false x) :      OAI.Thomason.DirectedComplex.Table.comp k (OAI.Thomason.DirectedComplex.Table.truncate k false x) x h = x := by    ext p b    by_cases hp : p < k    · simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp, hp]    · by_cases he : p = k      · subst p        cases b <;> simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp]      · simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp, hp, he]  have proof_unit_right_10 {K : OAI.Thomason.DirectedComplex.{u}}  (k : ℕ) (x : OAI.Thomason.DirectedComplex.Table K)      (h : OAI.Thomason.DirectedComplex.Table.truncate k true x = OAI.Thomason.DirectedComplex.Table.truncate k false (OAI.Thomason.DirectedComplex.Table.truncate k true x)) :      OAI.Thomason.DirectedComplex.Table.comp k x (OAI.Thomason.DirectedComplex.Table.truncate k true x) h = x := by    ext p b    by_cases hp : p < k    · simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp, hp]    · by_cases he : p = k      · subst p        cases b <;> simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp]      · simp [OAI.Thomason.DirectedComplex.Table.truncate, OAI.Thomason.DirectedComplex.Table.comp, hp, he]  have proof_assoc_11 {K : OAI.Thomason.DirectedComplex.{u}}  (k : ℕ) (x y z : OAI.Thomason.DirectedComplex.Table K)      (hxy : OAI.Thomason.DirectedComplex.Table.truncate k true x = OAI.Thomason.DirectedComplex.Table.truncate k false y)      (hyz : OAI.Thomason.DirectedComplex.Table.truncate k true y = OAI.Thomason.DirectedComplex.Table.truncate k false z)      (hxy_z : OAI.Thomason.DirectedComplex.Table.truncate k true (OAI.Thomason.DirectedComplex.Table.comp k x y hxy) = OAI.Thomason.DirectedComplex.Table.truncate k false z)      (hx_yz : OAI.Thomason.DirectedComplex.Table.truncate k true x = OAI.Thomason.DirectedComplex.Table.truncate k false (OAI.Thomason.DirectedComplex.Table.comp k y z hyz)) :      OAI.Thomason.DirectedComplex.Table.comp k (OAI.Thomason.DirectedComplex.Table.comp k x y hxy) z hxy_z = OAI.Thomason.DirectedComplex.Table.comp k x (OAI.Thomason.DirectedComplex.Table.comp k y z hyz) hx_yz := by    ext p b    by_cases hp : p < k    · simp [OAI.Thomason.DirectedComplex.Table.comp, hp]    · by_cases he : p = k      · subst p        cases b <;> simp [OAI.Thomason.DirectedComplex.Table.comp]      · simp [OAI.Thomason.DirectedComplex.Table.comp, hp, he, add_assoc]  have proof_interchange_12 {K : OAI.Thomason.DirectedComplex.{u}}  (k l : ℕ) (hkl : k < l) (a b c d : OAI.Thomason.DirectedComplex.Table K)      (hab : OAI.Thomason.DirectedComplex.Table.truncate l true a = OAI.Thomason.DirectedComplex.Table.truncate l false b)      (hcd : OAI.Thomason.DirectedComplex.Table.truncate l true c = OAI.Thomason.DirectedComplex.Table.truncate l false d)      (hac : OAI.Thomason.DirectedComplex.Table.truncate k true a = OAI.Thomason.DirectedComplex.Table.truncate k false c)      (hbd : OAI.Thomason.DirectedComplex.Table.truncate k true b = OAI.Thomason.DirectedComplex.Table.truncate k false d)      (hab_cd : OAI.Thomason.DirectedComplex.Table.truncate k true (OAI.Thomason.DirectedComplex.Table.comp l a b hab) = OAI.Thomason.DirectedComplex.Table.truncate k false (OAI.Thomason.DirectedComplex.Table.comp l c d hcd))      (hac_bd : OAI.Thomason.DirectedComplex.Table.truncate l true (OAI.Thomason.DirectedComplex.Table.comp k a c hac) = OAI.Thomason.DirectedComplex.Table.truncate l false (OAI.Thomason.DirectedComplex.Table.comp k b d hbd)) :      OAI.Thomason.DirectedComplex.Table.comp k (OAI.Thomason.DirectedComplex.Table.comp l a b hab) (OAI.Thomason.DirectedComplex.Table.comp l c d hcd) hab_cd =        OAI.Thomason.DirectedComplex.Table.comp l (OAI.Thomason.DirectedComplex.Table.comp k a c hac) (OAI.Thomason.DirectedComplex.Table.comp k b d hbd) hac_bd := by    ext p e    by_cases hpk : p < k    · have hpl : p < l := lt_trans hpk hkl      simp [OAI.Thomason.DirectedComplex.Table.comp, hpk, hpl]    · by_cases hpe : p = k      · subst p        cases e <;> simp [OAI.Thomason.DirectedComplex.Table.comp, hkl]      · by_cases hpl : p < l        · simp [OAI.Thomason.DirectedComplex.Table.comp, hpk, hpe, hpl]        · by_cases hple : p = l          · subst p            have hlk : ¬l < k := by omega            have hlke : ¬l = k := by omega            cases e <;> simp [OAI.Thomason.DirectedComplex.Table.comp, hlk, hlke]          · simp only [OAI.Thomason.DirectedComplex.Table.comp, ite_eq_right hpk, ite_eq_right hpe, ite_eq_right hpl, ite_eq_right hple]            abel  have proof_finite_dimension_13 {K : OAI.Thomason.DirectedComplex.{u}}  (x : OAI.Thomason.DirectedComplex.Table K) : ∃ k, OAI.Thomason.DirectedComplex.Table.truncate k false x = x := by    obtain ⟨k, hk⟩ := x.bounded    have ht : x.row k true = x.row k false := by      have hb := x.boundary k false      rw [hk (k+1) (by omega) false, map_zero] at hb      exact sub_eq_zero.mp hb.symm    refine ⟨k, ?_⟩    ext p b    by_cases hp : p < k    · simp [OAI.Thomason.DirectedComplex.Table.truncate, hp]    · by_cases he : p = k      · subst p        cases b <;> simp [OAI.Thomason.DirectedComplex.Table.truncate, ht]      · have hkp : k < p := by omega        simp [OAI.Thomason.DirectedComplex.Table.truncate, hp, he, hk p hkp b]  exact {    Cell := OAI.Thomason.DirectedComplex.Table K    source k := OAI.Thomason.DirectedComplex.Table.truncate k false    target k := OAI.Thomason.DirectedComplex.Table.truncate k true    source_source i j x := proof_truncate_truncate_same_4 i j false x    target_target i j x := proof_truncate_truncate_same_4 i j true x    source_target i j x := proof_truncate_truncate_5 i j false true x    target_source i j x := proof_truncate_truncate_5 i j true false x    comp := OAI.Thomason.DirectedComplex.Table.comp    source_comp_le := proof_source_comp_le_6    target_comp_le := proof_target_comp_le_7    source_comp_gt i k hki x y h hs := proof_truncate_comp_gt_8 i k hki false x y h hs    target_comp_gt i k hki x y h ht := proof_truncate_comp_gt_8 i k hki true x y h ht    unit_left := proof_unit_left_9    unit_right := proof_unit_right_10    assoc := proof_assoc_11    interchange := proof_interchange_12    finite_dimension := proof_finite_dimension_13  }end OAI.Thomason.DirectedComplexendsectionnamespace OAI.Thomason.DirectedComplex.Homvariable {K : DirectedComplex.{u}} {L : DirectedComplex.{v}} {M : DirectedComplex.{w}}noncomputable def table (f : OAI.Thomason.DirectedComplex.Hom K L) (x : OAI.Thomason.DirectedComplex.Table K) : OAI.Thomason.DirectedComplex.Table L where  row p b := f.map p (x.row p b)  positive p b := f.map_positive p _ (x.positive p b)  boundary p b := by rw [← f.map_d, x.boundary, map_sub]  augmentation b := by rw [f.map_augmentation, x.augmentation]  bounded := by    obtain ⟨k, hk⟩ := x.bounded    refine ⟨k, ?_⟩    intro p hp b    rw [hk p hp b, map_zero]noncomputable def nu (f : OAI.Thomason.DirectedComplex.Hom K L) : OAI.Thomason.OmegaCategory.Functor K.nu L.nu := by  classical  have proof_table_row_17 {K : OAI.Thomason.DirectedComplex.{u}} {L : OAI.Thomason.DirectedComplex.{v}}  (f : OAI.Thomason.DirectedComplex.Hom K L) (x : OAI.Thomason.DirectedComplex.Table K) (p : ℕ) (b : Bool) :      (f.table x).row p b = f.map p (x.row p b) := rfl  have proof_truncate_row_3 {K : OAI.Thomason.DirectedComplex.{u}}  (k : ℕ) (e : Bool) (x : OAI.Thomason.DirectedComplex.Table K) (p : ℕ) (b : Bool) :      (OAI.Thomason.DirectedComplex.Table.truncate k e x).row p b =        if p < k then x.row p b else if p = k then x.row p e else 0 := rfl  have proof_table_truncate_15 {K : OAI.Thomason.DirectedComplex.{u}} {L : OAI.Thomason.DirectedComplex.{v}}  (f : OAI.Thomason.DirectedComplex.Hom K L) (k : ℕ) (b : Bool) (x : OAI.Thomason.DirectedComplex.Table K) :      f.table (OAI.Thomason.DirectedComplex.Table.truncate k b x) = OAI.Thomason.DirectedComplex.Table.truncate k b (f.table x) := by    ext p e    simp only [OAI.Thomason.DirectedComplex.Hom.table, OAI.Thomason.DirectedComplex.Table.truncate]    split_ifs <;> simp only [map_zero]  have proof_comp_row_14 {K : OAI.Thomason.DirectedComplex.{u}}  (k : ℕ) (x y : OAI.Thomason.DirectedComplex.Table K)      (h : OAI.Thomason.DirectedComplex.Table.truncate k true x = OAI.Thomason.DirectedComplex.Table.truncate k false y) (p : ℕ) (b : Bool) :      (OAI.Thomason.DirectedComplex.Table.comp k x y h).row p b = if p < k then x.row p b else if p = k then        (if b then y.row p true else x.row p false) else x.row p b + y.row p b := rfl  have proof_table_comp_16 {K : OAI.Thomason.DirectedComplex.{u}} {L : OAI.Thomason.DirectedComplex.{v}}  (f : OAI.Thomason.DirectedComplex.Hom K L) (k : ℕ) (x y : OAI.Thomason.DirectedComplex.Table K)      (h : OAI.Thomason.DirectedComplex.Table.truncate k true x = OAI.Thomason.DirectedComplex.Table.truncate k false y)      (h' : OAI.Thomason.DirectedComplex.Table.truncate k true (f.table x) = OAI.Thomason.DirectedComplex.Table.truncate k false (f.table y)) :      f.table (OAI.Thomason.DirectedComplex.Table.comp k x y h) = OAI.Thomason.DirectedComplex.Table.comp k (f.table x) (f.table y) h' := by    ext p e    simp only [OAI.Thomason.DirectedComplex.Hom.table, OAI.Thomason.DirectedComplex.Table.comp]    split_ifs <;> simp only [map_add]  exact {    map := f.table    map_source k x := (proof_table_truncate_15 f k Bool.false x)    map_target k x := (proof_table_truncate_15 f k Bool.true x)    map_comp := (proof_table_comp_16 f)  }end OAI.Thomason.DirectedComplex.Homendsectionnamespace OAI.Thomason.DirectedComplexnoncomputable def nuFunctor : CategoryTheory.Functor OAI.Thomason.DirectedComplex.{u} OAI.Thomason.OmegaCategory.{u} where  obj := OAI.Thomason.DirectedComplex.nu  map := OAI.Thomason.DirectedComplex.Hom.nu  map_id K := by    change OAI.Thomason.DirectedComplex.Hom.nu (OAI.Thomason.DirectedComplex.Hom.id K) = OAI.Thomason.OmegaCategory.Functor.id K.nu    ext x    rfl  map_comp f g := by    change OAI.Thomason.DirectedComplex.Hom.nu (OAI.Thomason.DirectedComplex.Hom.comp f g) = OAI.Thomason.OmegaCategory.Functor.comp f.nu g.nu    ext x    rflend OAI.Thomason.DirectedComplexendsectionnamespace OAI.Thomason.NormalizedChainsvariable {E : Type u} [PartialOrder E]noncomputable abbrev Word (E : Type u) [PartialOrder E] :=  {l : List E // l.Pairwise (· < ·)}noncomputable abbrev Chains (E : Type u) [PartialOrder E] := OAI.Thomason.NormalizedChains.Word E →₀ ℤnoncomputable def bracket (l : List E) : OAI.Thomason.NormalizedChains.Chains E := by  classical  exact if h : l.Pairwise (· < ·) then Finsupp.single ⟨l, h⟩ 1 else 0noncomputable def prepend (a : E) : OAI.Thomason.NormalizedChains.Chains E →ₗ[ℤ] OAI.Thomason.NormalizedChains.Chains E :=  Finsupp.linearCombination ℤ (fun l : OAI.Thomason.NormalizedChains.Word E => OAI.Thomason.NormalizedChains.bracket (a :: l.val))noncomputable def wordBoundary : List E → OAI.Thomason.NormalizedChains.Chains E  | [] => 0  | a :: l => OAI.Thomason.NormalizedChains.bracket l - OAI.Thomason.NormalizedChains.prepend a (wordBoundary l)noncomputable def boundary : OAI.Thomason.NormalizedChains.Chains E →ₗ[ℤ] OAI.Thomason.NormalizedChains.Chains E :=  Finsupp.linearCombination ℤ (fun l : OAI.Thomason.NormalizedChains.Word E => OAI.Thomason.NormalizedChains.wordBoundary l.val)end OAI.Thomason.NormalizedChainsendsectionnamespace OAI.Thomason.NormalizedChainsvariable {E : Type u} [PartialOrder E]omit [PartialOrder E]variable {M : Type v} [AddCommGroup M]noncomputable def faces (H : List E → M) : List E → M  | [] => 0  | a :: l => H l - faces (fun m => H (a :: m)) lend OAI.Thomason.NormalizedChainsendsectionnamespace OAI.Thomason.NormalizedChainsvariable {E : Type u} [PartialOrder E]noncomputable def grade (k : ℕ) : Submodule ℤ (OAI.Thomason.NormalizedChains.Chains E) :=  Finsupp.supported ℤ ℤ {w : OAI.Thomason.NormalizedChains.Word E | w.val.length = k}noncomputable def emptyWord : OAI.Thomason.NormalizedChains.Word E := ⟨[], List.Pairwise.nil⟩noncomputable def emptyCoefficient : OAI.Thomason.NormalizedChains.Chains E →ₗ[ℤ] ℤ := Finsupp.lapply OAI.Thomason.NormalizedChains.emptyWordnoncomputable def Positive (c : OAI.Thomason.NormalizedChains.Chains E) : Prop := ∀ l, 0 ≤ c lnoncomputable def positiveGrade (p : ℕ) : AddSubmonoid (OAI.Thomason.NormalizedChains.grade (E := E) (p+1)) where  carrier := {c | Positive c.val}  zero_mem' _ := le_rfl  add_mem' ha hb w := add_nonneg (ha w) (hb w)noncomputable def complex (E : Type u) [PartialOrder E] : OAI.Thomason.DirectedComplex.{u} := by  classical  have proof_mem_grade_iff_20 {E : Type u} [instLocal1 : PartialOrder.{u} E]  (k : ℕ) (c : OAI.Thomason.NormalizedChains.Chains E) :      c ∈ OAI.Thomason.NormalizedChains.grade k ↔ ∀ w, c w ≠ 0 → w.val.length = k := by    simp only [OAI.Thomason.NormalizedChains.grade, Finsupp.mem_supported, Set.subset_def, Finsupp.mem_support_iff,      Finset.mem_coe, Set.mem_ofPred_eq]  have proof_linearCombination_mem_grade_21 {E : Type u} [instLocal1 : PartialOrder.{u} E]  {D : Type u} [PartialOrder D]      (H : OAI.Thomason.NormalizedChains.Word E → OAI.Thomason.NormalizedChains.Chains D) (k j : ℕ)      (hH : ∀ w, w.val.length = k → H w ∈ OAI.Thomason.NormalizedChains.grade j)      {c : OAI.Thomason.NormalizedChains.Chains E} (hc : c ∈ OAI.Thomason.NormalizedChains.grade k) :      Finsupp.linearCombination ℤ H c ∈ OAI.Thomason.NormalizedChains.grade j := by    rw [Finsupp.linearCombination_apply, Finsupp.sum]    apply Submodule.sum_mem    intro w hw    exact Submodule.smul_mem _ _ (hH w ((proof_mem_grade_iff_20 k c).mp hc w      (Finsupp.mem_support_iff.mp hw)))  have proof_bracket_of_pairwise_22 {E : Type u} [instLocal1 : PartialOrder.{u} E]  {l : List E} (h : l.Pairwise (· < ·)) :      OAI.Thomason.NormalizedChains.bracket l = Finsupp.single ⟨l, h⟩ 1 := by    classical    simp [OAI.Thomason.NormalizedChains.bracket, h]  have proof_bracket_of_not_pairwise_23 {E : Type u} [instLocal1 : PartialOrder.{u} E]  {l : List E} (h : ¬l.Pairwise (· < ·)) :      OAI.Thomason.NormalizedChains.bracket l = 0 := by    classical    simp [OAI.Thomason.NormalizedChains.bracket, h]  have proof_bracket_mem_grade_24 {E : Type u} [instLocal1 : PartialOrder.{u} E]  (l : List E) : OAI.Thomason.NormalizedChains.bracket l ∈ OAI.Thomason.NormalizedChains.grade l.length := by    classical    by_cases h : l.Pairwise (· < ·)    · rw [proof_bracket_of_pairwise_22 h]      exact Finsupp.single_mem_supported ℤ 1 rfl    · rw [proof_bracket_of_not_pairwise_23 h]      exact Submodule.zero_mem _  have proof_wordBoundary_nil_25 {E : Type u} [instLocal1 : PartialOrder.{u} E]  : OAI.Thomason.NormalizedChains.wordBoundary ([] : List E) = 0 := rfl  have proof_wordBoundary_cons_26 {E : Type u} [instLocal1 : PartialOrder.{u} E]  (a : E) (l : List E) :      OAI.Thomason.NormalizedChains.wordBoundary (a :: l) = OAI.Thomason.NormalizedChains.bracket l - OAI.Thomason.NormalizedChains.prepend a (OAI.Thomason.NormalizedChains.wordBoundary l) := rfl  have proof_prepend_bracket_27 {E : Type u} [instLocal1 : PartialOrder.{u} E]  (a : E) (l : List E) :      OAI.Thomason.NormalizedChains.prepend a (OAI.Thomason.NormalizedChains.bracket l) = OAI.Thomason.NormalizedChains.bracket (a :: l) := by    classical    by_cases h : l.Pairwise (· < ·)    · rw [proof_bracket_of_pairwise_22 h]      change Finsupp.linearCombination ℤ (fun l : OAI.Thomason.NormalizedChains.Word E => OAI.Thomason.NormalizedChains.bracket (a :: l.val))        (Finsupp.single (⟨l, h⟩ : OAI.Thomason.NormalizedChains.Word E) 1) = _      rw [Finsupp.linearCombination_single]      simp    · have h' : ¬(a :: l).Pairwise (· < ·) := fun hw => h hw.tail      simp [proof_bracket_of_not_pairwise_23 h, proof_bracket_of_not_pairwise_23 h']  have proof_prepend_mem_grade_28 {E : Type u} [instLocal1 : PartialOrder.{u} E]  (a : E) {k : ℕ} {c : OAI.Thomason.NormalizedChains.Chains E} (hc : c ∈ OAI.Thomason.NormalizedChains.grade k) :      OAI.Thomason.NormalizedChains.prepend a c ∈ OAI.Thomason.NormalizedChains.grade (k+1) := by    apply proof_linearCombination_mem_grade_21 _ k (k+1) _ hc    intro w hw    simpa only [List.length_cons, hw] using proof_bracket_mem_grade_24 (a :: w.val)  have proof_wordBoundary_mem_grade_29 {E : Type u} [instLocal1 : PartialOrder.{u} E]  (l : List E) : OAI.Thomason.NormalizedChains.wordBoundary l ∈ OAI.Thomason.NormalizedChains.grade (l.length-1) := by    induction l with    | nil => exact Submodule.zero_mem _    | cons a l ih =>      cases l with      | nil => simpa [proof_wordBoundary_nil_25, proof_wordBoundary_cons_26, proof_prepend_bracket_27, OAI.Thomason.NormalizedChains.wordBoundary] using proof_bracket_mem_grade_24 ([] : List E)      | cons b l =>        rw [proof_wordBoundary_cons_26]        apply Submodule.sub_mem        · simpa [proof_wordBoundary_nil_25, proof_wordBoundary_cons_26, proof_prepend_bracket_27] using proof_bracket_mem_grade_24 (b :: l)        · simpa [proof_wordBoundary_nil_25, proof_wordBoundary_cons_26, proof_prepend_bracket_27] using proof_prepend_mem_grade_28 a ih  have proof_boundary_mem_grade_18 {E : Type u} [instLocal1 : PartialOrder.{u} E]  {k : ℕ} {c : OAI.Thomason.NormalizedChains.Chains E} (hc : c ∈ OAI.Thomason.NormalizedChains.grade (k+1)) :      OAI.Thomason.NormalizedChains.boundary c ∈ OAI.Thomason.NormalizedChains.grade k := by    apply proof_linearCombination_mem_grade_21 _ (k+1) k _ hc    intro w hw    simpa only [hw, Nat.add_sub_cancel] using proof_wordBoundary_mem_grade_29 w.val  have proof_prepend_prepend_self_30 {E : Type u} [instLocal1 : PartialOrder.{u} E]  (a : E) (c : OAI.Thomason.NormalizedChains.Chains E) : OAI.Thomason.NormalizedChains.prepend a (OAI.Thomason.NormalizedChains.prepend a c) = 0 := by    classical    induction c using Finsupp.induction with    | zero => simp []    | @single_add l z c _ _ ih =>      simp only [map_add, ih, add_zero]      have hz : Finsupp.single l z = z • OAI.Thomason.NormalizedChains.bracket l.val := by        rw [proof_bracket_of_pairwise_22 l.property]        simp only [Finsupp.smul_single, smul_eq_mul, mul_one]      rw [hz]      simp only [map_smul, proof_prepend_bracket_27]      have h : ¬(a :: a :: l.val).Pairwise (· < ·) := by simp []      simp [proof_bracket_of_not_pairwise_23 h]  have proof_wordBoundary_repeated_31 {E : Type u} [instLocal1 : PartialOrder.{u} E]  (a : E) (l : List E) :      OAI.Thomason.NormalizedChains.wordBoundary (a :: a :: l) = 0 := by    simp [proof_prepend_bracket_27, OAI.Thomason.NormalizedChains.wordBoundary, map_sub, proof_prepend_prepend_self_30]  have proof_wordBoundary_eq_zero_of_not_pairwise_32 {E : Type u} [instLocal1 : PartialOrder.{u} E]  {l : List E}      (h : l.Pairwise (· ≤ ·)) (hn : ¬l.Pairwise (· < ·)) : OAI.Thomason.NormalizedChains.wordBoundary l = 0 := by    induction l with    | nil => exact (hn (by simp)).elim    | cons a l ih =>      by_cases hl : l.Pairwise (· < ·)      · cases l with        | nil => exact (hn (by simp)).elim        | cons b l =>          have hab : a ≤ b := (List.pairwise_cons.mp h).1 b (by simp)          have hab' : ¬a < b := by            intro hab'            exact hn (List.Pairwise.cons_cons_of_trans hab' hl)          have heq : a = b := (lt_or_eq_of_le hab).resolve_left hab'          subst b          exact proof_wordBoundary_repeated_31 a l      · simp [OAI.Thomason.NormalizedChains.wordBoundary, proof_bracket_of_not_pairwise_23 hl, ih h.tail hl]  have proof_boundary_bracket_33 {E : Type u} [instLocal1 : PartialOrder.{u} E]  {l : List E} (h : l.Pairwise (· ≤ ·)) :      OAI.Thomason.NormalizedChains.boundary (OAI.Thomason.NormalizedChains.bracket l) = OAI.Thomason.NormalizedChains.wordBoundary l := by    classical    by_cases hs : l.Pairwise (· < ·)    · rw [proof_bracket_of_pairwise_22 hs]      change Finsupp.linearCombination ℤ (fun l : OAI.Thomason.NormalizedChains.Word E => OAI.Thomason.NormalizedChains.wordBoundary l.val)        (Finsupp.single (⟨l, hs⟩ : OAI.Thomason.NormalizedChains.Word E) 1) = _      rw [Finsupp.linearCombination_single]      simp []    · simp [proof_bracket_of_not_pairwise_23 hs, proof_wordBoundary_eq_zero_of_not_pairwise_32 h hs]  have proof_faces_nil_34 {E : Type u} {M : Type u} [instLocal2 : AddCommGroup.{u} M]  (H : List E → M) : OAI.Thomason.NormalizedChains.faces H [] = 0 := rfl  have proof_faces_cons_35 {E : Type u} {M : Type u} [instLocal2 : AddCommGroup.{u} M]  (H : List E → M) (a : E) (l : List E) :      OAI.Thomason.NormalizedChains.faces H (a :: l) = H l - OAI.Thomason.NormalizedChains.faces (fun m => H (a :: m)) l := rfl  have proof_faces_hom_36 {E : Type u} {M : Type u} [instLocal2 : AddCommGroup.{u} M]  {M' : Type u} [AddCommGroup M'] (q : M →+ M')      (H : List E → M) (l : List E) :      q (OAI.Thomason.NormalizedChains.faces H l) = OAI.Thomason.NormalizedChains.faces (fun m => q (H m)) l := by    induction l generalizing H with    | nil => simp only [OAI.Thomason.NormalizedChains.faces, map_zero]    | cons a l ih => simp only [OAI.Thomason.NormalizedChains.faces, map_sub, ih]  have proof_faces_bracket_37 {E : Type u} [instLocal1 : PartialOrder.{u} E]  (l : List E) : OAI.Thomason.NormalizedChains.faces OAI.Thomason.NormalizedChains.bracket l = OAI.Thomason.NormalizedChains.wordBoundary l := by    induction l with    | nil => rfl    | cons a l ih =>      rw [proof_faces_cons_35, proof_wordBoundary_cons_26]      have h := proof_faces_hom_36 (OAI.Thomason.NormalizedChains.prepend a).toAddMonoidHom OAI.Thomason.NormalizedChains.bracket l      simp only [LinearMap.toAddMonoidHom_coe, proof_prepend_bracket_27] at h      rw [← h, ih]  have proof_faces_congr_38 {E : Type u} {M : Type u} [instLocal2 : AddCommGroup.{u} M]  {H K : List E → M} {l : List E}      (h : ∀ m, m.Sublist l → H m = K m) : OAI.Thomason.NormalizedChains.faces H l = OAI.Thomason.NormalizedChains.faces K l := by    induction l generalizing H K with    | nil => rfl    | cons a l ih =>      rw [proof_faces_cons_35, proof_faces_cons_35, h l (List.sublist_cons_self a l)]      congr 1      exact ih (fun m hm => h (a :: m) (List.Sublist.cons_cons a hm))  have proof_faces_sub_39 {E : Type u} {M : Type u} [instLocal2 : AddCommGroup.{u} M]  (H K : List E → M) (l : List E) :      OAI.Thomason.NormalizedChains.faces (fun m => H m - K m) l = OAI.Thomason.NormalizedChains.faces H l - OAI.Thomason.NormalizedChains.faces K l := by    induction l generalizing H K with    | nil => simp [proof_faces_nil_34]    | cons a l ih => simp only [proof_faces_cons_35, ih]; abel  have proof_faces_faces_40 {E : Type u} {M : Type u} [instLocal2 : AddCommGroup.{u} M]  (H : List E → M) (l : List E) :      OAI.Thomason.NormalizedChains.faces (OAI.Thomason.NormalizedChains.faces H) l = 0 := by    induction l generalizing H with    | nil => rfl    | cons a l ih =>      simp only [proof_faces_cons_35]      rw [proof_faces_sub_39, ih]      simp []  have proof_boundary_wordBoundary_41 {E : Type u} [instLocal1 : PartialOrder.{u} E]  {l : List E} (h : l.Pairwise (· ≤ ·)) :      OAI.Thomason.NormalizedChains.boundary (OAI.Thomason.NormalizedChains.wordBoundary l) = 0 := by    rw [← proof_faces_bracket_37]    change OAI.Thomason.NormalizedChains.boundary.toAddMonoidHom (OAI.Thomason.NormalizedChains.faces OAI.Thomason.NormalizedChains.bracket l) = 0    rw [proof_faces_hom_36]    have hc : OAI.Thomason.NormalizedChains.faces (fun m => OAI.Thomason.NormalizedChains.boundary (OAI.Thomason.NormalizedChains.bracket m)) l = OAI.Thomason.NormalizedChains.faces OAI.Thomason.NormalizedChains.wordBoundary l := by      apply proof_faces_congr_38      intro m hm      exact proof_boundary_bracket_33 (h.sublist hm)    change OAI.Thomason.NormalizedChains.faces (fun m => OAI.Thomason.NormalizedChains.boundary (OAI.Thomason.NormalizedChains.bracket m)) l = 0    rw [hc]    change OAI.Thomason.NormalizedChains.faces (fun m => OAI.Thomason.NormalizedChains.wordBoundary m) l = 0    simp_rw [← proof_faces_bracket_37]    exact proof_faces_faces_40 OAI.Thomason.NormalizedChains.bracket l  have proof_boundary_boundary_19 {E : Type u} [instLocal1 : PartialOrder.{u} E]  (c : OAI.Thomason.NormalizedChains.Chains E) : OAI.Thomason.NormalizedChains.boundary (OAI.Thomason.NormalizedChains.boundary c) = 0 := by    classical    induction c using Finsupp.induction with    | zero => simp []    | @single_add l z c _ _ ih =>      simp only [map_add, ih, add_zero]      have hz : Finsupp.single l z = z • OAI.Thomason.NormalizedChains.bracket l.val := by        rw [proof_bracket_of_pairwise_22 l.property]        simp only [Finsupp.smul_single, smul_eq_mul, mul_one]      rw [hz]      simp only [map_smul]      rw [proof_boundary_bracket_33 (l.property.imp fun h => le_of_lt h),        proof_boundary_wordBoundary_41 (l.property.imp fun h => le_of_lt h), smul_zero]  exact {    Chain p := OAI.Thomason.NormalizedChains.grade (E := E) (p+1)    group _ := inferInstance    d p :=      { toFun := fun c => ⟨OAI.Thomason.NormalizedChains.boundary c.val, proof_boundary_mem_grade_18 c.property⟩        map_zero' := Subtype.ext (map_zero _)        map_add' := fun x y => Subtype.ext (map_add _ x.val y.val) }    d_d p x := Subtype.ext (proof_boundary_boundary_19 x.val)    augmentation :=      { toFun := fun c => OAI.Thomason.NormalizedChains.emptyCoefficient (OAI.Thomason.NormalizedChains.boundary c.val)        map_zero' := by simp []        map_add' := by intros; simp [] }    augmentation_d x := by      change OAI.Thomason.NormalizedChains.emptyCoefficient (OAI.Thomason.NormalizedChains.boundary (OAI.Thomason.NormalizedChains.boundary x.val)) = 0      rw [proof_boundary_boundary_19, map_zero]    positive := OAI.Thomason.NormalizedChains.positiveGrade  }end OAI.Thomason.NormalizedChainsendsectionnamespace OAI.Thomason.NormalizedChainsvariable {E : Type u} [PartialOrder E]variable {D : Type v} [PartialOrder D] {B : Type w} [PartialOrder B]noncomputable def map (f : E →o D) : OAI.Thomason.NormalizedChains.Chains E →ₗ[ℤ] OAI.Thomason.NormalizedChains.Chains D :=  Finsupp.linearCombination ℤ (fun l : OAI.Thomason.NormalizedChains.Word E => OAI.Thomason.NormalizedChains.bracket (l.val.map f))end OAI.Thomason.NormalizedChainsendsectionnamespace OAI.Thomason.NormalizedChainsvariable {E : Type u} [PartialOrder E]noncomputable def complexMap {D : Type v} [PartialOrder D] (f : E →o D) :    OAI.Thomason.DirectedComplex.Hom (OAI.Thomason.NormalizedChains.complex E) (OAI.Thomason.NormalizedChains.complex D) := by  classical  have proof_mem_grade_iff_20 {E : Type u} [instLocal1 : PartialOrder.{u} E]  (k : ℕ) (c : OAI.Thomason.NormalizedChains.Chains E) :      c ∈ OAI.Thomason.NormalizedChains.grade k ↔ ∀ w, c w ≠ 0 → w.val.length = k := by    simp only [OAI.Thomason.NormalizedChains.grade, Finsupp.mem_supported, Set.subset_def, Finsupp.mem_support_iff,      Finset.mem_coe, Set.mem_ofPred_eq]  have proof_linearCombination_mem_grade_46 {E : Type u} [instLocal1 : PartialOrder.{u} E]  {D : Type v} [PartialOrder D]      (H : OAI.Thomason.NormalizedChains.Word E → OAI.Thomason.NormalizedChains.Chains D) (k j : ℕ)      (hH : ∀ w, w.val.length = k → H w ∈ OAI.Thomason.NormalizedChains.grade j)      {c : OAI.Thomason.NormalizedChains.Chains E} (hc : c ∈ OAI.Thomason.NormalizedChains.grade k) :      Finsupp.linearCombination ℤ H c ∈ OAI.Thomason.NormalizedChains.grade j := by    rw [Finsupp.linearCombination_apply, Finsupp.sum]    apply Submodule.sum_mem    intro w hw    exact Submodule.smul_mem _ _ (hH w ((proof_mem_grade_iff_20 k c).mp hc w      (Finsupp.mem_support_iff.mp hw)))  have proof_bracket_of_pairwise_47 {E : Type v} [instLocal1 : PartialOrder.{v} E]  {l : List E} (h : l.Pairwise (· < ·)) :      OAI.Thomason.NormalizedChains.bracket l = Finsupp.single ⟨l, h⟩ 1 := by    classical    simp [OAI.Thomason.NormalizedChains.bracket, h]  have proof_bracket_of_not_pairwise_48 {E : Type v} [instLocal1 : PartialOrder.{v} E]  {l : List E} (h : ¬l.Pairwise (· < ·)) :      OAI.Thomason.NormalizedChains.bracket l = 0 := by    classical    simp [OAI.Thomason.NormalizedChains.bracket, h]  have proof_bracket_mem_grade_49 {E : Type v} [instLocal1 : PartialOrder.{v} E]  (l : List E) : OAI.Thomason.NormalizedChains.bracket l ∈ OAI.Thomason.NormalizedChains.grade l.length := by    classical    by_cases h : l.Pairwise (· < ·)    · rw [proof_bracket_of_pairwise_47 h]      exact Finsupp.single_mem_supported ℤ 1 rfl    · rw [proof_bracket_of_not_pairwise_48 h]      exact Submodule.zero_mem _  have proof_map_mem_grade_42 {E : Type u} [instLocal1 : PartialOrder.{u} E]  {D : Type v} [PartialOrder D] (f : E →o D) {k : ℕ}      {c : OAI.Thomason.NormalizedChains.Chains E} (hc : c ∈ OAI.Thomason.NormalizedChains.grade k) : OAI.Thomason.NormalizedChains.map f c ∈ OAI.Thomason.NormalizedChains.grade k := by    apply proof_linearCombination_mem_grade_46 _ k k _ hc    intro w hw    simpa only [List.length_map, hw] using proof_bracket_mem_grade_49 (w.val.map f)  have proof_bracket_of_pairwise_22 {E : Type u} [instLocal1 : PartialOrder.{u} E]  {l : List E} (h : l.Pairwise (· < ·)) :      OAI.Thomason.NormalizedChains.bracket l = Finsupp.single ⟨l, h⟩ 1 := by    classical    simp [OAI.Thomason.NormalizedChains.bracket, h]  have proof_bracket_of_not_pairwise_23 {E : Type u} [instLocal1 : PartialOrder.{u} E]  {l : List E} (h : ¬l.Pairwise (· < ·)) :      OAI.Thomason.NormalizedChains.bracket l = 0 := by    classical    simp [OAI.Thomason.NormalizedChains.bracket, h]  have proof_prepend_bracket_27 {E : Type u} [instLocal1 : PartialOrder.{u} E]  (a : E) (l : List E) :      OAI.Thomason.NormalizedChains.prepend a (OAI.Thomason.NormalizedChains.bracket l) = OAI.Thomason.NormalizedChains.bracket (a :: l) := by    classical    by_cases h : l.Pairwise (· < ·)    · rw [proof_bracket_of_pairwise_22 h]      change Finsupp.linearCombination ℤ (fun l : OAI.Thomason.NormalizedChains.Word E => OAI.Thomason.NormalizedChains.bracket (a :: l.val))        (Finsupp.single (⟨l, h⟩ : OAI.Thomason.NormalizedChains.Word E) 1) = _      rw [Finsupp.linearCombination_single]      simp    · have h' : ¬(a :: l).Pairwise (· < ·) := fun hw => h hw.tail      simp [proof_bracket_of_not_pairwise_23 h, proof_bracket_of_not_pairwise_23 h']  have proof_prepend_prepend_self_30 {E : Type u} [instLocal1 : PartialOrder.{u} E]  (a : E) (c : OAI.Thomason.NormalizedChains.Chains E) : OAI.Thomason.NormalizedChains.prepend a (OAI.Thomason.NormalizedChains.prepend a c) = 0 := by    classical    induction c using Finsupp.induction with    | zero => simp []    | @single_add l z c _ _ ih =>      simp only [map_add, ih, add_zero]      have hz : Finsupp.single l z = z • OAI.Thomason.NormalizedChains.bracket l.val := by        rw [proof_bracket_of_pairwise_22 l.property]        simp only [Finsupp.smul_single, smul_eq_mul, mul_one]      rw [hz]      simp only [map_smul, proof_prepend_bracket_27]      have h : ¬(a :: a :: l.val).Pairwise (· < ·) := by simp []      simp [proof_bracket_of_not_pairwise_23 h]  have proof_wordBoundary_nil_25 {E : Type u} [instLocal1 : PartialOrder.{u} E]  : OAI.Thomason.NormalizedChains.wordBoundary ([] : List E) = 0 := rfl  have proof_wordBoundary_cons_26 {E : Type u} [instLocal1 : PartialOrder.{u} E]  (a : E) (l : List E) :      OAI.Thomason.NormalizedChains.wordBoundary (a :: l) = OAI.Thomason.NormalizedChains.bracket l - OAI.Thomason.NormalizedChains.prepend a (OAI.Thomason.NormalizedChains.wordBoundary l) := rfl  have proof_wordBoundary_repeated_31 {E : Type u} [instLocal1 : PartialOrder.{u} E]  (a : E) (l : List E) :      OAI.Thomason.NormalizedChains.wordBoundary (a :: a :: l) = 0 := by    simp [proof_prepend_bracket_27, OAI.Thomason.NormalizedChains.wordBoundary, map_sub, proof_prepend_prepend_self_30]  have proof_wordBoundary_eq_zero_of_not_pairwise_32 {E : Type u} [instLocal1 : PartialOrder.{u} E]  {l : List E}      (h : l.Pairwise (· ≤ ·)) (hn : ¬l.Pairwise (· < ·)) : OAI.Thomason.NormalizedChains.wordBoundary l = 0 := by    induction l with    | nil => exact (hn (by simp)).elim    | cons a l ih =>      by_cases hl : l.Pairwise (· < ·)      · cases l with        | nil => exact (hn (by simp)).elim        | cons b l =>          have hab : a ≤ b := (List.pairwise_cons.mp h).1 b (by simp)          have hab' : ¬a < b := by            intro hab'            exact hn (List.Pairwise.cons_cons_of_trans hab' hl)          have heq : a = b := (lt_or_eq_of_le hab).resolve_left hab'          subst b          exact proof_wordBoundary_repeated_31 a l      · simp [OAI.Thomason.NormalizedChains.wordBoundary, proof_bracket_of_not_pairwise_23 hl, ih h.tail hl]  have proof_boundary_bracket_33 {E : Type u} [instLocal1 : PartialOrder.{u} E]  {l : List E} (h : l.Pairwise (· ≤ ·)) :      OAI.Thomason.NormalizedChains.boundary (OAI.Thomason.NormalizedChains.bracket l) = OAI.Thomason.NormalizedChains.wordBoundary l := by    classical    by_cases hs : l.Pairwise (· < ·)    · rw [proof_bracket_of_pairwise_22 hs]      change Finsupp.linearCombination ℤ (fun l : OAI.Thomason.NormalizedChains.Word E => OAI.Thomason.NormalizedChains.wordBoundary l.val)        (Finsupp.single (⟨l, hs⟩ : OAI.Thomason.NormalizedChains.Word E) 1) = _      rw [Finsupp.linearCombination_single]      simp []    · simp [proof_bracket_of_not_pairwise_23 hs, proof_wordBoundary_eq_zero_of_not_pairwise_32 h hs]  have proof_faces_nil_34 {E : Type u} {M : Type u} [instLocal2 : AddCommGroup.{u} M]  (H : List E → M) : OAI.Thomason.NormalizedChains.faces H [] = 0 := rfl  have proof_faces_cons_35 {E : Type u} {M : Type u} [instLocal2 : AddCommGroup.{u} M]  (H : List E → M) (a : E) (l : List E) :      OAI.Thomason.NormalizedChains.faces H (a :: l) = H l - OAI.Thomason.NormalizedChains.faces (fun m => H (a :: m)) l := rfl  have proof_faces_hom_36 {E : Type u} {M : Type u} [instLocal2 : AddCommGroup.{u} M]  {M' : Type u} [AddCommGroup M'] (q : M →+ M')      (H : List E → M) (l : List E) :      q (OAI.Thomason.NormalizedChains.faces H l) = OAI.Thomason.NormalizedChains.faces (fun m => q (H m)) l := by    induction l generalizing H with    | nil => simp only [OAI.Thomason.NormalizedChains.faces, map_zero]    | cons a l ih => simp only [OAI.Thomason.NormalizedChains.faces, map_sub, ih]  have proof_faces_bracket_37 {E : Type u} [instLocal1 : PartialOrder.{u} E]  (l : List E) : OAI.Thomason.NormalizedChains.faces OAI.Thomason.NormalizedChains.bracket l = OAI.Thomason.NormalizedChains.wordBoundary l := by    induction l with    | nil => rfl    | cons a l ih =>      rw [proof_faces_cons_35, proof_wordBoundary_cons_26]      have h := proof_faces_hom_36 (OAI.Thomason.NormalizedChains.prepend a).toAddMonoidHom OAI.Thomason.NormalizedChains.bracket l      simp only [LinearMap.toAddMonoidHom_coe, proof_prepend_bracket_27] at h      rw [← h, ih]  have proof_faces_nil_50 {E : Type v} {M : Type v} [instLocal2 : AddCommGroup.{v} M]  (H : List E → M) : OAI.Thomason.NormalizedChains.faces H [] = 0 := rfl  have proof_faces_cons_51 {E : Type v} {M : Type v} [instLocal2 : AddCommGroup.{v} M]  (H : List E → M) (a : E) (l : List E) :      OAI.Thomason.NormalizedChains.faces H (a :: l) = H l - OAI.Thomason.NormalizedChains.faces (fun m => H (a :: m)) l := rfl  have proof_wordBoundary_nil_52 {E : Type v} [instLocal1 : PartialOrder.{v} E]  : OAI.Thomason.NormalizedChains.wordBoundary ([] : List E) = 0 := rfl  have proof_wordBoundary_cons_53 {E : Type v} [instLocal1 : PartialOrder.{v} E]  (a : E) (l : List E) :      OAI.Thomason.NormalizedChains.wordBoundary (a :: l) = OAI.Thomason.NormalizedChains.bracket l - OAI.Thomason.NormalizedChains.prepend a (OAI.Thomason.NormalizedChains.wordBoundary l) := rfl  have proof_faces_hom_54 {E : Type v} {M : Type v} [instLocal2 : AddCommGroup.{v} M]  {M' : Type v} [AddCommGroup M'] (q : M →+ M')      (H : List E → M) (l : List E) :      q (OAI.Thomason.NormalizedChains.faces H l) = OAI.Thomason.NormalizedChains.faces (fun m => q (H m)) l := by    induction l generalizing H with    | nil => simp [proof_faces_nil_50]    | cons a l ih => simp only [proof_faces_cons_51, map_sub, ih]  have proof_prepend_bracket_55 {E : Type v} [instLocal1 : PartialOrder.{v} E]  (a : E) (l : List E) :      OAI.Thomason.NormalizedChains.prepend a (OAI.Thomason.NormalizedChains.bracket l) = OAI.Thomason.NormalizedChains.bracket (a :: l) := by    classical    by_cases h : l.Pairwise (· < ·)    · rw [proof_bracket_of_pairwise_47 h]      change Finsupp.linearCombination ℤ (fun l : OAI.Thomason.NormalizedChains.Word E => OAI.Thomason.NormalizedChains.bracket (a :: l.val))        (Finsupp.single (⟨l, h⟩ : OAI.Thomason.NormalizedChains.Word E) 1) = _      rw [Finsupp.linearCombination_single]      simp    · have h' : ¬(a :: l).Pairwise (· < ·) := fun hw => h hw.tail      simp [proof_bracket_of_not_pairwise_48 h, proof_bracket_of_not_pairwise_48 h']  have proof_faces_bracket_56 {E : Type v} [instLocal1 : PartialOrder.{v} E]  (l : List E) : OAI.Thomason.NormalizedChains.faces OAI.Thomason.NormalizedChains.bracket l = OAI.Thomason.NormalizedChains.wordBoundary l := by    induction l with    | nil => rfl    | cons a l ih =>      rw [proof_faces_cons_51, proof_wordBoundary_cons_53]      have h := proof_faces_hom_54 (OAI.Thomason.NormalizedChains.prepend a).toAddMonoidHom OAI.Thomason.NormalizedChains.bracket l      simp only [LinearMap.toAddMonoidHom_coe, proof_prepend_bracket_55] at h      rw [← h, ih]  have proof_faces_hom_57 {E : Type u} {M : Type u} [instLocal2 : AddCommGroup.{u} M]  {M' : Type v} [AddCommGroup M'] (q : M →+ M')      (H : List E → M) (l : List E) :      q (OAI.Thomason.NormalizedChains.faces H l) = OAI.Thomason.NormalizedChains.faces (fun m => q (H m)) l := by    induction l generalizing H with    | nil => simp only [OAI.Thomason.NormalizedChains.faces, map_zero]    | cons a l ih => simp only [OAI.Thomason.NormalizedChains.faces, map_sub, ih]  have proof_faces_map_58 {E : Type v} {M : Type v} [instLocal2 : AddCommGroup.{v} M]  {D : Type u} (f : D → E) (H : List E → M) (l : List D) :      OAI.Thomason.NormalizedChains.faces H (l.map f) = OAI.Thomason.NormalizedChains.faces (fun m => H (m.map f)) l := by    induction l generalizing H with    | nil => rfl    | cons a l ih => simp only [List.map_cons, OAI.Thomason.NormalizedChains.faces, ih]  have proof_faces_nil_59 {E : Type u} {M : Type v} [instLocal2 : AddCommGroup.{v} M]  (H : List E → M) : OAI.Thomason.NormalizedChains.faces H [] = 0 := rfl  have proof_faces_cons_60 {E : Type u} {M : Type v} [instLocal2 : AddCommGroup.{v} M]  (H : List E → M) (a : E) (l : List E) :      OAI.Thomason.NormalizedChains.faces H (a :: l) = H l - OAI.Thomason.NormalizedChains.faces (fun m => H (a :: m)) l := rfl  have proof_faces_congr_61 {E : Type u} {M : Type v} [instLocal2 : AddCommGroup.{v} M]  {H K : List E → M} {l : List E}      (h : ∀ m, m.Sublist l → H m = K m) : OAI.Thomason.NormalizedChains.faces H l = OAI.Thomason.NormalizedChains.faces K l := by    induction l generalizing H K with    | nil => rfl    | cons a l ih =>      rw [proof_faces_cons_60, proof_faces_cons_60, h l (List.sublist_cons_self a l)]      congr 1      exact ih (fun m hm => h (a :: m) (List.Sublist.cons_cons a hm))  have proof_pairwise_of_map_62 {E : Type u} [instLocal1 : PartialOrder.{u} E] {D : Type v} [instLocal3 : PartialOrder.{v} D]  {l : List E} (h : l.Pairwise (· ≤ ·)) (f : E → D)      (hf : (l.map f).Pairwise (· < ·)) : l.Pairwise (· < ·) := by    apply (h.and (List.pairwise_map.mp hf)).imp    intro a b hab    exact lt_of_le_of_ne hab.1 (fun he => (ne_of_lt hab.2) (congrArg f he))  have proof_map_bracket_63 {E : Type u} [instLocal1 : PartialOrder.{u} E] {D : Type v} [instLocal3 : PartialOrder.{v} D]  (f : E →o D) {l : List E} (h : l.Pairwise (· ≤ ·)) :      OAI.Thomason.NormalizedChains.map f (OAI.Thomason.NormalizedChains.bracket l) = OAI.Thomason.NormalizedChains.bracket (l.map f) := by    classical    by_cases hs : l.Pairwise (· < ·)    · rw [proof_bracket_of_pairwise_22 hs]      change Finsupp.linearCombination ℤ (fun l : OAI.Thomason.NormalizedChains.Word E => OAI.Thomason.NormalizedChains.bracket (l.val.map f))        (Finsupp.single (⟨l, hs⟩ : OAI.Thomason.NormalizedChains.Word E) 1) = _      rw [Finsupp.linearCombination_single]      simp    · have hf : ¬(l.map f).Pairwise (· < ·) := fun hm => hs (proof_pairwise_of_map_62 h f hm)      simp [proof_bracket_of_not_pairwise_23 hs, proof_bracket_of_not_pairwise_48 hf]  have proof_map_wordBoundary_64 {E : Type u} [instLocal1 : PartialOrder.{u} E] {D : Type v} [instLocal3 : PartialOrder.{v} D]  (f : E →o D) {l : List E} (h : l.Pairwise (· ≤ ·)) :      OAI.Thomason.NormalizedChains.map f (OAI.Thomason.NormalizedChains.wordBoundary l) = OAI.Thomason.NormalizedChains.wordBoundary (l.map f) := by    rw [← proof_faces_bracket_37, ← proof_faces_bracket_56]    change (OAI.Thomason.NormalizedChains.map f).toAddMonoidHom (OAI.Thomason.NormalizedChains.faces OAI.Thomason.NormalizedChains.bracket l) = _    rw [proof_faces_hom_57, proof_faces_map_58]    apply proof_faces_congr_61    intro m hm    exact proof_map_bracket_63 f (h.sublist hm)  have proof_prepend_prepend_self_65 {E : Type v} [instLocal1 : PartialOrder.{v} E]  (a : E) (c : OAI.Thomason.NormalizedChains.Chains E) : OAI.Thomason.NormalizedChains.prepend a (OAI.Thomason.NormalizedChains.prepend a c) = 0 := by    classical    induction c using Finsupp.induction with    | zero => simp []    | @single_add l z c _ _ ih =>      simp only [map_add, ih, add_zero]      have hz : Finsupp.single l z = z • OAI.Thomason.NormalizedChains.bracket l.val := by        rw [proof_bracket_of_pairwise_47 l.property]        simp only [Finsupp.smul_single, smul_eq_mul, mul_one]      rw [hz]      simp only [map_smul, proof_prepend_bracket_55]      have h : ¬(a :: a :: l.val).Pairwise (· < ·) := by simp []      simp [proof_bracket_of_not_pairwise_48 h]  have proof_wordBoundary_repeated_66 {E : Type v} [instLocal1 : PartialOrder.{v} E]  (a : E) (l : List E) :      OAI.Thomason.NormalizedChains.wordBoundary (a :: a :: l) = 0 := by    simp [proof_prepend_bracket_55, OAI.Thomason.NormalizedChains.wordBoundary, map_sub, proof_prepend_prepend_self_65]  have proof_wordBoundary_eq_zero_of_not_pairwise_67 {E : Type v} [instLocal1 : PartialOrder.{v} E]  {l : List E}      (h : l.Pairwise (· ≤ ·)) (hn : ¬l.Pairwise (· < ·)) : OAI.Thomason.NormalizedChains.wordBoundary l = 0 := by    induction l with    | nil => exact (hn (by simp)).elim    | cons a l ih =>      by_cases hl : l.Pairwise (· < ·)      · cases l with        | nil => exact (hn (by simp)).elim        | cons b l =>          have hab : a ≤ b := (List.pairwise_cons.mp h).1 b (by simp)          have hab' : ¬a < b := by            intro hab'            exact hn (List.Pairwise.cons_cons_of_trans hab' hl)          have heq : a = b := (lt_or_eq_of_le hab).resolve_left hab'          subst b          exact proof_wordBoundary_repeated_66 a l      · simp [OAI.Thomason.NormalizedChains.wordBoundary, proof_bracket_of_not_pairwise_48 hl, ih h.tail hl]  have proof_boundary_bracket_68 {E : Type v} [instLocal1 : PartialOrder.{v} E]  {l : List E} (h : l.Pairwise (· ≤ ·)) :      OAI.Thomason.NormalizedChains.boundary (OAI.Thomason.NormalizedChains.bracket l) = OAI.Thomason.NormalizedChains.wordBoundary l := by    classical    by_cases hs : l.Pairwise (· < ·)    · rw [proof_bracket_of_pairwise_47 hs]      change Finsupp.linearCombination ℤ (fun l : OAI.Thomason.NormalizedChains.Word E => OAI.Thomason.NormalizedChains.wordBoundary l.val)        (Finsupp.single (⟨l, hs⟩ : OAI.Thomason.NormalizedChains.Word E) 1) = _      rw [Finsupp.linearCombination_single]      simp []    · simp [proof_bracket_of_not_pairwise_48 hs, proof_wordBoundary_eq_zero_of_not_pairwise_67 h hs]  have proof_map_boundary_43 {E : Type u} [instLocal1 : PartialOrder.{u} E] {D : Type v} [instLocal3 : PartialOrder.{v} D]  (f : E →o D) (c : OAI.Thomason.NormalizedChains.Chains E) :      OAI.Thomason.NormalizedChains.map f (OAI.Thomason.NormalizedChains.boundary c) = OAI.Thomason.NormalizedChains.boundary (OAI.Thomason.NormalizedChains.map f c) := by    classical    induction c using Finsupp.induction with    | zero => simp []    | @single_add l z c _ _ ih =>      simp only [map_add, ih]      congr 1      have hz : Finsupp.single l z = z • OAI.Thomason.NormalizedChains.bracket l.val := by        rw [proof_bracket_of_pairwise_22 l.property]        simp only [Finsupp.smul_single, smul_eq_mul, mul_one]      have hl := l.property.imp fun h => le_of_lt h      rw [hz]      simp only [map_smul]      rw [proof_boundary_bracket_33 hl, proof_map_wordBoundary_64 f hl, proof_map_bracket_63 f hl,        proof_boundary_bracket_68 (List.pairwise_map.mpr (hl.imp fun hh => f.monotone hh))]  have proof_emptyCoefficient_bracket_69 {E : Type v} [instLocal1 : PartialOrder.{v} E]  (l : List E) :      OAI.Thomason.NormalizedChains.emptyCoefficient (OAI.Thomason.NormalizedChains.bracket l) = if l = [] then 1 else 0 := by    classical    by_cases hl : l = []    · subst l      simp [OAI.Thomason.NormalizedChains.emptyCoefficient, proof_bracket_of_pairwise_47 List.Pairwise.nil, OAI.Thomason.NormalizedChains.emptyWord]    · by_cases hs : l.Pairwise (· < ·)      · have hw : (⟨l, hs⟩ : OAI.Thomason.NormalizedChains.Word E) ≠ OAI.Thomason.NormalizedChains.emptyWord := by          intro he          exact hl (congrArg Subtype.val he)        simp [OAI.Thomason.NormalizedChains.emptyCoefficient, proof_bracket_of_pairwise_47 hs, hw, hl]      · simp [proof_bracket_of_not_pairwise_48 hs, hl]  have proof_emptyCoefficient_bracket_70 {E : Type u} [instLocal1 : PartialOrder.{u} E]  (l : List E) :      OAI.Thomason.NormalizedChains.emptyCoefficient (OAI.Thomason.NormalizedChains.bracket l) = if l = [] then 1 else 0 := by    classical    by_cases hl : l = []    · subst l      simp [OAI.Thomason.NormalizedChains.emptyCoefficient, proof_bracket_of_pairwise_22 List.Pairwise.nil, OAI.Thomason.NormalizedChains.emptyWord]    · by_cases hs : l.Pairwise (· < ·)      · have hw : (⟨l, hs⟩ : OAI.Thomason.NormalizedChains.Word E) ≠ OAI.Thomason.NormalizedChains.emptyWord := by          intro he          exact hl (congrArg Subtype.val he)        simp [OAI.Thomason.NormalizedChains.emptyCoefficient, proof_bracket_of_pairwise_22 hs, hw, hl]      · simp [proof_bracket_of_not_pairwise_23 hs, hl]  have proof_emptyCoefficient_map_44 {E : Type u} [instLocal1 : PartialOrder.{u} E]  {D : Type v} [PartialOrder D] (f : E →o D) (c : OAI.Thomason.NormalizedChains.Chains E) :      OAI.Thomason.NormalizedChains.emptyCoefficient (OAI.Thomason.NormalizedChains.map f c) = OAI.Thomason.NormalizedChains.emptyCoefficient c := by    classical    induction c using Finsupp.induction with    | zero => simp []    | @single_add l z c _ _ ih =>      simp only [map_add, ih]      congr 1      have hz : Finsupp.single l z = z • OAI.Thomason.NormalizedChains.bracket l.val := by        rw [proof_bracket_of_pairwise_22 l.property]        simp only [Finsupp.smul_single, smul_eq_mul, mul_one]      rw [hz]      simp only [map_smul, proof_map_bracket_63 _ (l.property.imp fun h => le_of_lt h),        proof_emptyCoefficient_bracket_69, proof_emptyCoefficient_bracket_70, List.map_eq_nil_iff]  have proof_linearCombination_positive_71 {E : Type u} [instLocal1 : PartialOrder.{u} E]  {D : Type v} [PartialOrder D]      (H : OAI.Thomason.NormalizedChains.Word E → OAI.Thomason.NormalizedChains.Chains D) (hH : ∀ w, OAI.Thomason.NormalizedChains.Positive (H w))      {c : OAI.Thomason.NormalizedChains.Chains E} (hc : OAI.Thomason.NormalizedChains.Positive c) :      OAI.Thomason.NormalizedChains.Positive (Finsupp.linearCombination ℤ H c) := by    intro w    rw [Finsupp.linearCombination_apply, Finsupp.sum]    simp only [Finset.sum_apply, Finsupp.coe_finsetSum]    apply Finset.sum_nonneg    intro i _    exact mul_nonneg (hc i) (hH i w)  have proof_bracket_positive_72 {E : Type v} [instLocal1 : PartialOrder.{v} E]  (l : List E) : OAI.Thomason.NormalizedChains.Positive (OAI.Thomason.NormalizedChains.bracket l) := by    classical    intro w    by_cases h : l.Pairwise (· < ·)    · simp [proof_bracket_of_pairwise_47 h, Finsupp.single_apply]      split <;> omega    · simp [proof_bracket_of_not_pairwise_48 h]  have proof_map_positive_45 {E : Type u} [instLocal1 : PartialOrder.{u} E]  {D : Type v} [PartialOrder D] (f : E →o D)      {c : OAI.Thomason.NormalizedChains.Chains E} (hc : OAI.Thomason.NormalizedChains.Positive c) : OAI.Thomason.NormalizedChains.Positive (OAI.Thomason.NormalizedChains.map f c) :=    proof_linearCombination_positive_71 _ (fun w => proof_bracket_positive_72 (w.val.map f)) hc  exact {    map p :=      { toFun := fun c => ⟨OAI.Thomason.NormalizedChains.map f c.val, proof_map_mem_grade_42 f c.property⟩        map_zero' := Subtype.ext (map_zero _)        map_add' := fun x y => Subtype.ext (map_add _ x.val y.val) }    map_d p x := Subtype.ext (proof_map_boundary_43 f x.val)    map_augmentation x := by      change OAI.Thomason.NormalizedChains.emptyCoefficient (OAI.Thomason.NormalizedChains.boundary (OAI.Thomason.NormalizedChains.map f x.val)) = OAI.Thomason.NormalizedChains.emptyCoefficient (OAI.Thomason.NormalizedChains.boundary x.val)      rw [← proof_map_boundary_43, proof_emptyCoefficient_map_44]    map_positive p x hx := proof_map_positive_45 f hx  }end OAI.Thomason.NormalizedChainsendsectionnamespace OAI.Thomason.NormalizedChainsvariable {E : Type u} [PartialOrder E]open CategoryTheorynoncomputable def simplexComplexes : SimplexCategory ⥤ OAI.Thomason.DirectedComplex.{0} := by  classical  have proof_bracket_of_pairwise_75 {E : Type 0} [instLocal1 : PartialOrder.{0} E]  {l : List E} (h : l.Pairwise (· < ·)) :      OAI.Thomason.NormalizedChains.bracket l = Finsupp.single ⟨l, h⟩ 1 := by    classical    simp [OAI.Thomason.NormalizedChains.bracket, h]  have proof_pairwise_of_map_76 {E : Type 0} [instLocal1 : PartialOrder.{0} E] {D : Type 0} [instLocal3 : PartialOrder.{0} D]  {l : List E} (h : l.Pairwise (· ≤ ·)) (f : E → D)      (hf : (l.map f).Pairwise (· < ·)) : l.Pairwise (· < ·) := by    apply (h.and (List.pairwise_map.mp hf)).imp    intro a b hab    exact lt_of_le_of_ne hab.1 (fun he => (ne_of_lt hab.2) (congrArg f he))  have proof_bracket_of_not_pairwise_77 {E : Type 0} [instLocal1 : PartialOrder.{0} E]  {l : List E} (h : ¬l.Pairwise (· < ·)) :      OAI.Thomason.NormalizedChains.bracket l = 0 := by    classical    simp [OAI.Thomason.NormalizedChains.bracket, h]  have proof_map_bracket_78 {E : Type 0} [instLocal1 : PartialOrder.{0} E] {D : Type 0} [instLocal3 : PartialOrder.{0} D]  (f : E →o D) {l : List E} (h : l.Pairwise (· ≤ ·)) :      OAI.Thomason.NormalizedChains.map f (OAI.Thomason.NormalizedChains.bracket l) = OAI.Thomason.NormalizedChains.bracket (l.map f) := by    classical    by_cases hs : l.Pairwise (· < ·)    · rw [proof_bracket_of_pairwise_75 hs]      change Finsupp.linearCombination ℤ (fun l : OAI.Thomason.NormalizedChains.Word E => OAI.Thomason.NormalizedChains.bracket (l.val.map f))        (Finsupp.single (⟨l, hs⟩ : OAI.Thomason.NormalizedChains.Word E) 1) = _      rw [Finsupp.linearCombination_single]      simp    · have hf : ¬(l.map f).Pairwise (· < ·) := fun hm => hs (proof_pairwise_of_map_76 h f hm)      simp [proof_bracket_of_not_pairwise_77 hs, proof_bracket_of_not_pairwise_77 hf]  have proof_map_id_79 {E : Type 0} [instLocal1 : PartialOrder.{0} E]  (c : OAI.Thomason.NormalizedChains.Chains E) : OAI.Thomason.NormalizedChains.map (OrderHom.id) c = c := by    classical    induction c using Finsupp.induction with    | zero => simp    | @single_add l z c _ _ ih =>      simp only [map_add, ih]      congr 1      have hz : Finsupp.single l z = z • OAI.Thomason.NormalizedChains.bracket l.val := by        rw [proof_bracket_of_pairwise_75 l.property]        simp only [Finsupp.smul_single, smul_eq_mul, mul_one]      rw [hz, map_smul, proof_map_bracket_78 _ (l.property.imp fun h => le_of_lt h)]      simp  have proof_complexMap_id_73 {E : Type 0} [instLocal1 : PartialOrder.{0} E]  : OAI.Thomason.NormalizedChains.complexMap (OrderHom.id : E →o E) =      OAI.Thomason.DirectedComplex.Hom.id (OAI.Thomason.NormalizedChains.complex E) := by    ext p x    apply Subtype.ext    exact proof_map_id_79 x.val  have proof_map_comp_80 {E : Type 0} [instLocal1 : PartialOrder.{0} E] {D : Type 0} [instLocal3 : PartialOrder.{0} D] {B : Type 0} [instLocal5 : PartialOrder.{0} B]  (f : E →o D) (g : D →o B) (c : OAI.Thomason.NormalizedChains.Chains E) :      OAI.Thomason.NormalizedChains.map (g.comp f) c = OAI.Thomason.NormalizedChains.map g (OAI.Thomason.NormalizedChains.map f c) := by    classical    induction c using Finsupp.induction with    | zero => simp    | @single_add l z c _ _ ih =>      simp only [map_add, ih]      congr 1      have hz : Finsupp.single l z = z • OAI.Thomason.NormalizedChains.bracket l.val := by        rw [proof_bracket_of_pairwise_75 l.property]        simp only [Finsupp.smul_single, smul_eq_mul, mul_one]      have hl := l.property.imp fun h => le_of_lt h      rw [hz]      simp only [map_smul]      rw [proof_map_bracket_78 _ hl, proof_map_bracket_78 _ hl,        proof_map_bracket_78 _ (List.pairwise_map.mpr (hl.imp fun hh => f.monotone hh))]      simp [List.map_map]  have proof_complexMap_comp_74 {E : Type 0} [instLocal1 : PartialOrder.{0} E]  {D : Type 0} [PartialOrder D] {B : Type 0} [PartialOrder B]      (f : E →o D) (g : D →o B) : OAI.Thomason.NormalizedChains.complexMap (g.comp f) =        OAI.Thomason.DirectedComplex.Hom.comp (OAI.Thomason.NormalizedChains.complexMap f) (OAI.Thomason.NormalizedChains.complexMap g) := by    ext p x    apply Subtype.ext    exact proof_map_comp_80 f g x.val  exact {    obj m := OAI.Thomason.NormalizedChains.complex (Fin (m.len+1))    map f := OAI.Thomason.NormalizedChains.complexMap f.toOrderHom    map_id _ := proof_complexMap_id_73    map_comp f g := proof_complexMap_comp_74 f.toOrderHom g.toOrderHom  }end OAI.Thomason.NormalizedChainsendsectionnamespace OAI.Thomasonopen CategoryTheory Oppositenoncomputable def orientals : SimplexCategory ⥤ OAI.Thomason.OmegaCategory.{0} :=  OAI.Thomason.NormalizedChains.simplexComplexes ⋙ OAI.Thomason.DirectedComplex.nuFunctorend OAI.Thomasonendsectionnamespace OAI.Thomason.OmegaCategorynoncomputable def ulift (C : OAI.Thomason.OmegaCategory.{u}) : OAI.Thomason.OmegaCategory.{max u v} where  Cell := ULift.{v} C.Cell  source k x := ⟨C.source k x.down⟩  target k x := ⟨C.target k x.down⟩  source_source i j x := congrArg ULift.up (C.source_source i j x.down)  target_target i j x := congrArg ULift.up (C.target_target i j x.down)  source_target i j x := by    simpa only [apply_ite] using congrArg (ULift.up (α := C.Cell)) (C.source_target i j x.down)  target_source i j x := by    simpa only [apply_ite] using congrArg (ULift.up (α := C.Cell)) (C.target_source i j x.down)  comp k x y h := ⟨C.comp k x.down y.down (congrArg ULift.down h)⟩  source_comp_le i k hik x y h :=    congrArg ULift.up (C.source_comp_le i k hik x.down y.down (congrArg ULift.down h))  target_comp_le i k hik x y h :=    congrArg ULift.up (C.target_comp_le i k hik x.down y.down (congrArg ULift.down h))  source_comp_gt i k hki x y h hs :=    congrArg ULift.up (C.source_comp_gt i k hki x.down y.down      (congrArg ULift.down h) (congrArg ULift.down hs))  target_comp_gt i k hki x y h ht :=    congrArg ULift.up (C.target_comp_gt i k hki x.down y.down      (congrArg ULift.down h) (congrArg ULift.down ht))  unit_left k x h := congrArg ULift.up (C.unit_left k x.down (congrArg ULift.down h))  unit_right k x h := congrArg ULift.up (C.unit_right k x.down (congrArg ULift.down h))  assoc k x y z hxy hyz hxy_z hx_yz :=    congrArg ULift.up (C.assoc k x.down y.down z.down      (congrArg ULift.down hxy) (congrArg ULift.down hyz)      (congrArg ULift.down hxy_z) (congrArg ULift.down hx_yz))  interchange k l hkl a b c d hab hcd hac hbd h₁ h₂ :=    congrArg ULift.up (C.interchange k l hkl a.down b.down c.down d.down      (congrArg ULift.down hab) (congrArg ULift.down hcd)      (congrArg ULift.down hac) (congrArg ULift.down hbd)      (congrArg ULift.down h₁) (congrArg ULift.down h₂))  finite_dimension x := by    obtain ⟨k, hk⟩ := C.finite_dimension x.down    exact ⟨k, congrArg ULift.up hk⟩noncomputable def uliftUp (C : OAI.Thomason.OmegaCategory.{u}) : OAI.Thomason.OmegaCategory.Functor C (OAI.Thomason.OmegaCategory.ulift.{u,v} C) where  map := ULift.up  map_source _ _ := rfl  map_target _ _ := rfl  map_comp _ _ _ _ _ := rflnoncomputable def uliftDown (C : OAI.Thomason.OmegaCategory.{u}) : OAI.Thomason.OmegaCategory.Functor (OAI.Thomason.OmegaCategory.ulift.{u,v} C) C where  map := ULift.down  map_source _ _ := rfl  map_target _ _ := rfl  map_comp _ _ _ _ _ := rflend OAI.Thomason.OmegaCategoryendsectionnamespace OAI.Thomason.OmegaCategoryopen CategoryTheorynoncomputable def uliftFunctor : OAI.Thomason.OmegaCategory.{u} ⥤ OAI.Thomason.OmegaCategory.{max u v} where  obj := OAI.Thomason.OmegaCategory.ulift  map {C D} F := OAI.Thomason.OmegaCategory.Functor.comp (OAI.Thomason.OmegaCategory.Functor.comp (OAI.Thomason.OmegaCategory.uliftDown C) F) (OAI.Thomason.OmegaCategory.uliftUp D)end OAI.Thomason.OmegaCategoryendsectionnamespace OAI.Thomasonopen CategoryTheory Oppositenoncomputable def raisedOrientals : SimplexCategory ⥤ OAI.Thomason.OmegaCategory.{u} :=  OAI.Thomason.orientals ⋙ OAI.Thomason.OmegaCategory.uliftFunctor.{0,u}end OAI.Thomasonendsectionnamespace OAI.Thomason.OmegaCategorystructure Presentation where  Generator : Type u  dimension : Generator → ℕ  relations : (C : OAI.Thomason.OmegaCategory.{u}) → (Generator → C.Cell) → Propend OAI.Thomason.OmegaCategoryendsectionnamespace OAI.Thomason.OmegaCategory.Presentationvariable (P : Presentation.{u})structure Interpretation (C : OAI.Thomason.OmegaCategory.{u}) where  map : P.Generator → C.Cell  bounded : ∀ g, C.source (P.dimension g) (map g) = map g  satisfies : P.relations C mapend OAI.Thomason.OmegaCategory.Presentationendsectionnamespace OAI.Thomason.OmegaCategoryinductive CellTerm (G : Type u) where  | gen : G → CellTerm G  | source : ℕ → CellTerm G → CellTerm G  | target : ℕ → CellTerm G → CellTerm G  | comp : ℕ → CellTerm G → CellTerm G → CellTerm Gend OAI.Thomason.OmegaCategoryendsectionnamespace OAI.Thomason.OmegaCategory.CellTermnoncomputable def composeOrLeft (C : OAI.Thomason.OmegaCategory.{v}) (k : ℕ) (x y : C.Cell) : C.Cell := by  classical  exact if h : C.target k x = C.source k y then C.comp k x y h else xnoncomputable def eval {G : Type u} (C : OAI.Thomason.OmegaCategory.{v}) (f : G → C.Cell) : OAI.Thomason.OmegaCategory.CellTerm G → C.Cell  | gen g => f g  | source k x => C.source k (eval C f x)  | target k x => C.target k (eval C f x)  | comp k x y => OAI.Thomason.OmegaCategory.CellTerm.composeOrLeft C k (eval C f x) (eval C f y)end OAI.Thomason.OmegaCategory.CellTermendsectionnamespace OAI.Thomason.OmegaCategory.Presentationvariable (P : Presentation.{u})noncomputable def Equiv (x y : OAI.Thomason.OmegaCategory.CellTerm P.Generator) : Prop :=  ∀ (C : OAI.Thomason.OmegaCategory.{u}) (I : P.Interpretation C), x.eval C I.map = y.eval C I.mapinductive Valid : OAI.Thomason.OmegaCategory.CellTerm P.Generator → Prop  | gen (g) : Valid (.gen g)  | source (k x) : Valid x → Valid (.source k x)  | target (k x) : Valid x → Valid (.target k x)  | comp (k x y) : Valid x → Valid y → P.Equiv (.target k x) (.source k y) → Valid (.comp k x y)noncomputable abbrev ValidTerm := {x : OAI.Thomason.OmegaCategory.CellTerm P.Generator // P.Valid x}noncomputable instance termSetoid : Setoid P.ValidTerm := by  classical  have proof_refl_81 {P : OAI.Thomason.OmegaCategory.Presentation.{u}}  (x : OAI.Thomason.OmegaCategory.CellTerm P.Generator) : P.Equiv x x := fun _ _ => rfl  have proof_symm_82 {P : OAI.Thomason.OmegaCategory.Presentation.{u}} {x : OAI.Thomason.OmegaCategory.CellTerm.{u} (OAI.Thomason.OmegaCategory.Presentation.Generator.{u} P)} {y : OAI.Thomason.OmegaCategory.CellTerm.{u} (OAI.Thomason.OmegaCategory.Presentation.Generator.{u} P)}  (h : P.Equiv x y) : P.Equiv y x := fun C I => (h C I).symm  have proof_trans_83 {P : OAI.Thomason.OmegaCategory.Presentation.{u}} {x : OAI.Thomason.OmegaCategory.CellTerm.{u} (OAI.Thomason.OmegaCategory.Presentation.Generator.{u} P)} {y : OAI.Thomason.OmegaCategory.CellTerm.{u} (OAI.Thomason.OmegaCategory.Presentation.Generator.{u} P)} {z : OAI.Thomason.OmegaCategory.CellTerm.{u} (OAI.Thomason.OmegaCategory.Presentation.Generator.{u} P)}  (h : P.Equiv x y) (h' : P.Equiv y z) : P.Equiv x z :=    fun C I => (h C I).trans (h' C I)  exact {    r x y := P.Equiv x.val y.val    iseqv := ⟨fun _ => proof_refl_81 _, fun h => (proof_symm_82 h), fun h h' => (proof_trans_83 h h')⟩  }noncomputable abbrev Cells := Quotient P.termSetoidnoncomputable def evaluate (C : OAI.Thomason.OmegaCategory.{u}) (I : P.Interpretation C) : P.Cells → C.Cell :=  Quotient.lift (fun x : P.ValidTerm => x.val.eval C I.map) (fun _ _ h => h C I)end OAI.Thomason.OmegaCategory.Presentationendsectionnamespace OAI.Thomason.OmegaCategory.CellTermnoncomputable def dimension {G : Type u} (d : G → ℕ) : OAI.Thomason.OmegaCategory.CellTerm G → ℕ  | gen g => d g  | source k _ => k  | target k _ => k  | comp k x y => max (k+1) (max (dimension d x) (dimension d y))end OAI.Thomason.OmegaCategory.CellTermendsectionnamespace OAI.Thomason.OmegaCategory.Presentationvariable (P : Presentation.{u})noncomputable def sourceTerm (k : ℕ) (x : P.ValidTerm) : P.ValidTerm := ⟨.source k x.val, OAI.Thomason.OmegaCategory.Presentation.Valid.source (P := P) k x.val x.property⟩noncomputable def source (k : ℕ) : P.Cells → P.Cells := by  classical  have proof_source_84 {P : OAI.Thomason.OmegaCategory.Presentation.{u}} {x : OAI.Thomason.OmegaCategory.CellTerm.{u} (OAI.Thomason.OmegaCategory.Presentation.Generator.{u} P)} {y : OAI.Thomason.OmegaCategory.CellTerm.{u} (OAI.Thomason.OmegaCategory.Presentation.Generator.{u} P)}  (k : ℕ) (h : P.Equiv x y) : P.Equiv (.source k x) (.source k y) :=    fun C I => congrArg (C.source k) (h C I)  exact    Quotient.map (P.sourceTerm k) (fun _ _ h => (proof_source_84 k h))noncomputable def targetTerm (k : ℕ) (x : P.ValidTerm) : P.ValidTerm := ⟨.target k x.val, OAI.Thomason.OmegaCategory.Presentation.Valid.target (P := P) k x.val x.property⟩noncomputable def target (k : ℕ) : P.Cells → P.Cells := by  classical  have proof_target_85 {P : OAI.Thomason.OmegaCategory.Presentation.{u}} {x : OAI.Thomason.OmegaCategory.CellTerm.{u} (OAI.Thomason.OmegaCategory.Presentation.Generator.{u} P)} {y : OAI.Thomason.OmegaCategory.CellTerm.{u} (OAI.Thomason.OmegaCategory.Presentation.Generator.{u} P)}  (k : ℕ) (h : P.Equiv x y) : P.Equiv (.target k x) (.target k y) :=    fun C I => congrArg (C.target k) (h C I)  exact    Quotient.map (P.targetTerm k) (fun _ _ h => (proof_target_85 k h))noncomputable def compTerm (k : ℕ) (x y : P.ValidTerm) : P.ValidTerm := by  classical  exact if h : P.Equiv (.target k x.val) (.source k y.val) then    ⟨.comp k x.val y.val, OAI.Thomason.OmegaCategory.Presentation.Valid.comp (P := P) k x.val y.val x.property y.property h⟩ else xnoncomputable def comp (k : ℕ) (x y : P.Cells) (_ : P.target k x = P.source k y) : P.Cells := by  classical  have proof_trans_83 {P : OAI.Thomason.OmegaCategory.Presentation.{u}} {x : OAI.Thomason.OmegaCategory.CellTerm.{u} (OAI.Thomason.OmegaCategory.Presentation.Generator.{u} P)} {y : OAI.Thomason.OmegaCategory.CellTerm.{u} (OAI.Thomason.OmegaCategory.Presentation.Generator.{u} P)} {z : OAI.Thomason.OmegaCategory.CellTerm.{u} (OAI.Thomason.OmegaCategory.Presentation.Generator.{u} P)}  (h : P.Equiv x y) (h' : P.Equiv y z) : P.Equiv x z :=    fun C I => (h C I).trans (h' C I)  have proof_symm_82 {P : OAI.Thomason.OmegaCategory.Presentation.{u}} {x : OAI.Thomason.OmegaCategory.CellTerm.{u} (OAI.Thomason.OmegaCategory.Presentation.Generator.{u} P)} {y : OAI.Thomason.OmegaCategory.CellTerm.{u} (OAI.Thomason.OmegaCategory.Presentation.Generator.{u} P)}  (h : P.Equiv x y) : P.Equiv y x := fun C I => (h C I).symm  have proof_target_85 {P : OAI.Thomason.OmegaCategory.Presentation.{u}} {x : OAI.Thomason.OmegaCategory.CellTerm.{u} (OAI.Thomason.OmegaCategory.Presentation.Generator.{u} P)} {y : OAI.Thomason.OmegaCategory.CellTerm.{u} (OAI.Thomason.OmegaCategory.Presentation.Generator.{u} P)}  (k : ℕ) (h : P.Equiv x y) : P.Equiv (.target k x) (.target k y) :=    fun C I => congrArg (C.target k) (h C I)  have proof_source_84 {P : OAI.Thomason.OmegaCategory.Presentation.{u}} {x : OAI.Thomason.OmegaCategory.CellTerm.{u} (OAI.Thomason.OmegaCategory.Presentation.Generator.{u} P)} {y : OAI.Thomason.OmegaCategory.CellTerm.{u} (OAI.Thomason.OmegaCategory.Presentation.Generator.{u} P)}  (k : ℕ) (h : P.Equiv x y) : P.Equiv (.source k x) (.source k y) :=    fun C I => congrArg (C.source k) (h C I)  have proof_composable_congr_87 {P : OAI.Thomason.OmegaCategory.Presentation.{u}} {x : OAI.Thomason.OmegaCategory.CellTerm.{u} (OAI.Thomason.OmegaCategory.Presentation.Generator.{u} P)} {y : OAI.Thomason.OmegaCategory.CellTerm.{u} (OAI.Thomason.OmegaCategory.Presentation.Generator.{u} P)} {x' : OAI.Thomason.OmegaCategory.CellTerm.{u} (OAI.Thomason.OmegaCategory.Presentation.Generator.{u} P)} {y' : OAI.Thomason.OmegaCategory.CellTerm.{u} (OAI.Thomason.OmegaCategory.Presentation.Generator.{u} P)}  (k : ℕ) (hx : P.Equiv x x') (hy : P.Equiv y y') :      P.Equiv (.target k x) (.source k y) ↔ P.Equiv (.target k x') (.source k y') :=    ⟨fun h => (proof_trans_83    (proof_symm_82 (proof_target_85 k hx))    (proof_trans_83 h (proof_source_84 k hy))),     fun h => (proof_trans_83 (proof_target_85 k hx)    (proof_trans_83 h      (proof_symm_82 (proof_source_84 k hy))))⟩  have proof_comp_88 {P : OAI.Thomason.OmegaCategory.Presentation.{u}} {x : OAI.Thomason.OmegaCategory.CellTerm.{u} (OAI.Thomason.OmegaCategory.Presentation.Generator.{u} P)} {y : OAI.Thomason.OmegaCategory.CellTerm.{u} (OAI.Thomason.OmegaCategory.Presentation.Generator.{u} P)} {x' : OAI.Thomason.OmegaCategory.CellTerm.{u} (OAI.Thomason.OmegaCategory.Presentation.Generator.{u} P)} {y' : OAI.Thomason.OmegaCategory.CellTerm.{u} (OAI.Thomason.OmegaCategory.Presentation.Generator.{u} P)}  (k : ℕ) (hx : P.Equiv x x') (hy : P.Equiv y y') :      P.Equiv (.comp k x y) (.comp k x' y') := by    intro C I    exact congrArg₂ (OAI.Thomason.OmegaCategory.CellTerm.composeOrLeft C k) (hx C I) (hy C I)  have proof_compTerm_equiv_86 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  (k : ℕ) {x y x' y' : P.ValidTerm}      (hx : P.Equiv x.val x'.val) (hy : P.Equiv y.val y'.val) :      P.Equiv (P.compTerm k x y).val (P.compTerm k x' y').val := by    classical    have he := proof_composable_congr_87 k hx hy    by_cases h : P.Equiv (.target k x.val) (.source k y.val)    · simp only [OAI.Thomason.OmegaCategory.Presentation.compTerm, dite_eq_left h, dite_eq_left (he.mp h)]      exact proof_comp_88 k hx hy    · simp only [OAI.Thomason.OmegaCategory.Presentation.compTerm, dite_eq_right h, dite_eq_right (mt he.mpr h)]      exact hx  exact    Quotient.map₂ (P.compTerm k) (fun _ _ hx _ _ hy => (proof_compTerm_equiv_86 P k hx hy)) x ynoncomputable abbrev category : OAI.Thomason.OmegaCategory.{u} := by  classical  have proof_cells_ext_89 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  {x y : P.Cells}      (h : ∀ (C : OAI.Thomason.OmegaCategory.{u}) (I : P.Interpretation C), P.evaluate C I x = P.evaluate C I y) : x = y := by    induction x using Quotient.inductionOn with | h x =>      induction y using Quotient.inductionOn with | h y =>        exact Quotient.sound h  have proof_evaluate_source_90 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  (C : OAI.Thomason.OmegaCategory.{u}) (I : P.Interpretation C) (k : ℕ) (x : P.Cells) :      P.evaluate C I (P.source k x) = C.source k (P.evaluate C I x) := by    induction x using Quotient.inductionOn    rfl  have proof_evaluate_target_91 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  (C : OAI.Thomason.OmegaCategory.{u}) (I : P.Interpretation C) (k : ℕ) (x : P.Cells) :      P.evaluate C I (P.target k x) = C.target k (P.evaluate C I x) := by    induction x using Quotient.inductionOn    rfl  have proof_evaluate_composable_94 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  (C : OAI.Thomason.OmegaCategory.{u}) (I : P.Interpretation C) (k : ℕ)      (x y : P.Cells) (h : P.target k x = P.source k y) :      C.target k (P.evaluate C I x) = C.source k (P.evaluate C I y) := by    rw [← proof_evaluate_target_91, ← proof_evaluate_source_90, h]  have proof_evaluate_comp_92 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  (C : OAI.Thomason.OmegaCategory.{u}) (I : P.Interpretation C) (k : ℕ)      (x y : P.Cells) (h : P.target k x = P.source k y) :      P.evaluate C I (P.comp k x y h) =        C.comp k (P.evaluate C I x) (P.evaluate C I y) (proof_evaluate_composable_94 P C I k x y h) := by    induction x using Quotient.inductionOn with | h x =>      induction y using Quotient.inductionOn with | h y =>        have hm : P.Equiv (.target k x.val) (.source k y.val) := Quotient.exact h        change (P.compTerm k x y).val.eval C I.map = _        have hm' : C.target k (x.val.eval C I.map) = C.source k (y.val.eval C I.map) := hm C I        simp only [OAI.Thomason.OmegaCategory.Presentation.compTerm, dite_eq_left hm, OAI.Thomason.OmegaCategory.CellTerm.eval, OAI.Thomason.OmegaCategory.CellTerm.composeOrLeft, dite_eq_left hm']        rfl  have proof_source_source_self_95 (C : OAI.Thomason.OmegaCategory.{u})  (k : ℕ) (x : C.Cell) :      C.source k (C.source k x) = C.source k x := by    simp [C.source_source]  have proof_source_target_self_96 (C : OAI.Thomason.OmegaCategory.{u})  (k : ℕ) (x : C.Cell) :      C.source k (C.target k x) = C.target k x := by    simp [C.source_target]  have proof_source_composable_97 (C : OAI.Thomason.OmegaCategory.{u})  {k i : ℕ} (hki : k < i) {x y : C.Cell}      (h : C.target k x = C.source k y) :      C.target k (C.source i x) = C.source k (C.source i y) := by    rw [C.target_source, ite_eq_left hki, C.source_source, min_eq_left (le_of_lt hki)]    exact h  have proof_source_fixed_upwards_98 (C : OAI.Thomason.OmegaCategory.{u})  {i j : ℕ} (hij : i ≤ j) {x : C.Cell}      (h : C.source i x = x) : C.source j x = x := by    rw [← h, C.source_source, min_eq_right hij]  have proof_eval_dimension_93 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  {x : OAI.Thomason.OmegaCategory.CellTerm P.Generator} (hx : P.Valid x)      (C : OAI.Thomason.OmegaCategory.{u}) (I : P.Interpretation C) :      C.source (x.dimension P.dimension) (x.eval C I.map) = x.eval C I.map := by    induction hx with    | gen g => exact I.bounded g    | source k x hx ih => exact (proof_source_source_self_95 C k    (OAI.Thomason.OmegaCategory.CellTerm.eval C (OAI.Thomason.OmegaCategory.Presentation.Interpretation.map I) x))    | target k x hx ih => exact (proof_source_target_self_96 C k    (OAI.Thomason.OmegaCategory.CellTerm.eval C (OAI.Thomason.OmegaCategory.Presentation.Interpretation.map I) x))    | comp k x y hx hy h ihx ihy =>      have hm := h C I      change C.target k (x.eval C I.map) = C.source k (y.eval C I.map) at hm      simp only [OAI.Thomason.OmegaCategory.CellTerm.dimension, OAI.Thomason.OmegaCategory.CellTerm.eval, OAI.Thomason.OmegaCategory.CellTerm.composeOrLeft, dite_eq_left hm]      have hkn : k < max (k+1) (max (x.dimension P.dimension) (y.dimension P.dimension)) := by omega      rw [C.source_comp_gt _ k hkn _ _ hm (proof_source_composable_97 C hkn hm)]      congr 1      · exact (proof_source_fixed_upwards_98 C (by omega) ihx)      · exact (proof_source_fixed_upwards_98 C (by omega) ihy)  exact {    Cell := P.Cells    source := P.source    target := P.target    comp := P.comp    source_source i j x := by      apply (proof_cells_ext_89 P)      intro C I      simp only [proof_evaluate_source_90, C.source_source]    target_target i j x := by      apply (proof_cells_ext_89 P)      intro C I      simp only [proof_evaluate_target_91, C.target_target]    source_target i j x := by      apply (proof_cells_ext_89 P)      intro C I      by_cases hij : i < j <;> simp [proof_evaluate_source_90, proof_evaluate_target_91, hij, C.source_target]    target_source i j x := by      apply (proof_cells_ext_89 P)      intro C I      by_cases hij : i < j <;> simp [proof_evaluate_source_90, proof_evaluate_target_91, hij, C.target_source]    source_comp_le i k hik x y h := by      apply (proof_cells_ext_89 P)      intro C I      simp only [proof_evaluate_source_90, proof_evaluate_comp_92]      exact C.source_comp_le i k hik _ _ _    target_comp_le i k hik x y h := by      apply (proof_cells_ext_89 P)      intro C I      simp only [proof_evaluate_target_91, proof_evaluate_comp_92]      exact C.target_comp_le i k hik _ _ _    source_comp_gt i k hki x y h hs := by      apply (proof_cells_ext_89 P)      intro C I      simp only [proof_evaluate_source_90, proof_evaluate_comp_92]      exact C.source_comp_gt i k hki _ _ _ _    target_comp_gt i k hki x y h hs := by      apply (proof_cells_ext_89 P)      intro C I      simp only [proof_evaluate_target_91, proof_evaluate_comp_92]      exact C.target_comp_gt i k hki _ _ _ _    unit_left k x h := by      apply (proof_cells_ext_89 P)      intro C I      simp only [proof_evaluate_source_90, proof_evaluate_comp_92]      exact C.unit_left k _ _    unit_right k x h := by      apply (proof_cells_ext_89 P)      intro C I      simp only [proof_evaluate_target_91, proof_evaluate_comp_92]      exact C.unit_right k _ _    assoc k x y z hxy hyz hxy_z hx_yz := by      apply (proof_cells_ext_89 P)      intro C I      simp only [proof_evaluate_comp_92]      exact C.assoc k _ _ _ _ _ _ _    interchange k l hkl a b c d hab hcd hac hbd hab_cd hac_bd := by      apply (proof_cells_ext_89 P)      intro C I      simp only [proof_evaluate_comp_92]      exact C.interchange k l hkl _ _ _ _ _ _ _ _ _ _    finite_dimension x := by      induction x using Quotient.inductionOn with | h x =>        refine ⟨x.val.dimension P.dimension, ?_⟩        apply (proof_cells_ext_89 P)        intro C I        exact (proof_eval_dimension_93 P (Subtype.property x) C I)  }end OAI.Thomason.OmegaCategory.Presentationendsectionnamespace OAI.Thomason.OmegaCategoryopen CategoryTheory Limitsvariable {J : Type u} [Category.{u} J]noncomputable abbrev colimitPresentation (F : J ⥤ OAI.Thomason.OmegaCategory.{u}) : OAI.Thomason.OmegaCategory.Presentation.{u} where  Generator := (j : J) × (F.obj j).Cell  dimension g := Classical.choose ((F.obj g.1).finite_dimension g.2)  relations C f := ∃ ι : ∀ j, OAI.Thomason.OmegaCategory.Functor (F.obj j) C,    (∀ j x, f ⟨j, x⟩ = (ι j).map x) ∧    (∀ ⦃j j'⦄ (a : j ⟶ j'), OAI.Thomason.OmegaCategory.Functor.comp (F.map a) (ι j') = ι j)end OAI.Thomason.OmegaCategoryendsectionnamespace OAI.Thomason.OmegaCategory.Presentationvariable (P : Presentation.{u})noncomputable def generator (g : P.Generator) : P.Cells := Quotient.mk _ ⟨.gen g, .gen g⟩end OAI.Thomason.OmegaCategory.Presentationendsectionnamespace OAI.Thomason.OmegaCategoryopen CategoryTheory Limitsvariable {J : Type u} [Category.{u} J]noncomputable def colimitInclusion (F : J ⥤ OAI.Thomason.OmegaCategory.{u}) (j : J) :    OAI.Thomason.OmegaCategory.Functor (F.obj j) (OAI.Thomason.OmegaCategory.colimitPresentation F).category := by  classical  have proof_cells_ext_89 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  {x y : P.Cells}      (h : ∀ (C : OAI.Thomason.OmegaCategory.{u}) (I : P.Interpretation C), P.evaluate C I x = P.evaluate C I y) : x = y := by    induction x using Quotient.inductionOn with | h x =>      induction y using Quotient.inductionOn with | h y =>        exact Quotient.sound h  have proof_evaluate_source_90 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  (C : OAI.Thomason.OmegaCategory.{u}) (I : P.Interpretation C) (k : ℕ) (x : P.Cells) :      P.evaluate C I (P.source k x) = C.source k (P.evaluate C I x) := by    induction x using Quotient.inductionOn    rfl  have proof_evaluate_target_91 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  (C : OAI.Thomason.OmegaCategory.{u}) (I : P.Interpretation C) (k : ℕ) (x : P.Cells) :      P.evaluate C I (P.target k x) = C.target k (P.evaluate C I x) := by    induction x using Quotient.inductionOn    rfl  have proof_evaluate_composable_94 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  (C : OAI.Thomason.OmegaCategory.{u}) (I : P.Interpretation C) (k : ℕ)      (x y : P.Cells) (h : P.target k x = P.source k y) :      C.target k (P.evaluate C I x) = C.source k (P.evaluate C I y) := by    rw [← proof_evaluate_target_91, ← proof_evaluate_source_90, h]  have proof_evaluate_comp_92 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  (C : OAI.Thomason.OmegaCategory.{u}) (I : P.Interpretation C) (k : ℕ)      (x y : P.Cells) (h : P.target k x = P.source k y) :      P.evaluate C I (P.comp k x y h) =        C.comp k (P.evaluate C I x) (P.evaluate C I y) (proof_evaluate_composable_94 P C I k x y h) := by    induction x using Quotient.inductionOn with | h x =>      induction y using Quotient.inductionOn with | h y =>        have hm : P.Equiv (.target k x.val) (.source k y.val) := Quotient.exact h        change (P.compTerm k x y).val.eval C I.map = _        have hm' : C.target k (x.val.eval C I.map) = C.source k (y.val.eval C I.map) := hm C I        simp only [OAI.Thomason.OmegaCategory.Presentation.compTerm, dite_eq_left hm, OAI.Thomason.OmegaCategory.CellTerm.eval, OAI.Thomason.OmegaCategory.CellTerm.composeOrLeft, dite_eq_left hm']        rfl  have proof_evaluate_generator_99  (P : OAI.Thomason.OmegaCategory.Presentation.{u}) (C : OAI.Thomason.OmegaCategory.{u})      (I : P.Interpretation C) (g : P.Generator) : P.evaluate C I (P.generator g) = I.map g := rfl  exact {    map x := (OAI.Thomason.OmegaCategory.colimitPresentation F).generator ⟨j, x⟩    map_source k x := by      apply (proof_cells_ext_89 (OAI.Thomason.OmegaCategory.colimitPresentation F))      intro C I      rcases I.satisfies with ⟨ι, hi, _⟩      simp only [proof_evaluate_source_90, proof_evaluate_generator_99, hi]      exact (ι j).map_source k x    map_target k x := by      apply (proof_cells_ext_89 (OAI.Thomason.OmegaCategory.colimitPresentation F))      intro C I      rcases I.satisfies with ⟨ι, hi, _⟩      simp only [proof_evaluate_target_91, proof_evaluate_generator_99, hi]      exact (ι j).map_target k x    map_comp k x y h h' := by      apply (proof_cells_ext_89 (OAI.Thomason.OmegaCategory.colimitPresentation F))      intro C I      rcases I.satisfies with ⟨ι, hi, _⟩      simp only [proof_evaluate_comp_92, proof_evaluate_generator_99, hi]      exact (ι j).map_comp k x y h _  }noncomputable def presentedCocone (F : J ⥤ OAI.Thomason.OmegaCategory.{u}) : Cocone F := by  classical  have proof_cells_ext_89 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  {x y : P.Cells}      (h : ∀ (C : OAI.Thomason.OmegaCategory.{u}) (I : P.Interpretation C), P.evaluate C I x = P.evaluate C I y) : x = y := by    induction x using Quotient.inductionOn with | h x =>      induction y using Quotient.inductionOn with | h y =>        exact Quotient.sound h  exact {    pt := (OAI.Thomason.OmegaCategory.colimitPresentation F).category    ι := {      app := OAI.Thomason.OmegaCategory.colimitInclusion F      naturality := by        intro j j' a        apply OAI.Thomason.OmegaCategory.Functor.ext        funext x        apply (proof_cells_ext_89 (OAI.Thomason.OmegaCategory.colimitPresentation F))        intro C I        rcases I.satisfies with ⟨ι, hi, hw⟩        change I.map ⟨j', (F.map a).map x⟩ = I.map ⟨j, x⟩        rw [hi, hi]        exact congrArg (fun h : OAI.Thomason.OmegaCategory.Functor (F.obj j) C => h.map x) (hw a) }  }end OAI.Thomason.OmegaCategoryendsectionnamespace OAI.Thomason.OmegaCategory.Presentationvariable (P : Presentation.{u})noncomputable def lift (C : OAI.Thomason.OmegaCategory.{u}) (I : P.Interpretation C) : OAI.Thomason.OmegaCategory.Functor P.category C := by  classical  have proof_evaluate_source_90 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  (C : OAI.Thomason.OmegaCategory.{u}) (I : P.Interpretation C) (k : ℕ) (x : P.Cells) :      P.evaluate C I (P.source k x) = C.source k (P.evaluate C I x) := by    induction x using Quotient.inductionOn    rfl  have proof_evaluate_target_91 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  (C : OAI.Thomason.OmegaCategory.{u}) (I : P.Interpretation C) (k : ℕ) (x : P.Cells) :      P.evaluate C I (P.target k x) = C.target k (P.evaluate C I x) := by    induction x using Quotient.inductionOn    rfl  have proof_evaluate_composable_94 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  (C : OAI.Thomason.OmegaCategory.{u}) (I : P.Interpretation C) (k : ℕ)      (x y : P.Cells) (h : P.target k x = P.source k y) :      C.target k (P.evaluate C I x) = C.source k (P.evaluate C I y) := by    rw [← proof_evaluate_target_91, ← proof_evaluate_source_90, h]  have proof_evaluate_comp_92 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  (C : OAI.Thomason.OmegaCategory.{u}) (I : P.Interpretation C) (k : ℕ)      (x y : P.Cells) (h : P.target k x = P.source k y) :      P.evaluate C I (P.comp k x y h) =        C.comp k (P.evaluate C I x) (P.evaluate C I y) (proof_evaluate_composable_94 P C I k x y h) := by    induction x using Quotient.inductionOn with | h x =>      induction y using Quotient.inductionOn with | h y =>        have hm : P.Equiv (.target k x.val) (.source k y.val) := Quotient.exact h        change (P.compTerm k x y).val.eval C I.map = _        have hm' : C.target k (x.val.eval C I.map) = C.source k (y.val.eval C I.map) := hm C I        simp only [OAI.Thomason.OmegaCategory.Presentation.compTerm, dite_eq_left hm, OAI.Thomason.OmegaCategory.CellTerm.eval, OAI.Thomason.OmegaCategory.CellTerm.composeOrLeft, dite_eq_left hm']        rfl  exact {    map := P.evaluate C I    map_source := (proof_evaluate_source_90 P C I)    map_target := (proof_evaluate_target_91 P C I)    map_comp k x y h _ := (proof_evaluate_comp_92 P C I k x y h)  }end OAI.Thomason.OmegaCategory.Presentationendsectionnamespace OAI.Thomason.OmegaCategoryopen CategoryTheory Limitsvariable {J : Type u} [Category.{u} J]noncomputable def colimitInterpretation (F : J ⥤ OAI.Thomason.OmegaCategory.{u}) (s : Cocone F) :    (OAI.Thomason.OmegaCategory.colimitPresentation F).Interpretation s.pt where  map g := (s.ι.app g.1).map g.2  bounded g := by    exact ((s.ι.app g.1).map_source _ g.2).symm.trans      (congrArg (s.ι.app g.1).map (Classical.choose_spec ((F.obj g.1).finite_dimension g.2)))  satisfies := ⟨fun j => s.ι.app j, fun _ _ => rfl, fun {_ _} a => s.w a⟩noncomputable def presentedCoconeIsColimit (F : J ⥤ OAI.Thomason.OmegaCategory.{u}) :    IsColimit (OAI.Thomason.OmegaCategory.presentedCocone F) := by  classical  have proof_mk_comp_101 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  (k : ℕ) (x y : P.ValidTerm)      (h : P.Equiv (.target k x.val) (.source k y.val))      (h' : P.target k (Quotient.mk _ x) = P.source k (Quotient.mk _ y)) :      P.comp k (Quotient.mk _ x) (Quotient.mk _ y) h' =        Quotient.mk _ ⟨.comp k x.val y.val, OAI.Thomason.OmegaCategory.Presentation.Valid.comp (P := P) k x.val y.val x.property y.property h⟩ := by    change Quotient.mk _ (P.compTerm k x y) = _    simp only [OAI.Thomason.OmegaCategory.Presentation.compTerm, dite_eq_left h]  have proof_map_composable_102 {C : OAI.Thomason.OmegaCategory.{u}} {D : OAI.Thomason.OmegaCategory.{u}}  (F : OAI.Thomason.OmegaCategory.Functor C D) {k : ℕ} {x y : C.Cell}      (h : C.target k x = C.source k y) :      D.target k (F.map x) = D.source k (F.map y) := by    rw [← F.map_target, ← F.map_source, h]  have proof_functor_ext_100 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  {C : OAI.Thomason.OmegaCategory.{u}} {F G : OAI.Thomason.OmegaCategory.Functor P.category C}      (h : ∀ g, F.map (P.generator g) = G.map (P.generator g)) : F = G := by    apply OAI.Thomason.OmegaCategory.Functor.ext    funext x    induction x using Quotient.inductionOn with | h x =>      rcases x with ⟨x, hx⟩      induction hx with      | gen g => exact h g      | source k x hx ih =>        change F.map (P.category.source k (Quotient.mk _ ⟨x, hx⟩)) =          G.map (P.category.source k (Quotient.mk _ ⟨x, hx⟩))        rw [F.map_source, G.map_source, ih]      | target k x hx ih =>        change F.map (P.category.target k (Quotient.mk _ ⟨x, hx⟩)) =          G.map (P.category.target k (Quotient.mk _ ⟨x, hx⟩))        rw [F.map_target, G.map_target, ih]      | comp k x y hx hy hm ihx ihy =>        have hc : P.category.target k (Quotient.mk _ ⟨x, hx⟩) =            P.category.source k (Quotient.mk _ ⟨y, hy⟩) := Quotient.sound hm        rw [← (proof_mk_comp_101 P k ⟨x, hx⟩ ⟨y, hy⟩ hm hc)]        change F.map (P.category.comp k _ _ hc) = G.map (P.category.comp k _ _ hc)        rw [F.map_comp k _ _ hc (proof_map_composable_102 F hc), G.map_comp k _ _ hc (proof_map_composable_102 G hc)]        congr 1  exact {    desc s := (OAI.Thomason.OmegaCategory.colimitPresentation F).lift s.pt (OAI.Thomason.OmegaCategory.colimitInterpretation F s)    fac s j := by      apply OAI.Thomason.OmegaCategory.Functor.ext      funext x      rfl    uniq s m hm := by      apply (proof_functor_ext_100 (OAI.Thomason.OmegaCategory.colimitPresentation F))      intro ⟨j, x⟩      exact congrArg (fun f : OAI.Thomason.OmegaCategory.Functor (F.obj j) s.pt => f.map x) (hm j)  }noncomputable instance hasColimits : HasColimitsOfSize.{u,u} OAI.Thomason.OmegaCategory.{u} where  has_colimits_of_shape := fun _ _ => { has_colimit := fun F => ⟨⟨OAI.Thomason.OmegaCategory.presentedCocone F, OAI.Thomason.OmegaCategory.presentedCoconeIsColimit F⟩⟩ }end OAI.Thomason.OmegaCategoryendsectionnamespace OAI.Thomasonopen CategoryTheory Oppositenoncomputable instance omegaHasSimplicialColimits :    Limits.HasColimitsOfSize.{0,u} OAI.Thomason.OmegaCategory.{u} :=  Limits.hasColimitsOfSizeShrink.{0,u} OAI.Thomason.OmegaCategory.{u}noncomputable def categorification : SSet.{u} ⥤ OAI.Thomason.OmegaCategory.{u} :=  (uliftYoneda.{u} : SimplexCategory ⥤ (SimplexCategoryᵒᵖ ⥤ Type u)).leftKanExtension OAI.Thomason.raisedOrientals.{u}end OAI.Thomasonendsectionnamespace OAI.Thomasonopen CategoryTheorynoncomputable def thomasonLeft : SSet.{u} ⥤ OAI.Thomason.OmegaCategory.{u} :=  (SSet.sd ⋙ SSet.sd) ⋙ OAI.Thomason.categorificationend OAI.Thomasonendsectionnamespace OAI.Thomasonopen CategoryTheory Oppositenoncomputable def streetNerve (C : OAI.Thomason.OmegaCategory.{u}) : SSet.{u} where  obj m := OAI.Thomason.OmegaCategory.Functor (OAI.Thomason.orientals.obj m.unop) C  map f := ↾fun x => OAI.Thomason.OmegaCategory.Functor.comp (OAI.Thomason.orientals.map f.unop) x  map_id m := by    apply ConcreteCategory.hom_ext    intro x    change OAI.Thomason.OmegaCategory.Functor.comp (OAI.Thomason.orientals.map (𝟙 m.unop)) x = x    rw [OAI.Thomason.orientals.map_id]    rfl  map_comp f g := by    apply ConcreteCategory.hom_ext    intro x    change OAI.Thomason.OmegaCategory.Functor.comp (OAI.Thomason.orientals.map (g.unop ≫ f.unop)) x =      OAI.Thomason.OmegaCategory.Functor.comp (OAI.Thomason.orientals.map g.unop)        (OAI.Thomason.OmegaCategory.Functor.comp (OAI.Thomason.orientals.map f.unop) x)    rw [OAI.Thomason.orientals.map_comp]    rflnoncomputable def streetNerveMap {C D : OAI.Thomason.OmegaCategory.{u}} (F : OAI.Thomason.OmegaCategory.Functor C D) :    OAI.Thomason.streetNerve C ⟶ OAI.Thomason.streetNerve D where  app _ := ↾fun x => OAI.Thomason.OmegaCategory.Functor.comp x F  naturality _ _ _ := rflnoncomputable def streetNerveFunctor : OAI.Thomason.OmegaCategory.{u} ⥤ SSet.{u} where  obj := OAI.Thomason.streetNerve  map := OAI.Thomason.streetNerveMapend OAI.Thomasonendsectionnamespace OAI.Thomasonopen CategoryTheorynoncomputable def thomasonRight : OAI.Thomason.OmegaCategory.{u} ⥤ SSet.{u} :=  OAI.Thomason.streetNerveFunctor ⋙ (SSet.ex ⋙ SSet.ex)end OAI.Thomasonendsectionnamespace OAI.Thomasonopen CategoryTheory Oppositenoncomputable def streetYonedaEquiv (C : OAI.Thomason.OmegaCategory.{u}) (m : SimplexCategoryᵒᵖ) :    ((Presheaf.restrictedULiftYoneda.{0} OAI.Thomason.raisedOrientals).obj C).obj m ≃      (OAI.Thomason.streetNerve C).obj m where  toFun F := OAI.Thomason.OmegaCategory.Functor.comp (OAI.Thomason.OmegaCategory.uliftUp _) F.down  invFun F := ULift.up (OAI.Thomason.OmegaCategory.Functor.comp (OAI.Thomason.OmegaCategory.uliftDown _) F)  left_inv _ := rfl  right_inv _ := rflnoncomputable def streetYonedaIso : Presheaf.restrictedULiftYoneda.{0} OAI.Thomason.raisedOrientals.{u} ≅    OAI.Thomason.streetNerveFunctor.{u} :=  NatIso.ofComponents (fun C =>    NatIso.ofComponents (fun m => (OAI.Thomason.streetYonedaEquiv C m).toIso) (by intros; rfl))      (by intros; rfl)noncomputable def categorificationAdjunction : OAI.Thomason.categorification.{u} ⊣ OAI.Thomason.streetNerveFunctor.{u} :=  (Presheaf.uliftYonedaAdjunction.{0}    ((uliftYoneda.{u} : SimplexCategory ⥤ (SimplexCategoryᵒᵖ ⥤ Type u)).leftKanExtension OAI.Thomason.raisedOrientals.{u})    ((uliftYoneda.{u} : SimplexCategory ⥤ (SimplexCategoryᵒᵖ ⥤ Type u)).leftKanExtensionUnit OAI.Thomason.raisedOrientals.{u})).ofNatIsoRight OAI.Thomason.streetYonedaIsoend OAI.Thomasonendsectionnamespace OAI.Thomasonopen CategoryTheorynoncomputable def thomasonAdjunction : OAI.Thomason.thomasonLeft.{u} ⊣ OAI.Thomason.thomasonRight.{u} :=  (SSet.sdExAdjunction.comp SSet.sdExAdjunction).comp OAI.Thomason.categorificationAdjunctionend OAI.Thomasonendsectionnamespace OAI.Thomason.OmegaCategorynoncomputable abbrev truncationPresentation (n : ℕ) (C : OAI.Thomason.OmegaCategory.{u}) : OAI.Thomason.OmegaCategory.Presentation.{u} where  Generator := C.Cell  dimension _ := n  relations D f := D.IsTruncated n ∧ ∃ F : OAI.Thomason.OmegaCategory.Functor C D, f = F.mapnoncomputable def truncationUnit (n : ℕ) (C : OAI.Thomason.OmegaCategory.{u}) :    OAI.Thomason.OmegaCategory.Functor C (OAI.Thomason.OmegaCategory.truncationPresentation n C).category := by  classical  have proof_cells_ext_89 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  {x y : P.Cells}      (h : ∀ (C : OAI.Thomason.OmegaCategory.{u}) (I : P.Interpretation C), P.evaluate C I x = P.evaluate C I y) : x = y := by    induction x using Quotient.inductionOn with | h x =>      induction y using Quotient.inductionOn with | h y =>        exact Quotient.sound h  have proof_evaluate_source_90 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  (C : OAI.Thomason.OmegaCategory.{u}) (I : P.Interpretation C) (k : ℕ) (x : P.Cells) :      P.evaluate C I (P.source k x) = C.source k (P.evaluate C I x) := by    induction x using Quotient.inductionOn    rfl  have proof_evaluate_target_91 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  (C : OAI.Thomason.OmegaCategory.{u}) (I : P.Interpretation C) (k : ℕ) (x : P.Cells) :      P.evaluate C I (P.target k x) = C.target k (P.evaluate C I x) := by    induction x using Quotient.inductionOn    rfl  have proof_evaluate_composable_94 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  (C : OAI.Thomason.OmegaCategory.{u}) (I : P.Interpretation C) (k : ℕ)      (x y : P.Cells) (h : P.target k x = P.source k y) :      C.target k (P.evaluate C I x) = C.source k (P.evaluate C I y) := by    rw [← proof_evaluate_target_91, ← proof_evaluate_source_90, h]  have proof_evaluate_comp_92 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  (C : OAI.Thomason.OmegaCategory.{u}) (I : P.Interpretation C) (k : ℕ)      (x y : P.Cells) (h : P.target k x = P.source k y) :      P.evaluate C I (P.comp k x y h) =        C.comp k (P.evaluate C I x) (P.evaluate C I y) (proof_evaluate_composable_94 P C I k x y h) := by    induction x using Quotient.inductionOn with | h x =>      induction y using Quotient.inductionOn with | h y =>        have hm : P.Equiv (.target k x.val) (.source k y.val) := Quotient.exact h        change (P.compTerm k x y).val.eval C I.map = _        have hm' : C.target k (x.val.eval C I.map) = C.source k (y.val.eval C I.map) := hm C I        simp only [OAI.Thomason.OmegaCategory.Presentation.compTerm, dite_eq_left hm, OAI.Thomason.OmegaCategory.CellTerm.eval, OAI.Thomason.OmegaCategory.CellTerm.composeOrLeft, dite_eq_left hm']        rfl  have proof_evaluate_generator_99  (P : OAI.Thomason.OmegaCategory.Presentation.{u}) (C : OAI.Thomason.OmegaCategory.{u})      (I : P.Interpretation C) (g : P.Generator) : P.evaluate C I (P.generator g) = I.map g := rfl  exact {    map := (OAI.Thomason.OmegaCategory.truncationPresentation n C).generator    map_source k x := by      apply (proof_cells_ext_89 (OAI.Thomason.OmegaCategory.truncationPresentation n C))      intro D I      rcases I.satisfies with ⟨_, F, hF⟩      simp only [proof_evaluate_source_90, proof_evaluate_generator_99, hF]      exact F.map_source k x    map_target k x := by      apply (proof_cells_ext_89 (OAI.Thomason.OmegaCategory.truncationPresentation n C))      intro D I      rcases I.satisfies with ⟨_, F, hF⟩      simp only [proof_evaluate_target_91, proof_evaluate_generator_99, hF]      exact F.map_target k x    map_comp k x y h h' := by      apply (proof_cells_ext_89 (OAI.Thomason.OmegaCategory.truncationPresentation n C))      intro D I      rcases I.satisfies with ⟨_, F, hF⟩      simp only [proof_evaluate_comp_92, proof_evaluate_generator_99, hF]      exact F.map_comp k x y h _  }noncomputable def truncation (n : ℕ) (C : OAI.Thomason.OmegaCategory.{u}) : OAI.Thomason.OmegaCategory.NCategory.{u} n := by  classical  have proof_cells_ext_89 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  {x y : P.Cells}      (h : ∀ (C : OAI.Thomason.OmegaCategory.{u}) (I : P.Interpretation C), P.evaluate C I x = P.evaluate C I y) : x = y := by    induction x using Quotient.inductionOn with | h x =>      induction y using Quotient.inductionOn with | h y =>        exact Quotient.sound h  have proof_evaluate_source_90 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  (C : OAI.Thomason.OmegaCategory.{u}) (I : P.Interpretation C) (k : ℕ) (x : P.Cells) :      P.evaluate C I (P.source k x) = C.source k (P.evaluate C I x) := by    induction x using Quotient.inductionOn    rfl  have proof_truncation_isTruncated_103  (n : ℕ) (C : OAI.Thomason.OmegaCategory.{u}) :      (OAI.Thomason.OmegaCategory.truncationPresentation n C).category.IsTruncated n := by    intro x    apply (proof_cells_ext_89 (OAI.Thomason.OmegaCategory.truncationPresentation n C))    intro D I    rw [proof_evaluate_source_90]    exact I.satisfies.1 _  exact    ⟨(OAI.Thomason.OmegaCategory.truncationPresentation n C).category, proof_truncation_isTruncated_103 n C⟩noncomputable def truncationLift {n : ℕ} {C : OAI.Thomason.OmegaCategory.{u}} (D : OAI.Thomason.OmegaCategory.NCategory.{u} n)    (F : OAI.Thomason.OmegaCategory.Functor C D.val) : OAI.Thomason.OmegaCategory.Functor (OAI.Thomason.OmegaCategory.truncation n C).val D.val :=  (OAI.Thomason.OmegaCategory.truncationPresentation n C).lift D.val {    map := F.map    bounded := fun x => D.property (F.map x)    satisfies := ⟨D.property, F, rfl⟩ }end OAI.Thomason.OmegaCategoryendsectionnamespace OAI.Thomason.OmegaCategoryopen CategoryTheorynoncomputable def truncationFunctor (n : ℕ) : OAI.Thomason.OmegaCategory.{u} ⥤ OAI.Thomason.OmegaCategory.NCategory.{u} n := by  classical  have proof_mk_comp_101 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  (k : ℕ) (x y : P.ValidTerm)      (h : P.Equiv (.target k x.val) (.source k y.val))      (h' : P.target k (Quotient.mk _ x) = P.source k (Quotient.mk _ y)) :      P.comp k (Quotient.mk _ x) (Quotient.mk _ y) h' =        Quotient.mk _ ⟨.comp k x.val y.val, OAI.Thomason.OmegaCategory.Presentation.Valid.comp (P := P) k x.val y.val x.property y.property h⟩ := by    change Quotient.mk _ (P.compTerm k x y) = _    simp only [OAI.Thomason.OmegaCategory.Presentation.compTerm, dite_eq_left h]  have proof_map_composable_102 {C : OAI.Thomason.OmegaCategory.{u}} {D : OAI.Thomason.OmegaCategory.{u}}  (F : OAI.Thomason.OmegaCategory.Functor C D) {k : ℕ} {x y : C.Cell}      (h : C.target k x = C.source k y) :      D.target k (F.map x) = D.source k (F.map y) := by    rw [← F.map_target, ← F.map_source, h]  have proof_functor_ext_100 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  {C : OAI.Thomason.OmegaCategory.{u}} {F G : OAI.Thomason.OmegaCategory.Functor P.category C}      (h : ∀ g, F.map (P.generator g) = G.map (P.generator g)) : F = G := by    apply OAI.Thomason.OmegaCategory.Functor.ext    funext x    induction x using Quotient.inductionOn with | h x =>      rcases x with ⟨x, hx⟩      induction hx with      | gen g => exact h g      | source k x hx ih =>        change F.map (P.category.source k (Quotient.mk _ ⟨x, hx⟩)) =          G.map (P.category.source k (Quotient.mk _ ⟨x, hx⟩))        rw [F.map_source, G.map_source, ih]      | target k x hx ih =>        change F.map (P.category.target k (Quotient.mk _ ⟨x, hx⟩)) =          G.map (P.category.target k (Quotient.mk _ ⟨x, hx⟩))        rw [F.map_target, G.map_target, ih]      | comp k x y hx hy hm ihx ihy =>        have hc : P.category.target k (Quotient.mk _ ⟨x, hx⟩) =            P.category.source k (Quotient.mk _ ⟨y, hy⟩) := Quotient.sound hm        rw [← (proof_mk_comp_101 P k ⟨x, hx⟩ ⟨y, hy⟩ hm hc)]        change F.map (P.category.comp k _ _ hc) = G.map (P.category.comp k _ _ hc)        rw [F.map_comp k _ _ hc (proof_map_composable_102 F hc), G.map_comp k _ _ hc (proof_map_composable_102 G hc)]        congr 1  have proof_truncation_functor_ext_104  {n : ℕ} {C D : OAI.Thomason.OmegaCategory.{u}}      {F G : OAI.Thomason.OmegaCategory.Functor (OAI.Thomason.OmegaCategory.truncation n C).val D}      (h : OAI.Thomason.OmegaCategory.Functor.comp (OAI.Thomason.OmegaCategory.truncationUnit n C) F = OAI.Thomason.OmegaCategory.Functor.comp (OAI.Thomason.OmegaCategory.truncationUnit n C) G) : F = G := by    apply (proof_functor_ext_100 (OAI.Thomason.OmegaCategory.truncationPresentation n C))    intro x    exact congrArg (fun H : OAI.Thomason.OmegaCategory.Functor C D => H.map x) h  exact {    obj := OAI.Thomason.OmegaCategory.truncation n    map {C D} F := OAI.Thomason.OmegaCategory.truncationLift (OAI.Thomason.OmegaCategory.truncation n D) (OAI.Thomason.OmegaCategory.Functor.comp F (OAI.Thomason.OmegaCategory.truncationUnit n D))    map_id C := by      apply proof_truncation_functor_ext_104      rfl    map_comp F G := by      apply proof_truncation_functor_ext_104      rfl  }end OAI.Thomason.OmegaCategoryendsectionnamespace OAI.Thomasonopen CategoryTheory Oppositenoncomputable def categorificationFinite (n : ℕ) : SSet.{u} ⥤ OAI.Thomason.OmegaCategory.NCategory.{u} n :=  OAI.Thomason.categorification ⋙ OAI.Thomason.OmegaCategory.truncationFunctor nend OAI.Thomasonendsectionnamespace OAI.Thomasonopen CategoryTheorynoncomputable def thomasonLeftFinite (n : ℕ) : SSet.{u} ⥤ OAI.Thomason.OmegaCategory.NCategory.{u} n :=  (SSet.sd ⋙ SSet.sd) ⋙ OAI.Thomason.categorificationFinite nend OAI.Thomasonendsectionnamespace OAI.Thomasonopen CategoryTheory Oppositenoncomputable def streetNerveFinite (n : ℕ) : OAI.Thomason.OmegaCategory.NCategory.{u} n ⥤ SSet.{u} where  obj C := OAI.Thomason.streetNerve C.val  map := OAI.Thomason.streetNerveMapend OAI.Thomasonendsectionnamespace OAI.Thomasonopen CategoryTheorynoncomputable def thomasonRightFinite (n : ℕ) : OAI.Thomason.OmegaCategory.NCategory.{u} n ⥤ SSet.{u} :=  OAI.Thomason.streetNerveFinite n ⋙ (SSet.ex ⋙ SSet.ex)end OAI.Thomasonendsectionnamespace OAI.Thomason.OmegaCategoryopen CategoryTheorynoncomputable def nCategoryInclusion (n : ℕ) : OAI.Thomason.OmegaCategory.NCategory.{u} n ⥤ OAI.Thomason.OmegaCategory.{u} where  obj C := C.val  map F := Fnoncomputable def truncationHomEquiv (n : ℕ) (C : OAI.Thomason.OmegaCategory.{u}) (D : OAI.Thomason.OmegaCategory.NCategory.{u} n) :    ((OAI.Thomason.OmegaCategory.truncationFunctor n).obj C ⟶ D) ≃ (C ⟶ (OAI.Thomason.OmegaCategory.nCategoryInclusion n).obj D) := by  classical  have proof_mk_comp_101 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  (k : ℕ) (x y : P.ValidTerm)      (h : P.Equiv (.target k x.val) (.source k y.val))      (h' : P.target k (Quotient.mk _ x) = P.source k (Quotient.mk _ y)) :      P.comp k (Quotient.mk _ x) (Quotient.mk _ y) h' =        Quotient.mk _ ⟨.comp k x.val y.val, OAI.Thomason.OmegaCategory.Presentation.Valid.comp (P := P) k x.val y.val x.property y.property h⟩ := by    change Quotient.mk _ (P.compTerm k x y) = _    simp only [OAI.Thomason.OmegaCategory.Presentation.compTerm, dite_eq_left h]  have proof_map_composable_102 {C : OAI.Thomason.OmegaCategory.{u}} {D : OAI.Thomason.OmegaCategory.{u}}  (F : OAI.Thomason.OmegaCategory.Functor C D) {k : ℕ} {x y : C.Cell}      (h : C.target k x = C.source k y) :      D.target k (F.map x) = D.source k (F.map y) := by    rw [← F.map_target, ← F.map_source, h]  have proof_functor_ext_100 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  {C : OAI.Thomason.OmegaCategory.{u}} {F G : OAI.Thomason.OmegaCategory.Functor P.category C}      (h : ∀ g, F.map (P.generator g) = G.map (P.generator g)) : F = G := by    apply OAI.Thomason.OmegaCategory.Functor.ext    funext x    induction x using Quotient.inductionOn with | h x =>      rcases x with ⟨x, hx⟩      induction hx with      | gen g => exact h g      | source k x hx ih =>        change F.map (P.category.source k (Quotient.mk _ ⟨x, hx⟩)) =          G.map (P.category.source k (Quotient.mk _ ⟨x, hx⟩))        rw [F.map_source, G.map_source, ih]      | target k x hx ih =>        change F.map (P.category.target k (Quotient.mk _ ⟨x, hx⟩)) =          G.map (P.category.target k (Quotient.mk _ ⟨x, hx⟩))        rw [F.map_target, G.map_target, ih]      | comp k x y hx hy hm ihx ihy =>        have hc : P.category.target k (Quotient.mk _ ⟨x, hx⟩) =            P.category.source k (Quotient.mk _ ⟨y, hy⟩) := Quotient.sound hm        rw [← (proof_mk_comp_101 P k ⟨x, hx⟩ ⟨y, hy⟩ hm hc)]        change F.map (P.category.comp k _ _ hc) = G.map (P.category.comp k _ _ hc)        rw [F.map_comp k _ _ hc (proof_map_composable_102 F hc), G.map_comp k _ _ hc (proof_map_composable_102 G hc)]        congr 1  have proof_truncation_functor_ext_104  {n : ℕ} {C D : OAI.Thomason.OmegaCategory.{u}}      {F G : OAI.Thomason.OmegaCategory.Functor (OAI.Thomason.OmegaCategory.truncation n C).val D}      (h : OAI.Thomason.OmegaCategory.Functor.comp (OAI.Thomason.OmegaCategory.truncationUnit n C) F = OAI.Thomason.OmegaCategory.Functor.comp (OAI.Thomason.OmegaCategory.truncationUnit n C) G) : F = G := by    apply (proof_functor_ext_100 (OAI.Thomason.OmegaCategory.truncationPresentation n C))    intro x    exact congrArg (fun H : OAI.Thomason.OmegaCategory.Functor C D => H.map x) h  exact {    toFun F := OAI.Thomason.OmegaCategory.Functor.comp (OAI.Thomason.OmegaCategory.truncationUnit n C) F    invFun := OAI.Thomason.OmegaCategory.truncationLift D    left_inv F := by      apply proof_truncation_functor_ext_104      rfl    right_inv _ := rfl  }noncomputable def truncationAdjunction (n : ℕ) : OAI.Thomason.OmegaCategory.truncationFunctor.{u} n ⊣ OAI.Thomason.OmegaCategory.nCategoryInclusion n := by  classical  have proof_mk_comp_101 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  (k : ℕ) (x y : P.ValidTerm)      (h : P.Equiv (.target k x.val) (.source k y.val))      (h' : P.target k (Quotient.mk _ x) = P.source k (Quotient.mk _ y)) :      P.comp k (Quotient.mk _ x) (Quotient.mk _ y) h' =        Quotient.mk _ ⟨.comp k x.val y.val, OAI.Thomason.OmegaCategory.Presentation.Valid.comp (P := P) k x.val y.val x.property y.property h⟩ := by    change Quotient.mk _ (P.compTerm k x y) = _    simp only [OAI.Thomason.OmegaCategory.Presentation.compTerm, dite_eq_left h]  have proof_map_composable_102 {C : OAI.Thomason.OmegaCategory.{u}} {D : OAI.Thomason.OmegaCategory.{u}}  (F : OAI.Thomason.OmegaCategory.Functor C D) {k : ℕ} {x y : C.Cell}      (h : C.target k x = C.source k y) :      D.target k (F.map x) = D.source k (F.map y) := by    rw [← F.map_target, ← F.map_source, h]  have proof_functor_ext_100 (P : OAI.Thomason.OmegaCategory.Presentation.{u})  {C : OAI.Thomason.OmegaCategory.{u}} {F G : OAI.Thomason.OmegaCategory.Functor P.category C}      (h : ∀ g, F.map (P.generator g) = G.map (P.generator g)) : F = G := by    apply OAI.Thomason.OmegaCategory.Functor.ext    funext x    induction x using Quotient.inductionOn with | h x =>      rcases x with ⟨x, hx⟩      induction hx with      | gen g => exact h g      | source k x hx ih =>        change F.map (P.category.source k (Quotient.mk _ ⟨x, hx⟩)) =          G.map (P.category.source k (Quotient.mk _ ⟨x, hx⟩))        rw [F.map_source, G.map_source, ih]      | target k x hx ih =>        change F.map (P.category.target k (Quotient.mk _ ⟨x, hx⟩)) =          G.map (P.category.target k (Quotient.mk _ ⟨x, hx⟩))        rw [F.map_target, G.map_target, ih]      | comp k x y hx hy hm ihx ihy =>        have hc : P.category.target k (Quotient.mk _ ⟨x, hx⟩) =            P.category.source k (Quotient.mk _ ⟨y, hy⟩) := Quotient.sound hm        rw [← (proof_mk_comp_101 P k ⟨x, hx⟩ ⟨y, hy⟩ hm hc)]        change F.map (P.category.comp k _ _ hc) = G.map (P.category.comp k _ _ hc)        rw [F.map_comp k _ _ hc (proof_map_composable_102 F hc), G.map_comp k _ _ hc (proof_map_composable_102 G hc)]        congr 1  have proof_truncation_functor_ext_104  {n : ℕ} {C D : OAI.Thomason.OmegaCategory.{u}}      {F G : OAI.Thomason.OmegaCategory.Functor (OAI.Thomason.OmegaCategory.truncation n C).val D}      (h : OAI.Thomason.OmegaCategory.Functor.comp (OAI.Thomason.OmegaCategory.truncationUnit n C) F = OAI.Thomason.OmegaCategory.Functor.comp (OAI.Thomason.OmegaCategory.truncationUnit n C) G) : F = G := by    apply (proof_functor_ext_100 (OAI.Thomason.OmegaCategory.truncationPresentation n C))    intro x    exact congrArg (fun H : OAI.Thomason.OmegaCategory.Functor C D => H.map x) h  exact    Adjunction.mkOfHomEquiv {        homEquiv := OAI.Thomason.OmegaCategory.truncationHomEquiv n        homEquiv_naturality_left_symm := by          intro C' C D F G          apply proof_truncation_functor_ext_104          rfl        homEquiv_naturality_right := by          intro C D D' F G          rfl }end OAI.Thomason.OmegaCategoryendsectionnamespace OAI.Thomasonopen CategoryTheory Oppositenoncomputable def categorificationFiniteAdjunction (n : ℕ) :    OAI.Thomason.categorificationFinite.{u} n ⊣ OAI.Thomason.streetNerveFinite.{u} n :=  OAI.Thomason.categorificationAdjunction.comp (OAI.Thomason.OmegaCategory.truncationAdjunction n)end OAI.Thomasonendsectionnamespace OAI.Thomasonopen CategoryTheorynoncomputable def thomasonFiniteAdjunction (n : ℕ) :    OAI.Thomason.thomasonLeftFinite.{u} n ⊣ OAI.Thomason.thomasonRightFinite.{u} n :=  (SSet.sdExAdjunction.comp SSet.sdExAdjunction).comp (OAI.Thomason.categorificationFiniteAdjunction n)end OAI.Thomasonendsectionnamespace OAI.Thomason.WeakHomotopyopen scoped Topology Topology.Homotopyvariable {X : Type u} {Y : Type v} [TopologicalSpace X] [TopologicalSpace Y]noncomputable def loopMap (N : Type w) (f : C(X, Y)) (x : X) : GenLoop N X x → GenLoop N Y (f x) :=  fun p => ⟨f.comp p.val, fun y hy => congrArg f (p.property y hy)⟩noncomputable def groupMap (N : Type w) (f : C(X, Y)) (x : X) :    HomotopyGroup N X x → HomotopyGroup N Y (f x) := by  classical  have proof_loopMap_homotopic_105 {X : Type u} {Y : Type v} [instLocal2 : TopologicalSpace.{u} X] [instLocal3 : TopologicalSpace.{v} Y]  (N : Type w) (f : C(X, Y)) (x : X)      {p q : GenLoop N X x} (h : GenLoop.Homotopic p q) :      GenLoop.Homotopic (OAI.Thomason.WeakHomotopy.loopMap N f x p) (OAI.Thomason.WeakHomotopy.loopMap N f x q) :=    h.comp_continuousMap f  exact    Quotient.map (OAI.Thomason.WeakHomotopy.loopMap N f x) (fun _ _ h => proof_loopMap_homotopic_105 N f x h)noncomputable def componentsMap (f : C(X, Y)) : ZerothHomotopy X → ZerothHomotopy Y :=  ZerothHomotopy.lift (fun x => ZerothHomotopy.mk (f x))    (fun _ _ p => ZerothHomotopy.sound (p.map f.continuous))noncomputable def Equivalence (f : C(X, Y)) : Prop :=  Function.Bijective (OAI.Thomason.WeakHomotopy.componentsMap f) ∧    ∀ (n : ℕ) (x : X), Function.Bijective (OAI.Thomason.WeakHomotopy.groupMap (Fin (n+1)) f x)end OAI.Thomason.WeakHomotopyendsectionnamespace OAI.Thomasonopen CategoryTheorynoncomputable def simplicialWeakEquivalences : MorphismProperty SSet.{u} :=  fun _ _ f => OAI.Thomason.WeakHomotopy.Equivalence (SSet.toTop.map f).homnoncomputable def simplicialFibrations : MorphismProperty SSet.{u} := (SSet.modelCategoryQuillen.J).rlpend OAI.Thomasonendsectionnamespace OAI.Thomasonopen CategoryTheory Limits HomotopicalAlgebrastructure KanQuillenModel where  model : ModelCategory SSet.{u}  weak_eq : model.categoryWithWeakEquivalences.weakEquivalences = OAI.Thomason.simplicialWeakEquivalences  fib_eq : model.categoryWithFibrations.fibrations = OAI.Thomason.simplicialFibrations  cof_eq : model.categoryWithCofibrations.cofibrations = MorphismProperty.monomorphisms SSetnoncomputable def LeftProperFor {C : Type v} [Category.{u} C]    (W Cof : MorphismProperty C) : Prop :=  ∀ {A B X Y : C} (i : A ⟶ B) (f : A ⟶ X) (g : B ⟶ Y) (j : X ⟶ Y),    IsPushout i f g j → Cof i → W f → W gnoncomputable def RightProperFor {C : Type v} [Category.{u} C]    (W Fib : MorphismProperty C) : Prop :=  ∀ {A B X Y : C} (f : A ⟶ B) (g : A ⟶ X) (p : B ⟶ Y) (q : X ⟶ Y),    IsPullback f g p q → Fib q → W p → W gnoncomputable def FibrantFor {C : Type v} [Category.{u} C] (Fib : MorphismProperty C) (Y : C) : Prop :=  ∃ (T : C) (_ : IsTerminal T) (p : Y ⟶ T), Fib pnoncomputable def boundaryImages {C : Type v} [Category.{u} C] (L : SSet.{u} ⥤ C) : MorphismProperty C :=  .ofHoms (fun n : ℕ => L.map (SSet.boundary n).ι)noncomputable def hornImages {C : Type v} [Category.{u} C] (L : SSet.{u} ⥤ C) : MorphismProperty C :=  ⨆ n : ℕ, .ofHoms (fun i : Fin (n+2) => L.map (SSet.horn (n+1) i).ι)structure ExactModelEndpoint {C : Type v} [Category.{u} C]    (L : SSet.{u} ⥤ C) (R : C ⥤ SSet.{u}) (adj : L ⊣ R) where  model : ModelCategory C  weak_eq : model.categoryWithWeakEquivalences.weakEquivalences =    OAI.Thomason.simplicialWeakEquivalences.inverseImage R  fib_eq : model.categoryWithFibrations.fibrations = OAI.Thomason.simplicialFibrations.inverseImage R  cof_eq : model.categoryWithCofibrations.cofibrations =    ((OAI.Thomason.simplicialFibrations.inverseImage R) ⊓ (OAI.Thomason.simplicialWeakEquivalences.inverseImage R)).llp  generating_cofibrations : (OAI.Thomason.boundaryImages L).rlp =    model.categoryWithFibrations.fibrations ⊓ model.categoryWithWeakEquivalences.weakEquivalences  generating_trivial_cofibrations : (OAI.Thomason.hornImages L).rlp = model.categoryWithFibrations.fibrations  weak_factorization_one : MorphismProperty.IsWeakFactorizationSystem    (model.categoryWithCofibrations.cofibrations ⊓ model.categoryWithWeakEquivalences.weakEquivalences)    model.categoryWithFibrations.fibrations  weak_factorization_two : MorphismProperty.IsWeakFactorizationSystem    model.categoryWithCofibrations.cofibrations    (model.categoryWithFibrations.fibrations ⊓ model.categoryWithWeakEquivalences.weakEquivalences)  complete : HasLimitsOfSize.{u,u} C  cocomplete : HasColimitsOfSize.{u,u} C  locallyPresentable : IsLocallyPresentable.{u} C  leftProper : OAI.Thomason.LeftProperFor model.categoryWithWeakEquivalences.weakEquivalences    model.categoryWithCofibrations.cofibrations  rightProper : OAI.Thomason.RightProperFor model.categoryWithWeakEquivalences.weakEquivalences    model.categoryWithFibrations.fibrations  leftQuillen : ∀ {K K' : SSet.{u}} (f : K ⟶ K'), Mono f →    model.categoryWithCofibrations.cofibrations (L.map f) ∧      (OAI.Thomason.simplicialWeakEquivalences f → model.categoryWithWeakEquivalences.weakEquivalences (L.map f))  quillenEquivalence : ∀ (K : SSet.{u}) (Y : C),    OAI.Thomason.FibrantFor model.categoryWithFibrations.fibrations Y →    ∀ f : L.obj K ⟶ Y,      model.categoryWithWeakEquivalences.weakEquivalences f ↔        OAI.Thomason.simplicialWeakEquivalences (adj.homEquiv K Y f)noncomputable def FullMain : Prop :=  Nonempty OAI.Thomason.KanQuillenModel.{u} ∧  Nonempty (OAI.Thomason.ExactModelEndpoint OAI.Thomason.thomasonLeft.{u} OAI.Thomason.thomasonRight OAI.Thomason.thomasonAdjunction) ∧  ∀ n : ℕ, 1 ≤ n →    Nonempty (OAI.Thomason.ExactModelEndpoint (OAI.Thomason.thomasonLeftFinite.{u} n) (OAI.Thomason.thomasonRightFinite n)      (OAI.Thomason.thomasonFiniteAdjunction n))end OAI.Thomasonendsectionnamespace OAI.Thomasonopen CategoryTheorynoncomputable def thomasonWeakEquivalences : MorphismProperty OAI.Thomason.OmegaCategory.{u} :=  OAI.Thomason.simplicialWeakEquivalences.inverseImage OAI.Thomason.thomasonRightnoncomputable def thomasonWeakEquivalencesFinite (n : ℕ) :    MorphismProperty (OAI.Thomason.OmegaCategory.NCategory.{u} n) :=  OAI.Thomason.simplicialWeakEquivalences.inverseImage (OAI.Thomason.thomasonRightFinite n)end OAI.Thomasonendsectionnamespace OAItheorem Thomason.main : OAI.Thomason.FullMain.{u} := by  sorrytheorem Thomason.nerveDetection_allDimensions :    OAI.Thomason.thomasonWeakEquivalences.{u} =      OAI.Thomason.simplicialWeakEquivalences.inverseImage OAI.Thomason.streetNerveFunctor ∧    ∀ n : ℕ, OAI.Thomason.thomasonWeakEquivalencesFinite.{u} n =      OAI.Thomason.simplicialWeakEquivalences.inverseImage (OAI.Thomason.streetNerveFinite n) := by  sorryend OAIendend
Every extracted statement of the accompanying papers

The statements the atlas extracted automatically from each accompanying paper’s TeX source, with links to the full sources.

Thomason Model Structures in Every Strict Higher Dimension

Theorem

For every n\in\{1,2,3,\ldots\}\cup\{\infty\}, the classes (C_n,W_n,F_n) in (eq:prescribed-classes) form a proper combinatorial model structure on \nCat. It is cofibrantly generated by (L_nI,L_nJ), where

I=\{\partial\Delta[m]\hookrightarrow\Delta[m]:m\ge0\},\qquad J=\{\Lambda^k[m]\hookrightarrow\Delta[m]:m\ge1,\ 0\le k\le m\}.

Moreover,

L_n:\sSet_{\KQ}\rightleftarrows(\nCat,C_n,W_n,F_n):R_n

is a Quillen equivalence.

Section 1, Introduction Read it in the paper TeX source, line 41
Show the TeX
For every $n\in\{1,2,3,\ldots\}\cup\{\infty\}$, the classes
$(C_n,W_n,F_n)$ in \eqref{eq:prescribed-classes} form a proper
combinatorial model structure on $\nCat$. It is cofibrantly generated by
$(L_nI,L_nJ)$, where
\[
 I=\{\partial\Delta[m]\hookrightarrow\Delta[m]:m\ge0\},\qquad
 J=\{\Lambda^k[m]\hookrightarrow\Delta[m]:m\ge1,\ 0\le k\le m\}.
\]
Moreover,
\[
 L_n:\sSet_{\KQ}\rightleftarrows(\nCat,C_n,W_n,F_n):R_n
\]
is a Quillen equivalence.
Configuration and file facts
OpenAI’s Lean catalogue
OpenAI’s Lean catalogue does not list this as a main result; the release’s Lean notes for family 317 link it.
Solution module
OAI.CategoryTheory.Thomason.RankedFaithfulness
Allowed axioms
propext, Quot.sound, Classical.choiceThe axioms this configuration allows a proof to use. A replay shows which of them a proof uses.
Imports
Mathlib
Imports from outside Mathlib
None
Local vocabulary
110 local vocabulary declarations
Lines of Lean, without comments or blank lines
1,914
Second proof-verification program (nanoda)
Off in OpenAI's configuration.

Statement comparison

A shareable summary of this page: the proposed paper match, what the Lean statement expresses, and which reviews are recorded.

Plectis Atlas

Thomason model structures and nerve detection in all positive strict dimensions

Family 317: Thomason model structures in all strict higher dimensions

Candidate pairing

Theorem

For every n\in\{1,2,3,\ldots\}\cup\{\infty\}, the classes (C_n,W_n,F_n) in (eq:prescribed-classes) form a proper combinatorial model structure on \nCat. It is cofibrantly generated by (L_nI,L_nJ), where

I=\{\partial\Delta[m]\hookrightarrow\Delta[m]:m\ge0\},\qquad J=\{\Lambda^k[m]\hookrightarrow\Delta[m]:m\ge1,\ 0\le k\le m\}.

Moreover,

L_n:\sSet_{\KQ}\rightleftarrows(\nCat,C_n,W_n,F_n):R_n

is a Quillen equivalence.

Thomason Model Structures in Every Strict Higher Dimension

TeX label thm:main, build/sections/01-introduction.tex, line 41

The Lean statement says

theorem Thomason.main : OAI.Thomason.FullMain.{u} := by  sorrytheorem Thomason.nerveDetection_allDimensions :    OAI.Thomason.thomasonWeakEquivalences.{u} =      OAI.Thomason.simplicialWeakEquivalences.inverseImage OAI.Thomason.streetNerveFunctor ∧    ∀ n : ℕ, OAI.Thomason.thomasonWeakEquivalencesFinite.{u} n =      OAI.Thomason.simplicialWeakEquivalences.inverseImage (OAI.Thomason.streetNerveFinite n) := by  sorry

A Lean statement states the theorem and leaves its proof as sorry on purpose. OpenAI’s proof is in a separate solution module, and a program called Comparator checks that proof against this statement.

Atlas selected this possible match because the two statements share words. No review of whether they mean the same thing is recorded.two independent groups report that Comparator accepted runs for this file at the release version shown here.Statement review: none recorded

110 local vocabulary declarationsAllowed axioms: propext, Quot.sound, Classical.choiceopenai/math at fd4aeebwcook04.github.io/plectis-atlas/statements/ThomasonModelStructures.html

Recorded comparisons with the paper

Atlas records no contributed comparison of this statement with the paper.

Contributed Comparator run reports

Atlas records no contributed report of running Comparator for this statement file.

Questions to resolve when comparing this statement with the paper

  • 110 local vocabulary declarations to read.

Compare this statement with the paperShare a Comparator run reportSuggest a change