module Setoid.Definition where
open import Prelude
record Setd : Set₁ where
constructor mkSetd
infix 8 ∣_∣
infix 4 _∋_~_
field
∣_∣ : Set
_∋_~_ : ∣_∣ → ∣_∣ → Set
rfl :
(x : ∣_∣)
→
_∋_~_ x x
sym :
{x y : ∣_∣}
(_ : _∋_~_ x y)
→
_∋_~_ y x
trs :
{x y z : ∣_∣}
(_ : _∋_~_ x y)
(_ : _∋_~_ y z)
→
_∋_~_ x z
rfl' :
{x x' : ∣_∣}
(_ : x ≡ x')
→
_∋_~_ x x'
rfl' refl = rfl _
trsprt :
{x x' y y' : ∣_∣}
(_ : _∋_~_ x x')
(_ : _∋_~_ y y')
(_ : _∋_~_ x y)
→
_∋_~_ x' y'
trsprt xx' yy' xy = trs (sym xx') (trs xy yy')
open Setd public
infix 5 Setd[_⟶_]
record Setd[_⟶_] (Γ Δ : Setd) : Set
where
constructor mkSetd[⟶]
infix 8 ∣_∣
field
∣_∣ : ∣ Γ ∣ → ∣ Δ ∣
cng :
(x x' : Setd.∣ Γ ∣)
(_ : Γ ∋ x ~ x')
→
Δ ∋ ∣_∣ x ~ ∣_∣ x'
open Setd[_⟶_] public
instance
SetdIdentity : ∀{A} → Identity Setd[ A ⟶ A ]
∣ id ⦃ SetdIdentity ⦄ ∣ x = x
cng (id ⦃ SetdIdentity ⦄) _ _ = id
instance
SetdComp : ∀{A B C} →
Composition Setd[ B ⟶ C ] Setd[ A ⟶ B ] Setd[ A ⟶ C ]
∣ _∘_ ⦃ SetdComp ⦄ g f ∣ x = ∣ g ∣ (∣ f ∣ x)
cng (_∘_ ⦃ SetdComp ⦄ g f) _ _ = cng g _ _ ∘ cng f _ _
infixr 5 _⊸_
_⊸_ : Setd → Setd → Setd
∣ Δ ⊸ Γ ∣ = Setd[ Δ ⟶ Γ ]
Δ ⊸ Γ ∋ γ₁ ~ γ₂ = ∀ x → Γ ∋ ∣ γ₁ ∣ x ~ ∣ γ₂ ∣ x
rfl (Δ ⊸ Γ) γ x = rfl Γ (∣ γ ∣ x)
sym (Δ ⊸ Γ) e x = sym Γ (e x)
trs (Δ ⊸ Γ) e e' x = trs Γ (e x) (e' x)
k :
{B A : Setd}
(b : ∣ B ∣)
→
Setd[ A ⟶ B ]
∣ k b ∣ _ = b
cng (k{B} b) _ _ e = rfl B b
infix 5 Setd[_]
record Setd[_] (Γ : Setd) : Set₁ where
constructor mkSetd[]
infix 8 ∥_∥
infix 4 _∋_⸴_≈_⸴_
field
∥_∥ : ∣ Γ ∣ → Set
_∋_⸴_≈_⸴_ :
(x : ∣ Γ ∣)
(_ : ∥_∥ x)
(x' : ∣ Γ ∣)
(_ : ∥_∥ x')
→
Set
hrfl :
(x : ∣ Γ ∣)
(a : ∥_∥ x)
→
_∋_⸴_≈_⸴_ x a x a
hsym :
{x x' : ∣ Γ ∣}
{a : ∥_∥ x}
{a' : ∥_∥ x'}
(_ : Γ ∋ x ~ x')
(_ : _∋_⸴_≈_⸴_ x a x' a')
→
_∋_⸴_≈_⸴_ x' a' x a
htrs :
{x x' x'' : ∣ Γ ∣}
{a : ∥_∥ x}
{a' : ∥_∥ x'}
{a'' : ∥_∥ x''}
(_ : Γ ∋ x ~ x')
(_ : Γ ∋ x' ~ x'')
(_ : _∋_⸴_≈_⸴_ x a x' a')
(_ : _∋_⸴_≈_⸴_ x' a' x'' a'')
→
_∋_⸴_≈_⸴_ x a x'' a''
coe :
{x y : ∣ Γ ∣}
(e : Γ ∋ x ~ y)
→
∥_∥ x → ∥_∥ y
coh :
{x y : ∣ Γ ∣}
(e : Γ ∋ x ~ y)
(a : ∥_∥ x)
→
_∋_⸴_≈_⸴_ x a y (coe e a)
coh⁻¹ :
{x y : ∣ Γ ∣}
(e : Γ ∋ x ~ y)
(a : ∥_∥ x)
→
_∋_⸴_≈_⸴_ y (coe e a) x a
coh⁻¹ e a = hsym e (coh e a)
open Setd[_] public
infixl 6 _*₀_
_*₀_ :
{Δ Γ : Setd}
(_ : Setd[ Γ ])
(_ : Setd[ Δ ⟶ Γ ])
→
Setd[ Δ ]
∥ A *₀ γ ∥ y = ∥ A ∥ (∣ γ ∣ y)
A *₀ γ ∋ y ⸴ a ≈ y' ⸴ a' = A ∋ ∣ γ ∣ y ⸴ a ≈ ∣ γ ∣ y' ⸴ a'
hrfl (A *₀ γ) x a = hrfl A (∣ γ ∣ x) a
hsym (A *₀ γ) x e = hsym A (cng γ _ _ x) e
htrs (A *₀ γ) x x' e e' = htrs A (cng γ _ _ x) (cng γ _ _ x') e e'
coe (A *₀ γ) e a = coe A (cng γ _ _ e) a
coh (A *₀ γ) e a = coh A (cng γ _ _ e) a
instance
*₀Apply :
{Δ Γ : Setd}
→
Apply Setd[ Γ ] Setd[ Δ ⟶ Γ ] Setd[ Δ ]
_*_ ⦃ *₀Apply ⦄ = _*₀_
infix 6 _′_
_′_ :
{Γ : Setd}
(A : Setd[ Γ ])
(x : ∣ Γ ∣)
→
Setd
∣ A ′ x ∣ = ∥ A ∥ x
A ′ x ∋ a ~ a' = A ∋ x ⸴ a ≈ x ⸴ a'
rfl (A ′ x) = hrfl A x
sym (_′_ {Γ} A x) = hsym A (rfl Γ x)
trs (_′_ {Γ} A x) = htrs A (rfl Γ x) (rfl Γ x)
K :
{Γ : Setd}
(Δ : Setd)
→
Setd[ Γ ]
∥ K Δ ∥ _ = ∣ Δ ∣
K Δ ∋ _ ⸴ y ≈ _ ⸴ y' = Δ ∋ y ~ y'
hrfl (K Δ) _ a = rfl Δ a
hsym (K Δ) _ e = sym Δ e
htrs (K Δ) _ _ e e' = trs Δ e e'
coe (K Δ) _ y = y
coh (K Δ) _ y = rfl Δ y
infix 5 Setd[_⊩_]
record Setd[_⊩_] (Γ : Setd)(A : Setd[ Γ ]) : Set where
constructor mkSetd[⊩]
infix 8 ∥_∥
field
∥_∥ : (x : ∣ Γ ∣) → ∥ A ∥ x
hcng :
(x y : ∣ Γ ∣)
(_ : Γ ∋ x ~ y)
→
A ∋ x ⸴ ∥_∥ x ≈ y ⸴ ∥_∥ y
open Setd[_⊩_] public
infixl 6 [_⸴_]*_
[_⸴_]*_ :
{Δ Γ : Setd}
(A : Setd[ Γ ])
(_ : Setd[ Γ ⊩ A ])
(γ : Setd[ Δ ⟶ Γ ])
→
Setd[ Δ ⊩ A * γ ]
∥ [ _ ⸴ a ]* γ ∥ y = ∥ a ∥ (∣ γ ∣ y)
hcng ([ _ ⸴ a ]* γ) _ _ e = hcng a _ _ (cng γ _ _ e)
infixl 5 _⋉_
_⋉_ :
(A : Setd)
(_ : Setd[ A ])
→
Setd
∣ A ⋉ B ∣ = ∑ ∣ A ∣ ∥ B ∥
A ⋉ B ∋ (x , y) ~ (x' , y') =
(A ∋ x ~ x') × (B ∋ x ⸴ y ≈ x' ⸴ y')
rfl (A ⋉ B) (x , y) = (rfl A x , hrfl B x y)
sym (A ⋉ B) (e , e') = (sym A e , hsym B e e')
trs (A ⋉ B) (e₁ , e₁') (e₂ , e₂') =
(trs A e₁ e₂ , htrs B e₁ e₂ e₁' e₂')
▵ : Set → Setd
∣ ▵ S ∣ = S
▵ S ∋ x ~ x' = x ≡ x'
rfl (▵ S) _ = refl
sym (▵ S) refl = refl
trs (▵ S) refl refl = refl
∐ : (I : Set) → (I → Setd) → Setd
∣ ∐ I A ∣ = ∑[ i ∈ I ] ∣ A i ∣
∐ I A ∋ (i , x) ~ (i' , x') =
∑[ e ∈ (i ≡ i') ] A i' ∋ subst (∣_∣ ∘ A) e x ~ x'
rfl (∐ I A) (i , x) = (refl , rfl (A i) x)
sym (∐ I A) {i , _} (refl , e) = (refl , sym (A i) e)
trs (∐ I A) {i , _} (refl , e) (refl , e') = (refl , trs (A i) e e')
infix 2 ∐-syntax
∐-syntax : (I : Set) → (I → Setd) → Setd
∐-syntax = ∐
syntax ∐-syntax I (λ i → A) = ∐[ i ∈ I ] A
{-# DISPLAY ∐-syntax = ∐ #-}
1 : Setd
∣ 1 ∣ = 𝟙
1 ∋ _ ~ _ = 𝟙
rfl 1 _ = tt
sym 1 _ = tt
trs 1 _ _ = tt
infixl 5 _⊗_
_⊗_ : Setd → Setd → Setd
∣ A ⊗ B ∣ = ∣ A ∣ × ∣ B ∣
A ⊗ B ∋ (x , y) ~ (x' , y') = (A ∋ x ~ x') × (B ∋ y ~ y')
rfl (A ⊗ B) (x , y) = (rfl A x , rfl B y)
sym (A ⊗ B) (e , e') = (sym A e , sym B e')
trs (A ⊗ B) (e , e') (f , f') = (trs A e f , trs B e' f')
Σ :
{A : Setd}
(B : Setd[ A ])
(C : Setd[ A ⋉ B ])
→
Setd[ A ]
∥ Σ B C ∥ x = ∑[ y ∈ ∥ B ∥ x ] ∥ C ∥ (x , y)
Σ B C ∋ x ⸴ (y , z) ≈ x' ⸴ (y' , z') =
(B ∋ x ⸴ y ≈ x' ⸴ y') × (C ∋ (x , y) ⸴ z ≈ (x' , y') ⸴ z')
hrfl (Σ B C) x (y , z) = (hrfl B x y , hrfl C (x , y) z)
hsym (Σ B C) e (f , g) = (hsym B e f , hsym C (e , f) g)
htrs (Σ {A} B C) e e' (f , g) (f' , g') =
(htrs B e e' f f' , htrs C (e , f) (e' , f') g g')
coe (Σ B C) e (x , y) = (coe B e x , coe C (e , coh B e x) y)
coh (Σ B C) e (x , y) = (coh B e x , coh C (e , coh B e x) y)
∏ : (I : Set) → (I → Setd) → Setd
∣ ∏ I A ∣ = (i : I) → ∣ A i ∣
∏ I A ∋ f ~ f' = ∀ i → A i ∋ f i ~ f' i
rfl (∏ I A) f i = rfl (A i) (f i)
sym (∏ I A) e i = sym (A i) (e i)
trs (∏ I A) e e' i = trs (A i) (e i) (e' i)
infix 2 ∏-syntax
∏-syntax : (I : Set) → (I → Setd) → Setd
∏-syntax = ∏
syntax ∏-syntax I (λ i → A) = ∏[ i ∈ I ] A
{-# DISPLAY ∏-syntax = ∏ #-}
Π :
{A : Setd}
(B : Setd[ A ])
(C : Setd[ A ⋉ B ])
→
Setd[ A ]
∥ Π B C ∥ x =
∑[ f ∈ ((y : ∥ B ∥ x) → ∥ C ∥ (x , y)) ]
((y y' : ∥ B ∥ x)
(_ : B ∋ x ⸴ y ≈ x ⸴ y')
→
C ∋ (x , y) ⸴ f y ≈ (x , y') ⸴ f y')
Π B C ∋ x ⸴ (f , _) ≈ x' ⸴ (f' , _) =
(y : ∥ B ∥ x)
(y' : ∥ B ∥ x')
(_ : B ∋ x ⸴ y ≈ x' ⸴ y')
→
C ∋ (x , y) ⸴ f y ≈ (x' , y') ⸴ f' y'
hrfl (Π B C) _ (_ , e) y y' e' = e y y' e'
hsym (Π{A} B C) xx' fg y y' yy' = hsym C
(xx' , hsym B (sym A xx') yy')
(fg y' y (hsym B (sym A xx') yy'))
htrs (Π{A} B C) xx' x'x'' fg gh y y'' yy'' =
let
y' = coe B xx' y
yy' = coh B xx' y
y'y'' = htrs B
(sym A xx')
(trs A xx' x'x'')
(coh⁻¹ B xx' y)
yy''
in htrs C
(xx' , yy')
(x'x'' , y'y'')
(fg y y' yy')
(gh y' y'' y'y'')
coe (Π{A} B C) xx' (f , e) =
let x'x = sym A xx' in
((λ y →
coe C (xx' , coh⁻¹ B x'x y) (f (coe B x'x y)))
,
λ y y' yy' →
let
e₁ = coh⁻¹ B x'x y
e₂ = coh⁻¹ B x'x y'
e₃ = htrs B xx' x'x e₁ (htrs B (rfl A _) x'x
yy' (hsym B xx' e₂))
in htrs C
(x'x , hsym B xx' e₁)
(xx' , htrs B (rfl A _) xx' e₃ e₂)
(coh⁻¹ C (xx' , e₁) (f (coe B x'x y)))
(htrs C
(rfl A _ , e₃)
(xx' , e₂)
(e (coe B x'x y) (coe B x'x y') e₃)
(coh C (xx' , e₂) (f (coe B x'x y')))))
coh (Π {A} B C) xx' (f , e) y y' yy' =
let
x'x = sym A xx'
e₀ = coh B x'x y'
e₁ = htrs B xx' x'x yy' e₀
e₂ = (xx' , hsym B x'x e₀)
in htrs C
(rfl A _ , e₁)
e₂
(e y (coe B x'x y') e₁)
(coh C e₂ (f (coe B x'x y')))