Created
February 23, 2026 19:29
-
-
Save RafaelBocquet/c2ab925a044077c01f9cd032b660a621 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| {-# OPTIONS --without-K --postfix-projections #-} | |
| open import Agda.Primitive public | |
| infixr 50 _,_ | |
| infixr 30 _×_ | |
| -- Unit type | |
| record ⊤ {j} : Set j where | |
| constructor tt | |
| open ⊤ public | |
| -- Σ-types | |
| record Σ {i j} (A : Set i) (B : A → Set j) : Set (i ⊔ j) where | |
| constructor _,_ | |
| field fst : A | |
| snd : B fst | |
| open Σ public | |
| _×_ : ∀ {i j} (A : Set i) (B : Set j) → Set (i ⊔ j) | |
| A × B = Σ A λ _ → B | |
| record Lift {i} j (A : Set i) : Set (i ⊔ j) where | |
| constructor lift | |
| field | |
| lower : A | |
| open Lift public | |
| -- _=_ types | |
| data _=_ {i} {A : Set i} (x : A) : A → Set i where refl : _=_ x x | |
| -------------------------------------------------------------------------------- | |
| ap : ∀ {i j} {A : Set i} {B : Set j} (f : A → B) {x y : A} (p : _=_ x y) → _=_ (f x) (f y) | |
| ap f refl = refl | |
| ap-id : ∀ {i} {A : Set i} {x y : A} {p : _=_ x y} → _=_ (ap (λ x → x) p) p | |
| ap-id {p = refl} = refl | |
| ap-∘ : ∀ {i j k} {A : Set i} {B : Set j} {C : Set k} {x y : A} {p : _=_ x y} {f : B → C} {g : A → B} | |
| → _=_ (ap f (ap g p)) (ap (λ x → f (g x)) p) | |
| ap-∘ {p = refl} = refl | |
| ap₂ : ∀ {i j k} {A : Set i} {B : Set j} {C : Set k} (f : A → B → C) {x y : A} {z w : B} (p : _=_ x y) (q : _=_ z w) → _=_ (f x z) (f y w) | |
| ap₂ f refl refl = refl | |
| J : ∀ {i j} {A : Set i} {x : A} (B : ∀ y → _=_ x y → Set j) {y} (p : _=_ x y) → B x refl → B y p | |
| J B refl bx = bx | |
| J' : ∀ {i j} {A : Set i} {x : A} (B : ∀ y → _=_ y x → Set j) {y} (p : _=_ y x) → B x refl → B y p | |
| J' B refl bx = bx | |
| transp : ∀ {i j} {A : Set i} (B : A → Set j) {x y : A} (p : _=_ x y) → B x → B y | |
| transp B refl bx = bx | |
| _∙_ : ∀ {i} {A : Set i} {x y z : A} → _=_ x y → _=_ y z → _=_ x z | |
| refl ∙ refl = refl | |
| ∙-idl : ∀ {i} {A : Set i} {x y : A} {p : _=_ x y} → _=_ (refl ∙ p) p | |
| ∙-idl {p = refl} = refl | |
| ∙-idr : ∀ {i} {A : Set i} {x y : A} {p : _=_ x y} → _=_ (p ∙ refl) p | |
| ∙-idr {p = refl} = refl | |
| sym : ∀ {i} {A : Set i} {x y : A} → _=_ x y → _=_ y x | |
| sym refl = refl | |
| cancelr : ∀ {i} {A : Set i} {x y z : A} {p q : _=_ x y} {r : _=_ y z} → _=_ (p ∙ r) (q ∙ r) → _=_ p q | |
| cancelr {r = refl} h = sym ∙-idr ∙ (h ∙ ∙-idr) | |
| ∙-transpose-left : ∀ {i} {A : Set i} {x y z : A} {q : _=_ x z} {p : _=_ x y} {r : _=_ y z} → _=_ q (p ∙ r) → _=_ (sym p ∙ q) r | |
| ∙-transpose-left {p = refl} {r = refl} refl = refl | |
| trans-sym-l : ∀ {i} {A : Set i} {x y : A} {p : _=_ x y} → _=_ (sym p ∙ p) refl | |
| trans-sym-l {p = refl} = refl | |
| transp-const : ∀ {i j} {A : Set i} {B : Set j} {x y} {p : _=_ {A = A} x y} {d} → _=_ (transp (λ _ → B) p d) d | |
| transp-const {p = refl} = refl | |
| -------------------------------------------------------------------------------- | |
| record is-contr {i} (A : Set i) : Set i where | |
| field | |
| is-contr-center : A | |
| is-contr-path : ∀ y → _=_ is-contr-center y | |
| abstract | |
| is-contr-all-paths : ∀ x y → _=_ {A = A} x y | |
| is-contr-all-paths x y = sym (is-contr-path x) ∙ is-contr-path y | |
| is-contr-all-paths-β : ∀ {x} → _=_ (is-contr-all-paths x x) refl | |
| is-contr-all-paths-β = trans-sym-l | |
| open is-contr public | |
| is-contr-⊤ : ∀ {i} → is-contr (⊤ {i}) | |
| is-contr-⊤ .is-contr-center = tt | |
| is-contr-⊤ .is-contr-path = λ y → refl | |
| is-contr-path-to : ∀ {i} {A : Set i} {x : A} → is-contr (Σ A λ y → _=_ y x) | |
| is-contr-path-to .is-contr-center = _ , refl | |
| is-contr-path-to .is-contr-path (_ , refl) = refl | |
| is-contr-path-from : ∀ {i} {A : Set i} {x : A} → is-contr (Σ A λ y → _=_ x y) | |
| is-contr-path-from .is-contr-center = _ , refl | |
| is-contr-path-from .is-contr-path (_ , refl) = refl | |
| is-equiv : ∀ {i j} {A : Set i} {B : Set j} (f : A → B) → Set (i ⊔ j) | |
| is-equiv f = ∀ b → is-contr (Σ _ λ a → _=_ (f a) b) | |
| equiv : ∀ {i j} (A : Set i) (B : Set j) → Set (i ⊔ j) | |
| equiv A B = Σ (A → B) is-equiv | |
| abstract | |
| transp-contr : ∀ {i j} {A : Set i} → is-contr A → (B : A → Set j) → ∀ x y → B x → B y | |
| transp-contr cA B x y bx = transp B (is-contr-all-paths cA x y) bx | |
| transp-contr-β : ∀ {i j} {A : Set i} {cA : is-contr A} {B : A → Set j} {x : A} {bx} → _=_ (transp-contr cA B x x bx) bx | |
| transp-contr-β {i} {j} {A} {cA} {B} {x} {bx} = ap (λ p → transp B p bx) (is-contr-all-paths-β cA) | |
| pair-= : ∀ {i j} {A : Set i} {B : A → Set j} {a₁ a₂} (p : _=_ {A = A} a₁ a₂) | |
| {b₁ : B a₁} {b₂ : B a₂} (q : _=_ (transp B p b₁) b₂) | |
| → _=_ {A = Σ A B} (a₁ , b₁) (a₂ , b₂) | |
| pair-= refl refl = refl | |
| pair×-= : ∀ {i j} {A : Set i} {B : Set j} {a₁ a₂} (p : _=_ {A = A} a₁ a₂) | |
| {b₁ : B} {b₂ : B} (q : _=_ b₁ b₂) | |
| → _=_ {A = A × B} (a₁ , b₁) (a₂ , b₂) | |
| pair×-= refl refl = refl | |
| -------------------------------------------------------------------------------- | |
| happly : ∀ {i j} {A : Set i} {B : A → Set j} {f g : (a : A) → B a} | |
| → _=_ f g → (a : A) → _=_ (f a) (g a) | |
| happly refl a = refl | |
| postulate | |
| funext : ∀ {i j} {A : Set i} {B : A → Set j} {f : (a : A) → B a} | |
| → is-contr (Σ ((a : A) → B a) λ g → (∀ a → _=_ (f a) (g a))) | |
| -------------------------------------------------------------------------------- | |
| abstract | |
| lam-= : ∀ {i j} {A : Set i} {B : A → Set j} {f g : (a : A) → B a} | |
| (h : (a : A) → _=_ (f a) (g a)) → _=_ f g | |
| lam-= {f = f} h = transp-contr funext (λ { (g , _) → _=_ f g }) (_ , λ _ → refl) (_ , h) refl | |
| lam-=-β : ∀ {i j} {A : Set i} {B : A → Set j} {f : (a : A) → B a} | |
| → _=_ (lam-= {g = f} (λ x → refl)) refl | |
| lam-=-β = transp-contr-β | |
| module _ {i j k l} {A : Set i} {B : A → Set j} {C : Set k} {r : C → A} {D : ∀ c → B (r c) → Set l} | |
| {f g : (a : A) → B a} {h : (a : A) → _=_ (f a) (g a)} | |
| {d : ∀ c → D c (f (r c))} | |
| where | |
| abstract | |
| transp-funext : _=_ (transp {A = ∀ a → B a} (λ f → (c : C) → D c (f (r c))) (lam-= h) d) | |
| (λ c → transp (D c) (h (r c)) (d c)) | |
| transp-funext | |
| = transp-contr (funext {f = f}) (λ { (g , h) → ∀ d | |
| → _=_ (transp {A = ∀ a → B a} (λ f → (c : C) → D c (f (r c))) (lam-= h) d) | |
| (λ c → transp (D c) (h (r c)) (d c)) }) | |
| (f , λ _ → refl) | |
| (g , h) | |
| (λ d → ap (λ p → transp {A = ∀ a → B a} (λ f → (c : C) → D c (f (r c))) p d) lam-=-β ∙ refl) | |
| d | |
| -------------------------------------------------------------------------------- | |
| module _ {i} {j} {A : Set i} {B : Set j} (r : A → B) (s : B → A) (p : ∀ a → _=_ (r (s a)) a) where | |
| abstract | |
| is-contr-retract : is-contr A → is-contr B | |
| is-contr-retract cA .is-contr-center = r (cA .is-contr-center) | |
| is-contr-retract cA .is-contr-path b = ap r (cA .is-contr-path _) ∙ p _ | |
| module _ {i} {j} {A : Set i} {B : Set j} (r : A → B) (r-equiv : is-equiv r) where | |
| abstract | |
| is-contr-equiv : is-contr A → is-contr B | |
| is-contr-equiv = is-contr-retract r (λ b → r-equiv b .is-contr-center .fst) (λ b → r-equiv b .is-contr-center .snd) | |
| module _ {i j} {A : Set i} {B : Set j} | |
| (g : B → A) (f : A → B) | |
| (gf : ∀ a → _=_ (g (f a)) a) | |
| (fg : ∀ b → _=_ (f (g b)) b) | |
| where | |
| private | |
| nat : ∀ {i j} {A : Set i} {B : Set j} {f g : A → B} (h : ∀ a → _=_ (f a) (g a)) {x y} (p : _=_ x y) | |
| → _=_ (ap f p ∙ h y) (h x ∙ ap g p) | |
| nat h refl = ∙-idl ∙ sym ∙-idr | |
| lemma : ∀ {i} {A : Set i} (f : A → A) (h : ∀ a → _=_ (f a) a) a | |
| → _=_ (h (f a)) (ap f (h a)) | |
| lemma f h a = sym (cancelr (nat h (h a) ∙ ap₂ _∙_ refl ap-id)) | |
| gf' : ∀ a → _=_ (g (f a)) a | |
| gf' a = sym (gf (g (f a))) ∙ (ap g (fg (f a)) ∙ gf a) | |
| coherence : ∀ b → _=_ (gf' (g b)) (ap g (fg b)) | |
| coherence b | |
| = ∙-transpose-left | |
| ( ap₂ _∙_ (ap (ap g) (lemma _ fg _) ∙ ap-∘) refl ∙ | |
| nat (λ b → gf (g b)) (fg _)) | |
| compute-transp : ∀ {b} {x y} (p : _=_ x y) q → _=_ (transp (λ a → _=_ (g a) b) p q) (sym (ap g p) ∙ q) | |
| compute-transp refl refl = refl | |
| abstract | |
| iso→equiv : is-equiv g | |
| iso→equiv a .is-contr-center | |
| = f a , gf' a | |
| iso→equiv _ .is-contr-path (y , refl) | |
| = pair-= | |
| (fg y) | |
| ( compute-transp (fg y) (gf' (g y)) ∙ | |
| (ap₂ _∙_ refl (coherence _) ∙ ∙-transpose-left (sym ∙-idr))) | |
| -------------------------------------------------------------------------------- | |
| abstract | |
| is-contr-= : ∀ {i} {A : Set i} → is-contr A → ∀ x y → is-contr (_=_ {A = A} x y) | |
| is-contr-= cA x y .is-contr-center | |
| = sym (is-contr-all-paths cA x x) ∙ is-contr-all-paths cA x y | |
| is-contr-= cA x .x .is-contr-path refl | |
| = ∙-transpose-left (sym ∙-idr) | |
| module _ {i j} {A : Set i} {B : A → Set j} (cA : is-contr A) (cB : ∀ a → is-contr (B a)) where | |
| abstract | |
| is-contr-Σ : is-contr (Σ A B) | |
| is-contr-Σ .is-contr-center = cA .is-contr-center , cB _ .is-contr-center | |
| is-contr-Σ .is-contr-path (a , b) = pair-= (cA .is-contr-path _) (is-contr-all-paths (cB _) _ _) | |
| module _ {i j} {A : Set i} {B : A → Set j} (cA : is-contr A) (cAB : is-contr (Σ A B)) where | |
| abstract | |
| is-contr-π₂ : ∀ a → is-contr (B a) | |
| is-contr-π₂ a | |
| = is-contr-retract {A = Σ A B} | |
| (λ { (a' , b) → transp-contr cA B a' a b }) | |
| (λ b → (a , b)) | |
| (λ b → transp-contr-β) | |
| cAB | |
| module _ {ia ib ic id} {A : Set ia} {B : A → Set ib} {C : A → Set ic} {D : ∀ a → B a → C a → Set id} where | |
| abstract | |
| is-contr-ΣΣ : is-contr (Σ A B) → (∀ a b → is-contr (Σ (C a) (D a b))) → is-contr (Σ (Σ A C) λ { (a , c) → Σ (B a) λ b → D a b c }) | |
| is-contr-ΣΣ cAB cCD = is-contr-retract {A = Σ (Σ A B) λ { (a , b) → Σ (C a) (D a b) }} | |
| (λ { ((a , b) , (c , d)) → ((a , c) , (b , d)) }) | |
| (λ { ((a , c) , (b , d)) → ((a , b) , (c , d)) }) | |
| (λ _ → refl) | |
| (is-contr-Σ cAB λ { (a , b) → cCD a b }) | |
| module _ {i j} {A : Set i} {B : A → Set j} (cB : ∀ a → is-contr (B a)) where | |
| abstract | |
| is-contr-Π : is-contr (∀ a → B a) | |
| is-contr-Π .is-contr-center a = cB a .is-contr-center | |
| is-contr-Π .is-contr-path f = lam-= λ a → cB a .is-contr-path (f a) | |
| module _ {i j k l} {A : Set i} {B : A → Set j} {C : Set k} (r : C → A) (p : is-equiv r) {D : ∀ c → B (r c) → Set l} | |
| (cBD : ∀ c → is-contr (Σ (B (r c)) (D c))) | |
| where | |
| abstract | |
| private | |
| helper : is-contr (Σ (∀ c → B (r c)) λ b → (∀ c → D c (b _))) | |
| helper | |
| = is-contr-retract | |
| (λ f → (λ c → f c .fst) , (λ c → f c .snd)) | |
| (λ { (g , h) c → g c , h c }) | |
| (λ a → refl) | |
| (is-contr-Π cBD) | |
| inv : A → C | |
| inv a = p a .is-contr-center .fst | |
| β : ∀ a → _=_ (r (inv a)) a | |
| β a = p a .is-contr-center .snd | |
| is-contr-ΣΠ : is-contr (Σ (∀ a → B a) λ b → (∀ c → D c (b _))) | |
| is-contr-ΣΠ | |
| = is-contr-retract | |
| (λ { (f , g) → (λ a → transp B (β a) (f (inv a))) | |
| , (λ c → transp-contr | |
| {A = Σ C λ c' → _=_ (r c') (r c)} (p (r c)) | |
| (λ { (p , e) → D c (transp B e (f p)) }) | |
| (_ , refl) _ | |
| (g c)) }) | |
| (λ { (f , g) → (λ c → f (r c)) , (λ c → g c) }) | |
| (λ { (f , g) → pair-= | |
| (lam-= (λ a → J' (λ a' q → _=_ (transp B q (f a')) (f a)) (β a) refl)) | |
| ( transp-funext {B = B} {D = D} | |
| ∙ lam-= λ c → | |
| transp-contr (p (r c)) | |
| (λ { (xx , yy) → _=_ (transp (D c) (J' (λ a' q → _=_ (transp B q (f a')) (f (r c))) yy refl) | |
| (transp (λ { (p , e) → D c (transp B e (f (r p))) }) | |
| (is-contr-all-paths (p (r c)) (c , refl) (xx , yy)) (g c))) | |
| (g c) }) | |
| (c , refl) (inv (r c) , β (r c)) | |
| (ap {A = _=_ {A = Σ C λ c' → _=_ (r c') (r c)} (c , refl) (c , refl)} (λ q → transp (λ { (p , e) → D c (transp B e (f (r p))) }) q _) | |
| {x = is-contr-all-paths (p (r c)) (c , refl) (c , refl)} (is-contr-all-paths-β _)) | |
| )}) | |
| helper | |
| abstract | |
| fst-equiv : ∀ {i j} {A : Set i} {B : A → Set j} → (∀ a → is-contr (B a)) → is-equiv (fst {B = B}) | |
| fst-equiv {i} {j} {A} {B} cB a | |
| = is-contr-retract {A = B a} | |
| (λ b → (a , b) , refl) | |
| (λ { ((_ , b) , refl) → b }) | |
| (λ { ((_ , b) , refl) → refl }) | |
| (cB a) | |
| abstract | |
| id-equiv : ∀ {i} {A : Set i} → equiv A A | |
| id-equiv = (λ x → x) , iso→equiv _ _ (λ _ → refl) (λ _ → refl) | |
| module _ {i j k} {A : Set i} {B : Set j} {C : Set k} where | |
| abstract | |
| comp-equiv : equiv A B → equiv B C → equiv A C | |
| comp-equiv (f , f-equiv) (g , g-equiv) | |
| = (λ a → g (f a)) | |
| , (λ c → is-contr-retract | |
| (λ { ((b , refl) , (a , refl)) → _ , refl }) | |
| (λ { (a , refl) → (_ , refl) , (_ , refl) }) | |
| (λ { (a , refl) → refl }) | |
| (is-contr-Σ (g-equiv c) (λ { (b , _) → f-equiv b }))) | |
| abstract | |
| is-equiv-lift : ∀ {i j} {A : Set i} → is-equiv (lift {i} {j} {A}) | |
| is-equiv-lift = iso→equiv _ lower (λ _ → refl) (λ _ → refl) | |
| is-equiv-lower : ∀ {i j} {A : Set i} → is-equiv (lower {i} {j} {A}) | |
| is-equiv-lower = iso→equiv _ lift (λ _ → refl) (λ _ → refl) | |
| -------------------------------------------------------------------------------- | |
| is-prop : ∀ {i} → Set i → Set i | |
| is-prop A = A → is-contr A | |
| all-paths→is-prop : ∀ {i} {A : Set i} → ((x y : A) → _=_ x y) → is-prop A | |
| all-paths→is-prop p a .is-contr-center = a | |
| all-paths→is-prop p a .is-contr-path y = p _ _ | |
| abstract | |
| is-prop-all-paths : ∀ {i} {A : Set i} → is-prop A → (x y : A) → _=_ x y | |
| is-prop-all-paths pA x y = is-contr-all-paths (pA x) x y | |
| abstract | |
| is-prop-is-contr : ∀ {i} {A : Set i} → is-prop (is-contr A) | |
| is-prop-is-contr {i} {A} cA .is-contr-center = cA | |
| is-prop-is-contr {i} {A} cA .is-contr-path cA' | |
| = ap (λ { (x , y) → record { is-contr-center = x ; is-contr-path = y } }) inner | |
| where | |
| inner : _=_ {A = Σ A λ a → ∀ b → _=_ a b} (cA .is-contr-center , cA .is-contr-path) (cA' .is-contr-center , cA' .is-contr-path) | |
| inner = pair-= | |
| (is-contr-all-paths cA _ _) | |
| (lam-= λ a → is-contr-all-paths (is-contr-= cA _ _) _ _) | |
| abstract | |
| is-prop-⊤ : ∀ {i} → is-prop (⊤ {i}) | |
| is-prop-⊤ = λ _ → is-contr-⊤ | |
| abstract | |
| is-prop-Σ : ∀ {i j} {A : Set i} {B : A → Set j} → is-prop A → (∀ a → is-prop (B a)) → is-prop (Σ A B) | |
| is-prop-Σ {A = A} {B = B} pA pB (a , b) = is-contr-Σ (pA a) (λ a → pB a (transp B (is-prop-all-paths pA _ _) b)) | |
| abstract | |
| is-prop-Π : ∀ {i j} {A : Set i} {B : A → Set j} → (∀ a → is-prop (B a)) → is-prop (∀ a → B a) | |
| is-prop-Π {A = A} {B = B} pB f = is-contr-Π (λ a → pB a (f a)) | |
| -------------------------------------------------------------------------------- | |
| postulate | |
| uip : ∀ {ℓ} {A : Set ℓ} {x y : A} → is-prop (x = y) | |
| module _ (A : Set) (B : A → Set) where | |
| data W : Set where | |
| sup : (a : A) (f : B a → W) → W | |
| module _ (P : W → Set) | |
| (ps : ∀ {a} {f} | |
| (IH : ∀ ba → P (f ba)) | |
| (ext : ∀ b1 b2 (p : f b1 = f b2) → transp P p (IH b1) = IH b2) | |
| → P (sup a f)) | |
| where | |
| record ↯ {i} (A : Set i) ℓ : Set (lsuc ℓ ⊔ i) where | |
| field | |
| def : Set ℓ | |
| def-is-prop : is-prop def | |
| elt : def → A | |
| e : ∀ w → ↯ (P w) lzero | |
| e (sup a f) .↯.def | |
| = Σ (∀ x → e (f x) .↯.def) λ d → ∀ x y (p : f x = f y) → transp P p (e (f x) .↯.elt (d x)) = e (f y) .↯.elt (d y) | |
| e (sup a f) .↯.def-is-prop | |
| = is-prop-Σ (is-prop-Π (λ x → e (f x) .↯.def-is-prop)) | |
| λ _ → is-prop-Π λ _ → is-prop-Π λ _ → is-prop-Π λ _ → uip | |
| e (sup a f) .↯.elt (d , r) | |
| = ps (λ x → e (f x) .↯.elt (d x)) (λ b1 b2 p → r _ _ p) | |
| ap-e : ∀ (x y : W) (p : x = y) dx dy → transp P p (e x .↯.elt dx) = e y .↯.elt dy | |
| ap-e x _ refl _ _ = ap (e x .↯.elt) (is-prop-all-paths (e x .↯.def-is-prop) _ _) | |
| e-is-def : ∀ w → (e w) .↯.def | |
| e-is-def (sup a f) .fst = λ x → e-is-def (f x) | |
| e-is-def (sup a f) .snd = λ x y p → ap-e (f x) (f y) p _ _ | |
| W-ind : ∀ w → P w | |
| W-ind w = e w .↯.elt (e-is-def w) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment