{-# OPTIONS --without-K --safe #-} module Categories.Category.Instance.Properties.Setoids.CCC where open import Level open import Data.Product using (Σ ; _,_) open import Function.Bundles using (Func; _⟨$⟩_) open import Function.Construct.Setoid using (setoid) open import Relation.Binary using (Setoid) open import Categories.Category.Core using (Category) open import Categories.Category.BinaryProducts using (BinaryProducts) open import Categories.Category.CartesianClosed using (CartesianClosed) open import Categories.Category.CartesianClosed.Canonical renaming (CartesianClosed to CCartesianClosed) open import Categories.Category.Monoidal.Instance.Setoids using (Setoids-Cartesian) open import Categories.Category.Instance.Setoids using (Setoids) open import Categories.Object.Terminal using (Terminal) module _ ℓ where private S = Setoids ℓ ℓ module S = Category S Setoids-Canonical : CCartesianClosed S Setoids-Canonical = record { ⊤ = ⊤ ; _×_ = _×_ ; ! = ! ; π₁ = π₁ ; π₂ = π₂ ; ⟨_,_⟩ = ⟨_,_⟩ ; !-unique = !-unique ; π₁-comp = λ {_ _ f _ g} → project₁ {h = f} {g} ; π₂-comp = λ {_ _ f _ g} → project₂ {h = f} {g} ; ⟨,⟩-unique = λ {_ _ _ f g h} → unique {h = h} {f} {g} ; _^_ = λ X Y → setoid Y X ; eval = λ {X Y} → let module X = Setoid X in record { to = λ { (f , x) → f ⟨$⟩ x } ; cong = λ { {( f₁ , x₁)} {(f₂ , x₂)} (eq₁ , eq₂) → X.trans (eq₁ {x₁}) (Func.cong f₂ eq₂)} } ; curry = λ {C A B} f → record { to = λ c → record { to = λ a → f ⟨$⟩ (c , a) ; cong = λ eq → Func.cong f (Setoid.refl C , eq) } ; cong = λ eq₁ → Func.cong f (eq₁ , (Setoid.refl A)) } ; eval-comp = λ {C A B f} → Func.cong f (Setoid.refl B , Setoid.refl A) ; curry-unique = λ eq → eq } where open Setoids-Cartesian open BinaryProducts products using (_×_; π₁; π₂; ⟨_,_⟩; project₁; project₂; unique) open Terminal terminal using (⊤; !; !-unique) Setoids-CCC : CartesianClosed S Setoids-CCC = Equivalence.fromCanonical S Setoids-Canonical