Skip to content

Instantly share code, notes, and snippets.

@aradarbel10
Created July 13, 2022 09:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aradarbel10/d26ce198863b537d902e55f8ec9f3b37 to your computer and use it in GitHub Desktop.
Save aradarbel10/d26ce198863b537d902e55f8ec9f3b37 to your computer and use it in GitHub Desktop.
Direct proof for groupoidal structure of homotopic identity types via path induction in Agda
{-# OPTIONS --without-K #-}
import Relation.Binary.PropositionalEquality as Eq
open Eq using (_≡_; refl)
pattern erefl x = refl {x = x}
--- path induction ---
J : ∀ {A : Set} →
∀ (C : ∀ (x y : A) → x ≡ y → Set) →
(∀ (x : A) → C x x refl) →
(∀ (x y : A) → ∀ (p : x ≡ y) → C x y p)
J {A} C c x x refl = c x
--- identity types form a groupoid ---
_∙_ : ∀ {A : Set} {x y z : A} →
x ≡ y → y ≡ z → x ≡ z
_∙_ {_} {x} {y} {z} p = J (λ a b p → (b ≡ z → a ≡ z)) (λ a p → p) x y p
_⁻¹ : ∀ {A : Set} {x y : A} →
x ≡ y → y ≡ x
_⁻¹ {_} {x} {y} p = J (λ a b _ → b ≡ a) (λ x → erefl x) x y p
infixr 80 _∙_
infixr 100 _⁻¹
refl∙refl : ∀ {A : Set} {x : A} →
(erefl x ∙ erefl x) ≡ erefl x
refl∙refl {_} {x} = erefl (erefl x)
∙-refl : ∀ {A : Set} {x y : A} {p : x ≡ y} →
p ∙ erefl y ≡ p
∙-refl {_} {x} {y} {p} = J (λ a b q → q ∙ erefl b ≡ q) (λ a → refl∙refl) x y p
refl-∙ : ∀ {A : Set} {x y : A} {p : x ≡ y} →
erefl x ∙ p ≡ p
refl-∙ {_} {x} {y} {p} = J (λ a b q → erefl a ∙ q ≡ q) (λ a → refl∙refl) x y p
∙-⁻¹ : ∀ {A : Set} {x y : A} {p : x ≡ y} →
p ∙ (p ⁻¹) ≡ erefl x
∙-⁻¹ {_} {x} {y} {p} = J (λ a b q → q ∙ (q ⁻¹) ≡ erefl a) (λ a → refl∙refl) x y p
⁻¹-∙ : ∀ {A : Set} {x y : A} {p : x ≡ y} →
(p ⁻¹) ∙ p ≡ erefl y
⁻¹-∙ {_} {x} {y} {p} = J (λ a b q → (q ⁻¹) ∙ q ≡ erefl b) (λ a → refl∙refl) x y p
⁻¹⁻¹ : ∀ {A : Set} {x y : A} {p : x ≡ y} →
(p ⁻¹) ⁻¹ ≡ p
⁻¹⁻¹ {_} {x} {y} {p} = J (λ a b q → (q ⁻¹) ⁻¹ ≡ q) (λ a → erefl (erefl a)) x y p
∙-assoc : ∀ {A : Set} {w x y z : A} (p : w ≡ x) (q : x ≡ y) (r : y ≡ z) →
(p ∙ q) ∙ r ≡ p ∙ (q ∙ r)
∙-assoc {A} {w} {x} {y} {z} p q r = (J
(λ w' x' p' → ∀ (y' z' : A) (q' : x' ≡ y') (r' : y' ≡ z') → ((p' ∙ q') ∙ r' ≡ p' ∙ (q' ∙ r')))
(λ w' y' z' q' r' → erefl (q' ∙ r')) w x p) y z q r
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment