{-# OPTIONS --without-K --exact-split --safe #-} open import Fragment.Algebra.Signature module Fragment.Equational.Theory.Laws (Σ : Signature) where open import Fragment.Equational.Theory.Base using (Eq) open import Function using (_∘_) open import Data.Empty using (⊥) open import Data.Fin using (#_) open import Data.Sum using (inj₁; inj₂) open import Data.Product using (_,_) import Relation.Binary.PropositionalEquality as PE open import Fragment.Algebra.Free Σ open import Fragment.Algebra.Free.Syntax Σ (PE.setoid ⊥) module _ where private a = # 0 dne : ops Σ 1 → Eq Σ 1 dne ~ = ⟨ ~ ⟩₁ ⟨ ~ ⟩₁ ⟨ a ⟩ , ⟨ a ⟩ module _ (e : ops Σ 0) where private a = # 0 idₗ : ops Σ 2 → Eq Σ 1 idₗ • = ⟨ e ⟩₀ ⟨ • ⟩₂ ⟨ a ⟩ , ⟨ a ⟩ idᵣ : ops Σ 2 → Eq Σ 1 idᵣ • = ⟨ a ⟩ ⟨ • ⟩₂ ⟨ e ⟩₀ , ⟨ a ⟩ anₗ : ops Σ 2 → Eq Σ 1 anₗ • = ⟨ e ⟩₀ ⟨ • ⟩₂ ⟨ a ⟩ , ⟨ e ⟩₀ anᵣ : ops Σ 2 → Eq Σ 1 anᵣ • = ⟨ a ⟩ ⟨ • ⟩₂ ⟨ e ⟩₀ , ⟨ e ⟩₀ invₗ : ops Σ 1 → ops Σ 2 → Eq Σ 1 invₗ ~ • = (⟨ ~ ⟩₁ ⟨ a ⟩) ⟨ • ⟩₂ ⟨ a ⟩ , ⟨ e ⟩₀ invᵣ : ops Σ 1 → ops Σ 2 → Eq Σ 1 invᵣ ~ • = ⟨ a ⟩ ⟨ • ⟩₂ (⟨ ~ ⟩₁ ⟨ a ⟩) , ⟨ e ⟩₀ module _ where private a = # 0 b = # 1 c = # 2 hom : ops Σ 1 → ∀ {n} → ops Σ n → Eq Σ n hom h {n} f = ⟨ h ⟩₁ term f (map ⟨_⟩ (allFin n)) , term f (map (⟨ h ⟩₁_ ∘ ⟨_⟩) (allFin n)) where open import Data.Vec using (map; allFin) comm : ops Σ 2 → Eq Σ 2 comm • = ⟨ a ⟩ ⟨ • ⟩₂ ⟨ b ⟩ , ⟨ b ⟩ ⟨ • ⟩₂ ⟨ a ⟩ assoc : ops Σ 2 → Eq Σ 3 assoc • = (⟨ a ⟩ ⟨ • ⟩₂ ⟨ b ⟩) ⟨ • ⟩₂ ⟨ c ⟩ , ⟨ a ⟩ ⟨ • ⟩₂ (⟨ b ⟩ ⟨ • ⟩₂ ⟨ c ⟩)