|
| 1 | +{-# OPTIONS --type-in-type #-} |
| 2 | +module Rosetta.Category.CartesianClosed where |
| 3 | +open import Rosetta.Category.Core |
| 4 | + |
| 5 | +record Op✓ {ob : Set} (hom : ob → ob → Set) : Set where |
| 6 | + infixr 6 _×_ |
| 7 | + infixl 7 _^_ |
| 8 | + infix 7 ƛ_ |
| 9 | + field |
| 10 | + 𝟙 : ob |
| 11 | + _×_ : ob → ob → ob |
| 12 | + _^_ : ob → ob → ob |
| 13 | + |
| 14 | + ! : ∀ {X} → hom X 𝟙 |
| 15 | + π₁ : ∀ {A B} → hom (A × B) A |
| 16 | + π₂ : ∀ {A B} → hom (A × B) B |
| 17 | + ⟨_,_⟩ : ∀ {A B X} → hom X A → hom X B → hom X (A × B) |
| 18 | + ε : ∀ {A B} → hom (B ^ A × A) B |
| 19 | + ƛ_ : ∀ {A B X} → hom (X × A) B → hom X (B ^ A) |
| 20 | + |
| 21 | + !₍_₎ : ∀ X → hom X 𝟙 |
| 22 | + !₍ X ₎ = ! |
| 23 | + |
| 24 | + π₁₍_,_₎ : ∀ A B → hom (A × B) A |
| 25 | + π₁₍ A , B ₎ = π₁ |
| 26 | + |
| 27 | + π₂₍_,_₎ : ∀ A B → hom (A × B) B |
| 28 | + π₂₍ A , B ₎ = π₂ |
| 29 | + |
| 30 | + ε₍_,_₎ : ∀ A B → hom (B ^ A × A) B |
| 31 | + ε₍ A , B ₎ = ε |
| 32 | + |
| 33 | + module Functorial ⦃ _ : Op hom ⦄ where |
| 34 | + infixr 6 _×₁_ |
| 35 | + _×₁_ : ∀ {A₁ A₂ B₁ B₂} → hom A₁ B₁ → hom A₂ B₂ → hom (A₁ × A₂) (B₁ × B₂) |
| 36 | + f₁ ×₁ f₂ = ⟨ f₁ ∘ π₁ , f₂ ∘ π₂ ⟩ |
| 37 | + |
| 38 | + _^₁_ : ∀ B {A₁ A₂} → hom A₂ A₁ → hom (B ^ A₁) (B ^ A₂) |
| 39 | + B ^₁ f = ƛ (ε ∘ id ×₁ f) |
| 40 | + |
| 41 | + open Functorial public |
| 42 | + |
| 43 | +open Op✓ ⦃...⦄ public hiding (𝟙; _×_; _^_) |
| 44 | + |
| 45 | +{-# DISPLAY Op✓.! _ = ! #-} |
| 46 | +{-# DISPLAY Op✓.π₁ _ = π₁ #-} |
| 47 | +{-# DISPLAY Op✓.π₂ _ = π₂ #-} |
| 48 | +{-# DISPLAY Op✓.⟨_,_⟩ _ = ⟨_,_⟩ #-} |
| 49 | +{-# DISPLAY Op✓.ε _ = ε #-} |
| 50 | +{-# DISPLAY Op✓.ƛ_ _ = ƛ_ #-} |
| 51 | +{-# DISPLAY Op✓._×₁_ _ = _×₁_ #-} |
| 52 | +{-# DISPLAY Op✓._^₁_ _ = _^₁_ #-} |
| 53 | + |
| 54 | +record CartesianClosed (𝓒 : Category) : Set where |
| 55 | + field |
| 56 | + ⦃ op✓ ⦄ : Op✓ (𝓒 ∣_⟶_) |
| 57 | + |
| 58 | + open Op✓ op✓ using (𝟙; _×_; _^_) |
| 59 | + |
| 60 | + field |
| 61 | + .!-universal : ∀ {X} {⁇ : 𝓒 ∣ X ⟶ 𝟙} |
| 62 | + → 𝓒 ∣ ⁇ ∼ ! |
| 63 | + .⟨,⟩-cong₂ : ∀ {A B X} {f₁ f₂ : 𝓒 ∣ X ⟶ A} {g₁ g₂ : 𝓒 ∣ X ⟶ B} |
| 64 | + → 𝓒 ∣ f₁ ∼ f₂ |
| 65 | + → 𝓒 ∣ g₁ ∼ g₂ |
| 66 | + → 𝓒 ∣ ⟨ f₁ , g₁ ⟩ ∼ ⟨ f₂ , g₂ ⟩ |
| 67 | + .⟨,⟩-commute₁ : ∀ {A B X} {f : 𝓒 ∣ X ⟶ A} {g : 𝓒 ∣ X ⟶ B} |
| 68 | + → 𝓒 ∣ π₁ ∘ ⟨ f , g ⟩ ∼ f |
| 69 | + .⟨,⟩-commute₂ : ∀ {A B X} {f : 𝓒 ∣ X ⟶ A} {g : 𝓒 ∣ X ⟶ B} |
| 70 | + → 𝓒 ∣ π₂ ∘ ⟨ f , g ⟩ ∼ g |
| 71 | + .⟨,⟩-universal : ∀ {A B X} {f : 𝓒 ∣ X ⟶ A} {g : 𝓒 ∣ X ⟶ B} {⁇ : 𝓒 ∣ X ⟶ A × B} |
| 72 | + → 𝓒 ∣ π₁ ∘ ⁇ ∼ f |
| 73 | + → 𝓒 ∣ π₂ ∘ ⁇ ∼ g |
| 74 | + → 𝓒 ∣ ⁇ ∼ ⟨ f , g ⟩ |
| 75 | + .ƛ-cong : ∀ {A B X} {f₁ f₂ : 𝓒 ∣ X × A ⟶ B} |
| 76 | + → 𝓒 ∣ f₁ ∼ f₂ |
| 77 | + → 𝓒 ∣ ƛ f₁ ∼ ƛ f₂ |
| 78 | + .ƛ-commute : ∀ {A B X} {f : 𝓒 ∣ X × A ⟶ B} |
| 79 | + → 𝓒 ∣ ε ∘ ƛ f ×₁ id ∼ f |
| 80 | + .ƛ-universal : ∀ {A B X} {f : 𝓒 ∣ X × A ⟶ B} {⁇ : 𝓒 ∣ X ⟶ B ^ A} |
| 81 | + → 𝓒 ∣ ε ∘ ⁇ ×₁ id ∼ f |
| 82 | + → 𝓒 ∣ ⁇ ∼ ƛ f |
| 83 | + |
| 84 | +open CartesianClosed public |
0 commit comments