{-# OPTIONS --without-K --safe #-} open import Categories.Category module Categories.Category.Construction.Pullbacks {o ℓ e} (C : Category o ℓ e) where open import Level using (_⊔_) open import Function using (_$_) open import Data.Product using (_×_; _,_) open import Categories.Diagram.Pullback C open import Categories.Morphism.Reasoning C open Category C record PullbackObj W : Set (o ⊔ ℓ ⊔ e) where field {A} {B} : Obj arr₁ : A ⇒ W arr₂ : B ⇒ W pullback : Pullback arr₁ arr₂ module pullback = Pullback pullback open HomReasoning record Pullback⇒ W (X Y : PullbackObj W) : Set (o ⊔ ℓ ⊔ e) where module X = PullbackObj X module Y = PullbackObj Y field mor₁ : X.A ⇒ Y.A mor₂ : X.B ⇒ Y.B commute₁ : Y.arr₁ ∘ mor₁ ≈ X.arr₁ commute₂ : Y.arr₂ ∘ mor₂ ≈ X.arr₂ pbarr : X.pullback.P ⇒ Y.pullback.P pbarr = Y.pullback.universal $ begin Y.arr₁ ∘ mor₁ ∘ X.pullback.p₁ ≈⟨ pullˡ commute₁ ⟩ X.arr₁ ∘ X.pullback.p₁ ≈⟨ X.pullback.commute ⟩ X.arr₂ ∘ X.pullback.p₂ ≈˘⟨ pullˡ commute₂ ⟩ Y.arr₂ ∘ mor₂ ∘ X.pullback.p₂ ∎ open Pullback⇒ Pullbacks : Obj → Category (o ⊔ ℓ ⊔ e) (o ⊔ ℓ ⊔ e) e Pullbacks W = record { Obj = PullbackObj W ; _⇒_ = Pullback⇒ W ; _≈_ = λ f g → mor₁ f ≈ mor₁ g × mor₂ f ≈ mor₂ g ; id = record { mor₁ = id ; mor₂ = id ; commute₁ = identityʳ ; commute₂ = identityʳ } ; _∘_ = λ f g → record { mor₁ = mor₁ f ∘ mor₁ g ; mor₂ = mor₂ f ∘ mor₂ g ; commute₁ = pullˡ (commute₁ f) ○ commute₁ g ; commute₂ = pullˡ (commute₂ f) ○ commute₂ g } ; assoc = assoc , assoc ; sym-assoc = sym-assoc , sym-assoc ; identityˡ = identityˡ , identityˡ ; identityʳ = identityʳ , identityʳ ; identity² = identity² , identity² ; equiv = record { refl = refl , refl ; sym = λ { (eq₁ , eq₂) → sym eq₁ , sym eq₂ } ; trans = λ { (eq₁ , eq₂) (eq₃ , eq₄) → trans eq₁ eq₃ , trans eq₂ eq₄ } } ; ∘-resp-≈ = λ { (eq₁ , eq₂) (eq₃ , eq₄) → ∘-resp-≈ eq₁ eq₃ , ∘-resp-≈ eq₂ eq₄ } } where open Equiv