160 lines
5.2 KiB
Agda
160 lines
5.2 KiB
Agda
|
{-# OPTIONS --cubical #-}
|
|||
|
module Category.Rel where
|
|||
|
|
|||
|
open import Data.Product
|
|||
|
open import Cubical.PathPrelude
|
|||
|
open import Cubical.GradLemma
|
|||
|
open import Agda.Primitive
|
|||
|
open import Category
|
|||
|
|
|||
|
-- Sets are built-in to Agda. The set of all small sets is called Set.
|
|||
|
|
|||
|
Fun : {ℓ : Level} → ( T U : Set ℓ ) → Set ℓ
|
|||
|
Fun T U = T → U
|
|||
|
|
|||
|
𝕊et-as-Cat : {ℓ : Level} → Category {lsuc ℓ} {ℓ}
|
|||
|
𝕊et-as-Cat {ℓ} = record
|
|||
|
{ Object = Set ℓ
|
|||
|
; Arrow = λ T U → Fun {ℓ} T U
|
|||
|
; 𝟙 = λ x → x
|
|||
|
; _⊕_ = λ g f x → g ( f x )
|
|||
|
; assoc = refl
|
|||
|
; ident = funExt (λ x → refl) , funExt (λ x → refl)
|
|||
|
}
|
|||
|
|
|||
|
-- Subsets are predicates over some type.
|
|||
|
Subset : {ℓ : Level} → ( A : Set ℓ ) → Set (ℓ ⊔ lsuc lzero)
|
|||
|
Subset A = A → Set
|
|||
|
-- Subset : {ℓ ℓ' : Level} → ( A : Set ℓ ) → Set (ℓ ⊔ lsuc ℓ')
|
|||
|
-- Subset {ℓ' = ℓ'} A = A → Set ℓ'
|
|||
|
-- {a ∈ A | P a}
|
|||
|
|
|||
|
-- subset-syntax : {ℓ ℓ' : Level} → (A : Set ℓ) → (P : A → Set ℓ') → ( a : A ) → Set ℓ'
|
|||
|
-- subset-syntax A P a = P a
|
|||
|
-- infix 2 subset-syntax
|
|||
|
|
|||
|
-- syntax subset P a = << a ∈ A >>>
|
|||
|
-- syntax subset P = ⦃ a ∈ A | P a ⦄
|
|||
|
-- syntax subset-syntax A (λ a → B) = ⟨ a foo A ∣ B ⟩
|
|||
|
|
|||
|
-- Membership is function applicatiom.
|
|||
|
_∈_ : {ℓ : Level} {A : Set ℓ} → A → Subset A → Set
|
|||
|
s ∈ S = S s
|
|||
|
|
|||
|
infixl 45 _∈_
|
|||
|
|
|||
|
-- The diagnoal of a set is a synonym for equality.
|
|||
|
Diag : ∀ S → Subset (S × S)
|
|||
|
Diag S (s₀ , s₁) = s₀ ≡ s₁
|
|||
|
-- Diag S = subset (S × S) (λ {(p , q) → p ≡ q})
|
|||
|
-- Diag S = ⟨ ? foo ? ∣ ? ⟩
|
|||
|
-- Diag S (s₀ , s₁) = ⦃ (s₀ , s₁) ∈ S | s₀ ≡ s₁ ⦄
|
|||
|
|
|||
|
module _ {A B : Set} {S : Subset (A × B)} (ab : A × B) where
|
|||
|
private
|
|||
|
a : A
|
|||
|
a = fst ab
|
|||
|
b : B
|
|||
|
b = snd ab
|
|||
|
|
|||
|
module _ where
|
|||
|
private
|
|||
|
forwards : ((a , b) ∈ S)
|
|||
|
→ (Σ[ a' ∈ A ] (a , a') ∈ Diag A × (a' , b) ∈ S)
|
|||
|
forwards ab∈S = a , (refl , ab∈S)
|
|||
|
|
|||
|
backwards : (Σ[ a' ∈ A ] (a , a') ∈ Diag A × (a' , b) ∈ S)
|
|||
|
→ (a , b) ∈ S
|
|||
|
backwards (a' , (a=a' , a'b∈S)) = subst (sym a=a') a'b∈S
|
|||
|
|
|||
|
isbijective : (x : (a , b) ∈ S) → (backwards ∘ forwards) x ≡ x
|
|||
|
-- isbijective x = pathJ (λ y x₁ → (backwards ∘ forwards) x ≡ x) {!!} {!!} {!!}
|
|||
|
isbijective x = pathJprop (λ y _ → y) x
|
|||
|
|
|||
|
postulate
|
|||
|
back-fwd : (x : Σ[ a' ∈ A ] (a , a') ∈ Diag A × (a' , b) ∈ S)
|
|||
|
→ (forwards ∘ backwards) x ≡ x
|
|||
|
-- back-fwd (a , (p , ab∈S))
|
|||
|
-- = =-ind (λ x y p → {!(forwards ∘ backwards) x ≡ x!}) {!!} {!!} {!!} p
|
|||
|
-- = pathJprop (λ y _ → snd (snd y)) ab∈S
|
|||
|
-- has type P x refl where P is the first argument
|
|||
|
{-
|
|||
|
|
|||
|
module _ {ℓ ℓ'} {A : Set ℓ} {x : A}
|
|||
|
(P : ∀ y → x ≡ y → Set ℓ') (d : P x ((λ i → x))) where
|
|||
|
pathJ : (y : A) → (p : x ≡ y) → P y p
|
|||
|
pathJ _ p = transp (λ i → uncurry P (contrSingl p i)) d
|
|||
|
|
|||
|
pathJprop : pathJ _ refl ≡ d
|
|||
|
pathJprop i = primComp (λ _ → P x refl) i (λ {j (i = i1) → d}) d
|
|||
|
-}
|
|||
|
isequiv : isEquiv
|
|||
|
(Σ[ a' ∈ A ] (a , a') ∈ Diag A × (a' , b) ∈ S)
|
|||
|
((a , b) ∈ S)
|
|||
|
backwards
|
|||
|
-- isequiv ab∈S = (forwards ab∈S , sym (isbijective ab∈S)) , λ y → fiberhelp y
|
|||
|
isequiv y = gradLemma backwards forwards isbijective back-fwd y
|
|||
|
|
|||
|
equi : (Σ[ a' ∈ A ] (a , a') ∈ Diag A × (a' , b) ∈ S)
|
|||
|
≃ (a , b) ∈ S
|
|||
|
equi = backwards , isequiv
|
|||
|
|
|||
|
ident-l : (Σ[ a' ∈ A ] (a , a') ∈ Diag A × (a' , b) ∈ S)
|
|||
|
≡ (a , b) ∈ S
|
|||
|
ident-l = equivToPath equi
|
|||
|
|
|||
|
module _ where
|
|||
|
private
|
|||
|
forwards : ((a , b) ∈ S)
|
|||
|
→ (Σ[ b' ∈ B ] (a , b') ∈ S × (b' , b) ∈ Diag B)
|
|||
|
forwards proof = b , (proof , refl)
|
|||
|
|
|||
|
backwards : (Σ[ b' ∈ B ] (a , b') ∈ S × (b' , b) ∈ Diag B)
|
|||
|
→ (a , b) ∈ S
|
|||
|
backwards (b' , (ab'∈S , b'=b)) = subst b'=b ab'∈S
|
|||
|
|
|||
|
isbijective : (x : (a , b) ∈ S) → (backwards ∘ forwards) x ≡ x
|
|||
|
isbijective x = pathJprop (λ y _ → y) x
|
|||
|
|
|||
|
fwd-bwd : (x : Σ[ b' ∈ B ] (a , b') ∈ S × (b' , b) ∈ Diag B)
|
|||
|
→ (forwards ∘ backwards) x ≡ x
|
|||
|
fwd-bwd (b , (ab∈S , refl)) = pathJprop (λ y _ → fst (snd y)) ab∈S
|
|||
|
|
|||
|
isequiv : isEquiv
|
|||
|
(Σ[ b' ∈ B ] (a , b') ∈ S × (b' , b) ∈ Diag B)
|
|||
|
((a , b) ∈ S)
|
|||
|
backwards
|
|||
|
isequiv ab∈S = gradLemma backwards forwards isbijective fwd-bwd ab∈S
|
|||
|
|
|||
|
equi : (Σ[ b' ∈ B ] (a , b') ∈ S × (b' , b) ∈ Diag B)
|
|||
|
≃ ab ∈ S
|
|||
|
equi = backwards , isequiv
|
|||
|
|
|||
|
ident-r : (Σ[ b' ∈ B ] (a , b') ∈ S × (b' , b) ∈ Diag B)
|
|||
|
≡ ab ∈ S
|
|||
|
ident-r = equivToPath equi
|
|||
|
|
|||
|
Rel-as-Cat : Category
|
|||
|
Rel-as-Cat = record
|
|||
|
{ Object = Set
|
|||
|
; Arrow = λ S R → Subset (S × R)
|
|||
|
; 𝟙 = λ {S} → Diag S
|
|||
|
; _⊕_ = λ {A B C} S R → λ {( a , c ) → Σ[ b ∈ B ] ( (a , b) ∈ R × (b , c) ∈ S )}
|
|||
|
; assoc = {!!}
|
|||
|
; ident = funExt ident-l , funExt ident-r
|
|||
|
}
|
|||
|
|
|||
|
module _ {ℓ ℓ' : Level} {ℂ : Category {ℓ} {ℓ}} where
|
|||
|
private
|
|||
|
C-Obj = Object ℂ
|
|||
|
_+_ = Arrow ℂ
|
|||
|
|
|||
|
RepFunctor : Functor ℂ 𝕊et-as-Cat
|
|||
|
RepFunctor =
|
|||
|
record
|
|||
|
{ F = λ A → (B : C-Obj) → Hom {ℂ = ℂ} A B
|
|||
|
; f = λ { {c' = c'} f g → HomFromArrow {ℂ = {!𝕊et-as-Cat!}} c' g}
|
|||
|
; ident = {!!}
|
|||
|
; distrib = {!!}
|
|||
|
}
|