{-# OPTIONS --without-K --exact-split --safe #-} open import Fragment.Algebra.Signature module Fragment.Algebra.Homomorphism.Equivalence (Σ : Signature) where open import Fragment.Algebra.Algebra Σ open import Fragment.Algebra.Homomorphism.Base Σ open import Fragment.Algebra.Homomorphism.Properties Σ open import Fragment.Algebra.Homomorphism.Setoid Σ open import Level using (Level; _⊔_) open import Relation.Binary using (Setoid; IsEquivalence) import Relation.Binary.Reasoning.Setoid as Reasoning private variable a b c ℓ₁ ℓ₂ ℓ₃ : Level A : Algebra {a} {ℓ₁} B : Algebra {b} {ℓ₂} C : Algebra {c} {ℓ₃} module _ (A : Algebra {a} {ℓ₁}) (B : Algebra {b} {ℓ₂}) where infix 3 _≃_ record _≃_ : Set (a ⊔ b ⊔ ℓ₁ ⊔ ℓ₂) where field _⃗ : A ⟿ B _⃖ : B ⟿ A invˡ : _⃗ ⊙ _⃖ ≗ id invʳ : _⃖ ⊙ _⃗ ≗ id open _≃_ public private ≃-refl : A ≃ A ≃-refl {A = A} = record { _⃗ = id ; _⃖ = id ; invˡ = λ {_} → refl ; invʳ = λ {_} → refl } where open Setoid ∥ A ∥/≈ ≃-sym : A ≃ B → B ≃ A ≃-sym f = record { _⃗ = f ⃖ ; _⃖ = f ⃗ ; invˡ = invʳ f ; invʳ = invˡ f } ≃-inv : ∀ (g : B ≃ C) (f : A ≃ B) → (g ⃗ ⊙ f ⃗) ⊙ (f ⃖ ⊙ g ⃖) ≗ id ≃-inv {B = B} {C = C} g f = begin (g ⃗ ⊙ f ⃗) ⊙ (f ⃖ ⊙ g ⃖) ≈⟨ ⊙-assoc (g ⃗) (f ⃗) (f ⃖ ⊙ g ⃖) ⟩ g ⃗ ⊙ (f ⃗ ⊙ (f ⃖ ⊙ g ⃖)) ≈⟨ ⊙-congˡ (g ⃗) (f ⃗ ⊙ (f ⃖ ⊙ g ⃖)) ((f ⃗ ⊙ f ⃖) ⊙ g ⃖) (⊙-assoc (f ⃗) (f ⃖) (g ⃖)) ⟩ g ⃗ ⊙ ((f ⃗ ⊙ f ⃖) ⊙ g ⃖) ≈⟨ ⊙-congˡ (g ⃗) ((f ⃗ ⊙ f ⃖) ⊙ g ⃖) (id ⊙ g ⃖) (⊙-congʳ (g ⃖) (f ⃗ ⊙ f ⃖) id (invˡ f)) ⟩ g ⃗ ⊙ (id ⊙ g ⃖) ≈⟨ ⊙-congˡ (g ⃗) (id ⊙ g ⃖) (g ⃖) (id-unitˡ {f = g ⃖}) ⟩ g ⃗ ⊙ g ⃖ ≈⟨ invˡ g ⟩ id ∎ where open Reasoning (C ⟿ C /≗) ≃-trans : A ≃ B → B ≃ C → A ≃ C ≃-trans f g = record { _⃗ = g ⃗ ⊙ f ⃗ ; _⃖ = f ⃖ ⊙ g ⃖ ; invˡ = ≃-inv g f ; invʳ = ≃-inv (≃-sym f) (≃-sym g) } ≃-isEquivalence : IsEquivalence (_≃_ {a} {ℓ₁} {a} {ℓ₁}) ≃-isEquivalence = record { refl = ≃-refl ; sym = ≃-sym ; trans = ≃-trans } ≃-setoid : ∀ {a ℓ} → Setoid _ _ ≃-setoid {a} {ℓ} = record { Carrier = Algebra {a} {ℓ} ; _≈_ = _≃_ {a} {ℓ} {a} {ℓ} ; isEquivalence = ≃-isEquivalence }