{-# OPTIONS --without-K --exact-split --safe #-}
module Fragment.Setoid.Morphism.Base where
open import Level using (Level; _⊔_)
open import Function using (_∘_; Congruent)
import Relation.Binary.PropositionalEquality as PE
open import Relation.Binary using (Setoid)
private
variable
a b c ℓ₁ ℓ₂ ℓ₃ : Level
module _ (S : Setoid a ℓ₁) (T : Setoid b ℓ₂) where
open Setoid S renaming (Carrier to A; _≈_ to _≈₁_)
open Setoid T renaming (Carrier to B; _≈_ to _≈₂_)
infixr 1 _↝_
record _↝_ : Set (a ⊔ b ⊔ ℓ₁ ⊔ ℓ₂) where
field
∣_∣ : A → B
∣_∣-cong : Congruent _≈₁_ _≈₂_ ∣_∣
open _↝_ public
lift : ∀ {A : Set a} {B : Setoid b ℓ₂}
→ (A → Setoid.Carrier B)
→ (PE.setoid A ↝ B)
lift {B = B} f
= record { ∣_∣ = f
; ∣_∣-cong = reflexive ∘ (PE.cong f)
}
where open Setoid B
id : ∀ {A : Setoid a ℓ₁} → A ↝ A
id = record { ∣_∣ = λ x → x ; ∣_∣-cong = λ x → x }
_·_ : ∀ {A : Setoid a ℓ₁} {B : Setoid b ℓ₂} {C : Setoid c ℓ₃}
→ B ↝ C → A ↝ B → A ↝ C
g · f = record { ∣_∣ = ∣ g ∣ ∘ ∣ f ∣
; ∣_∣-cong = ∣ g ∣-cong ∘ ∣ f ∣-cong
}