{-# OPTIONS --without-K --exact-split --safe #-} open import Fragment.Algebra.Signature module Fragment.Algebra.Homomorphism.Base (Σ : Signature) where open import Fragment.Algebra.Algebra Σ open import Fragment.Algebra.Homomorphism.Definitions Σ open import Fragment.Setoid.Morphism as Morphism hiding (id; ∣_∣; ∣_∣-cong) open import Level using (Level; _⊔_) open import Function using (_∘_; _$_) open import Data.Vec using (map) open import Data.Vec.Properties using (map-id; map-∘) import Data.Vec.Relation.Binary.Equality.Setoid as VecSetoid open import Relation.Binary using (IsEquivalence) import Relation.Binary.Reasoning.Setoid as Reasoning private variable a b c ℓ₁ ℓ₂ ℓ₃ : Level module _ (A : Algebra {a} {ℓ₁}) (B : Algebra {b} {ℓ₂}) where infixr 1 _⟿_ record _⟿_ : Set (a ⊔ b ⊔ ℓ₁ ⊔ ℓ₂) where field ∣_∣⃗ : ∥ A ∥/≈ ↝ ∥ B ∥/≈ ∣_∣-hom : Homomorphic A B (Morphism.∣_∣ ∣_∣⃗) ∣_∣ : ∥ A ∥ → ∥ B ∥ ∣_∣ = Morphism.∣_∣ ∣_∣⃗ ∣_∣-cong : Congruent ≈[ A ] ≈[ B ] ∣_∣ ∣_∣-cong = Morphism.∣_∣-cong ∣_∣⃗ open _⟿_ public module _ {A : Algebra {a} {ℓ₁}} where private ∣id∣-hom : Homomorphic A A (λ x → x) ∣id∣-hom {n} f xs = A ⟦ f ⟧-cong $ reflexive (map-id xs) where open VecSetoid ∥ A ∥/≈ open IsEquivalence (≋-isEquivalence n) using (reflexive) id : A ⟿ A id = record { ∣_∣⃗ = Morphism.id ; ∣_∣-hom = ∣id∣-hom } module _ {A : Algebra {a} {ℓ₁}} {B : Algebra {b} {ℓ₂}} {C : Algebra {c} {ℓ₃}} (g : B ⟿ C) (f : A ⟿ B) where private ⊙-hom : Homomorphic A C (∣ g ∣ ∘ ∣ f ∣) ⊙-hom {n} op xs = begin C ⟦ op ⟧ (map (∣ g ∣ ∘ ∣ f ∣) xs) ≈⟨ C ⟦ op ⟧-cong $ reflexive (map-∘ ∣ g ∣ ∣ f ∣ xs) ⟩ C ⟦ op ⟧ (map ∣ g ∣ (map ∣ f ∣ xs)) ≈⟨ ∣ g ∣-hom op (map ∣ f ∣ xs) ⟩ ∣ g ∣ (B ⟦ op ⟧ (map ∣ f ∣ xs)) ≈⟨ ∣ g ∣-cong (∣ f ∣-hom op xs) ⟩ ∣ g ∣ (∣ f ∣ (A ⟦ op ⟧ xs)) ∎ where open Reasoning ∥ C ∥/≈ open VecSetoid ∥ C ∥/≈ open IsEquivalence (≋-isEquivalence n) using (reflexive) infixr 9 _⊙_ _⊙_ : A ⟿ C _⊙_ = record { ∣_∣⃗ = ∣ g ∣⃗ · ∣ f ∣⃗ ; ∣_∣-hom = ⊙-hom }