{-# OPTIONS --without-K --exact-split --rewriting #-} module Pi.FSMG.FSMG where open import lib.Base open import lib.NType open import lib.NType2 open import lib.PathOver open import lib.PathGroupoid open import Pi.FSMG.Paths open import Pi.Common.Extra module _ {i} where postulate FSMG : (A : Type i) → Type i module _ {A : Type i} where infix 40 _⊗_ postulate η : A → FSMG A I : FSMG A _⊗_ : FSMG A → FSMG A → FSMG A α : {X Y Z : FSMG A} → (X ⊗ Y) ⊗ Z == X ⊗ (Y ⊗ Z) Λ : {X : FSMG A} → I ⊗ X == X ρ : {X : FSMG A} → X ⊗ I == X β : {X Y : FSMG A} → X ⊗ Y == Y ⊗ X ⬠ : {W X Y Z : FSMG A} → α {W ⊗ X} {Y} {Z} ∙ α {W} {X} {Y ⊗ Z} == ap (_⊗ Z) (α {W} {X} {Y}) ∙ α {W} {X ⊗ Y} {Z} ∙ ap (W ⊗_) (α {X} {Y} {Z}) ▽ : {X Y : FSMG A} → α {X} {I} {Y} ∙ ap (X ⊗_) (Λ {Y}) == ap (_⊗ Y) (ρ {X}) ⬡ : {X Y Z : FSMG A} → α {X} {Y} {Z} ∙ β {X} {Y ⊗ Z} ∙ α {Y} {Z} {X} == ap (_⊗ Z) (β {X} {Y}) ∙ α {Y} {X} {Z} ∙ ap (Y ⊗_) (β {X} {Z}) β² : {X Y : FSMG A} → β {X} {Y} ∙ β {Y} {X} == idp {i} {FSMG A} instance trunc : has-level 1 (FSMG A) module FSMGElim {j} {P : FSMG A → Type j} (η* : (a : A) → P (η a)) (I* : P I) (_⊗*_ : {X Y : FSMG A} → (X* : P X) → (Y* : P Y) → P (X ⊗ Y)) (α* : {X Y Z : FSMG A} → {X* : P X} {Y* : P Y} {Z* : P Z} → ((X* ⊗* Y*) ⊗* Z*) == (X* ⊗* (Y* ⊗* Z*)) [ P ↓ α ]) (Λ* : {X : FSMG A} {X* : P X} → (I* ⊗* X*) == X* [ P ↓ Λ ]) (ρ* : {X : FSMG A} {X* : P X} → (X* ⊗* I*) == X* [ P ↓ ρ ]) (β* : {X Y : FSMG A} {X* : P X} {Y* : P Y} → (X* ⊗* Y*) == (Y* ⊗* X*) [ P ↓ β ]) (⬠* : {W X Y Z : FSMG A} {W* : P W} {X* : P X} {Y* : P Y} {Z* : P Z} → let p1 = α* {W ⊗ X} {Y} {Z} {W* ⊗* X*} {Y*} {Z*} ∙ᵈ α* {W} {X} {Y ⊗ Z} {W*} {X*} {Y* ⊗* Z*} in let p2 = $ (_⊗* Z*) (α* {W} {X} {Y} {W*} {X*} {Y*}) ∙ᵈ (α* {W} {X ⊗ Y} {Z} {W*} {X* ⊗* Y*} {Z*} ∙ᵈ $ (W* ⊗*_) (α* {X} {Y} {Z} {X*} {Y*} {Z*})) in p1 == p2 [ (λ p → (((W* ⊗* X*) ⊗* Y*) ⊗* Z*) == (W* ⊗* ((X* ⊗* (Y* ⊗* Z*)))) [ P ↓ p ]) ↓ ⬠ ]) (▽* : {X Y : FSMG A} {X* : P X} {Y* : P Y} → let p1 = (α* {X} {I} {Y} {X*} {I*} {Y*} ∙ᵈ $ (X* ⊗*_) (Λ* {Y} {Y*})) in let p2 = $ (_⊗* Y*) (ρ* {X} {X*}) in p1 == p2 [ (λ p → ((X* ⊗* I*) ⊗* Y*) == (X* ⊗* Y*) [ P ↓ p ]) ↓ ▽ ]) (⬡* : {X Y Z : FSMG A} {X* : P X} {Y* : P Y} {Z* : P Z} → let p1 = α* {X} {Y} {Z} {X*} {Y*} {Z*} ∙ᵈ (β* {X} {Y ⊗ Z} {X*} {Y* ⊗* Z*} ∙ᵈ α* {Y} {Z} {X} {Y*} {Z*} {X*}) in let p2 = $ (_⊗* Z*) (β* {X} {Y} {X*} {Y*}) ∙ᵈ (α* {Y} {X} {Z} {Y*} {X*} {Z*} ∙ᵈ $ (Y* ⊗*_) (β* {X} {Z} {X*} {Z*})) in p1 == p2 [ (λ p → ((X* ⊗* Y*) ⊗* Z*) == (Y* ⊗* (Z* ⊗* X*)) [ P ↓ p ]) ↓ ⬡ ]) (β²* : {X Y : FSMG A} {X* : P X} {Y* : P Y} → (β* {X} {Y} {X*} {Y*} ∙ᵈ β* {Y} {X} {Y*} {X*}) == idp [ (λ p → (X* ⊗* Y*) == (X* ⊗* Y*) [ P ↓ p ]) ↓ β² ]) (trunc* : {xs : FSMG A} → has-level 1 (P xs)) where postulate f : (X : FSMG A) → P X f-η-β : {a : A} → f (η a) ↦ η* a {-# REWRITE f-η-β #-} f-I-β : f I ↦ I* {-# REWRITE f-I-β #-} f-⊗-β : {X Y : FSMG A} → f (X ⊗ Y) ↦ (f X ⊗* f Y) {-# REWRITE f-⊗-β #-} postulate f-α-β : {X Y Z : FSMG A} → apd f (α {X} {Y} {Z}) == α* {X} {Y} {Z} {f X} {f Y} {f Z} f-Λ-β : {X : FSMG A} → apd f (Λ {X}) == Λ* {X} {f X} f-ρ-β : {X : FSMG A} → apd f (ρ {X}) == ρ* {X} {f X} f-β-β : {X Y : FSMG A} → apd f (β {X} {Y}) == β* {X} {Y} {f X} {f Y} module FSMGElimSet {j} {P : FSMG A → Type j} {{trunc* : {X : FSMG A} → has-level 0 (P X)}} (η* : (a : A) → P (η a)) (I* : P I) (_⊗*_ : {X Y : FSMG A} → (X* : P X) → (Y* : P Y) → P (X ⊗ Y)) (α* : {X Y Z : FSMG A} → {X* : P X} {Y* : P Y} {Z* : P Z} → ((X* ⊗* Y*) ⊗* Z*) == (X* ⊗* (Y* ⊗* Z*)) [ P ↓ α ]) (Λ* : {X : FSMG A} {X* : P X} → (I* ⊗* X*) == X* [ P ↓ Λ ]) (ρ* : {X : FSMG A} {X* : P X} → (X* ⊗* I*) == X* [ P ↓ ρ ]) (β* : {X Y : FSMG A} {X* : P X} {Y* : P Y} → (X* ⊗* Y*) == (Y* ⊗* X*) [ P ↓ β ]) where private module E = FSMGElim {P = P} η* I* _⊗*_ α* Λ* ρ* β* set-↓-has-all-paths-↓ set-↓-has-all-paths-↓ set-↓-has-all-paths-↓ set-↓-has-all-paths-↓ (raise-level 0 trunc*) f : (X : FSMG A) → P X f = E.f module FSMGRec {j} {P : Type j} (η* : (a : A) → P) (I* : P) (_⊗*_ : (X* : P) → (Y* : P) → P) (α* : {X* : P} {Y* : P} {Z* : P} → ((X* ⊗* Y*) ⊗* Z*) == (X* ⊗* (Y* ⊗* Z*))) (Λ* : {X* : P} → (I* ⊗* X*) == X*) (ρ* : {X* : P} → (X* ⊗* I*) == X*) (β* : {X* : P} {Y* : P} → (X* ⊗* Y*) == (Y* ⊗* X*)) (⬠* : {W* : P} {X* : P} {Y* : P} {Z* : P} → α* {W* ⊗* X*} {Y*} {Z*} ∙ α* {W*} {X*} {Y* ⊗* Z*} == ap (_⊗* Z*) (α* {W*} {X*} {Y*}) ∙ (α* {W*} {X* ⊗* Y*} {Z*} ∙ ap (W* ⊗*_) (α* {X*} {Y*} {Z*}))) (▽* : {X* : P} {Y* : P} → (α* {X*} {I*} {Y*} ∙ ap (X* ⊗*_) (Λ* {Y*})) == ap (_⊗* Y*) (ρ* {X*})) (⬡* : {X* : P} {Y* : P} {Z* : P} → α* {X*} {Y*} {Z*} ∙ (β* {X*} {Y* ⊗* Z*} ∙ α* {Y*} {Z*} {X*}) == ap (_⊗* Z*) (β* {X*} {Y*}) ∙ (α* {Y*} {X*} {Z*} ∙ ap (Y* ⊗*_) (β* {X*} {Z*}))) (β²* : {X* : P} {Y* : P} → (β* {X*} {Y*} ∙ β* {Y*} {X*}) == idp) (trunc* : has-level 1 P) where private module E = FSMGElim {P = λ _ → P} η* I* _⊗*_ (↓-cst-in α*) (↓-cst-in Λ*) (↓-cst-in ρ*) (↓-cst-in β*) TODO TODO TODO TODO trunc* f : FSMG A → P f = E.f f-α-β : {X Y Z : FSMG A} → ap f (α {X} {Y} {Z}) == α* {f X} {f Y} {f Z} f-α-β = apd=cst-in E.f-α-β f-Λ-β : {X : FSMG A} → ap f (Λ {X}) == Λ* {f X} f-Λ-β = apd=cst-in E.f-Λ-β f-ρ-β : {X : FSMG A} → ap f (ρ {X}) == ρ* {f X} f-ρ-β = apd=cst-in E.f-ρ-β f-β-β : {X Y : FSMG A} → ap f (β {X} {Y}) == β* {f X} {f Y} f-β-β = apd=cst-in E.f-β-β