{-
This second-order equational theory was created from the following second-order syntax description:

syntax CommRing | CR

type
  * : 0-ary

term
  zero : * | 𝟘
  add  : *  *  ->  * | _βŠ•_ l20
  one  : * | πŸ™
  mult : *  *  ->  * | _βŠ—_ l30
  neg  : *  ->  * | βŠ–_ r50

theory
  (𝟘UβŠ•α΄Έ) a |> add (zero, a) = a
  (𝟘UβŠ•α΄Ώ) a |> add (a, zero) = a
  (βŠ•A) a b c |> add (add(a, b), c) = add (a, add(b, c))
  (βŠ•C) a b |> add(a, b) = add(b, a)
  (πŸ™UβŠ—α΄Έ) a |> mult (one, a) = a
  (πŸ™UβŠ—α΄Ώ) a |> mult (a, one) = a
  (βŠ—A) a b c |> mult (mult(a, b), c) = mult (a, mult(b, c))
  (βŠ—DβŠ•α΄Έ) a b c |> mult (a, add (b, c)) = add (mult(a, b), mult(a, c))
  (βŠ—DβŠ•α΄Ώ) a b c |> mult (add (a, b), c) = add (mult(a, c), mult(b, c))
  (𝟘XβŠ—α΄Έ) a |> mult (zero, a) = zero
  (𝟘XβŠ—α΄Ώ) a |> mult (a, zero) = zero
  (βŠ–NβŠ•α΄Έ) a |> add (neg (a), a) = zero
  (βŠ–NβŠ•α΄Ώ) a |> add (a, neg (a)) = zero
  (βŠ—C) a b |> mult(a, b) = mult(b, a)
-}

module CommRing.Equality where

open import SOAS.Common
open import SOAS.Context
open import SOAS.Variable
open import SOAS.Families.Core
open import SOAS.Families.Build
open import SOAS.ContextMaps.Inductive

open import CommRing.Signature
open import CommRing.Syntax

open import SOAS.Metatheory.SecondOrder.Metasubstitution CR:Syn
open import SOAS.Metatheory.SecondOrder.Equality CR:Syn

private
  variable
    Ξ± Ξ² Ξ³ Ο„ : *T
    Ξ“ Ξ” Ξ  : Ctx

infix 1 _β–Ή_⊒_≋ₐ_

-- Axioms of equality
data _β–Ή_⊒_≋ₐ_ : βˆ€ 𝔐 Ξ“ {Ξ±} β†’ (𝔐 β–· CR) Ξ± Ξ“ β†’ (𝔐 β–· CR) Ξ± Ξ“ β†’ Set where
  𝟘UβŠ•α΄Έ : ⁅ * ⁆̣             β–Ή βˆ… ⊒       𝟘 βŠ• π”ž ≋ₐ π”ž
  βŠ•A   : ⁅ * ⁆ ⁅ * ⁆ ⁅ * ⁆̣ β–Ή βˆ… ⊒ (π”ž βŠ• π”Ÿ) βŠ• 𝔠 ≋ₐ π”ž βŠ• (π”Ÿ βŠ• 𝔠)
  βŠ•C   : ⁅ * ⁆ ⁅ * ⁆̣       β–Ή βˆ… ⊒       π”ž βŠ• π”Ÿ ≋ₐ π”Ÿ βŠ• π”ž
  πŸ™UβŠ—α΄Έ : ⁅ * ⁆̣             β–Ή βˆ… ⊒       πŸ™ βŠ— π”ž ≋ₐ π”ž
  βŠ—A   : ⁅ * ⁆ ⁅ * ⁆ ⁅ * ⁆̣ β–Ή βˆ… ⊒ (π”ž βŠ— π”Ÿ) βŠ— 𝔠 ≋ₐ π”ž βŠ— (π”Ÿ βŠ— 𝔠)
  βŠ—DβŠ•α΄Έ : ⁅ * ⁆ ⁅ * ⁆ ⁅ * ⁆̣ β–Ή βˆ… ⊒ π”ž βŠ— (π”Ÿ βŠ• 𝔠) ≋ₐ (π”ž βŠ— π”Ÿ) βŠ• (π”ž βŠ— 𝔠)
  𝟘XβŠ—α΄Έ : ⁅ * ⁆̣             β–Ή βˆ… ⊒       𝟘 βŠ— π”ž ≋ₐ 𝟘
  βŠ–NβŠ•α΄Έ : ⁅ * ⁆̣             β–Ή βˆ… ⊒   (βŠ– π”ž) βŠ• π”ž ≋ₐ 𝟘
  βŠ—C   : ⁅ * ⁆ ⁅ * ⁆̣       β–Ή βˆ… ⊒       π”ž βŠ— π”Ÿ ≋ₐ π”Ÿ βŠ— π”ž

open EqLogic _β–Ή_⊒_≋ₐ_
open ≋-Reasoning

-- Derived equations
𝟘UβŠ•α΄Ώ : ⁅ * ⁆̣ β–Ή βˆ… ⊒ π”ž βŠ• 𝟘 ≋ π”ž
𝟘UβŠ•α΄Ώ = tr (ax βŠ•C withγ€Š π”ž β—ƒ 𝟘 》) (ax 𝟘UβŠ•α΄Έ withγ€Š π”ž 》)
πŸ™UβŠ—α΄Ώ : ⁅ * ⁆̣ β–Ή βˆ… ⊒ π”ž βŠ— πŸ™ ≋ π”ž
πŸ™UβŠ—α΄Ώ = tr (ax βŠ—C withγ€Š π”ž β—ƒ πŸ™ 》) (ax πŸ™UβŠ—α΄Έ withγ€Š π”ž 》)
βŠ—DβŠ•α΄Ώ : ⁅ * ⁆ ⁅ * ⁆ ⁅ * ⁆̣ β–Ή βˆ… ⊒ (π”ž βŠ• π”Ÿ) βŠ— 𝔠 ≋ (π”ž βŠ— 𝔠) βŠ• (π”Ÿ βŠ— 𝔠)
βŠ—DβŠ•α΄Ώ = begin
  (π”ž βŠ• π”Ÿ) βŠ— 𝔠       β‰‹βŸ¨ ax βŠ—C withγ€Š π”ž βŠ• π”Ÿ β—ƒ 𝔠 》 ⟩
  𝔠 βŠ— (π”ž βŠ• π”Ÿ)       β‰‹βŸ¨ ax βŠ—DβŠ•α΄Έ withγ€Š 𝔠 β—ƒ π”ž β—ƒ π”Ÿ 》 ⟩
  (𝔠 βŠ— π”ž) βŠ• (𝔠 βŠ— π”Ÿ)  β‰‹βŸ¨ congβ‚‚[ ax βŠ—C withγ€Š 𝔠 β—ƒ π”ž 》 ][ ax βŠ—C withγ€Š 𝔠 β—ƒ π”Ÿ 》 ]inside β—Œα΅ˆ βŠ• β—Œα΅‰ ⟩
  (π”ž βŠ— 𝔠) βŠ• (π”Ÿ βŠ— 𝔠)  ∎
𝟘XβŠ—α΄Ώ : ⁅ * ⁆̣ β–Ή βˆ… ⊒ π”ž βŠ— 𝟘 ≋ 𝟘
𝟘XβŠ—α΄Ώ = tr (ax βŠ—C withγ€Š π”ž β—ƒ 𝟘 》) (ax 𝟘XβŠ—α΄Έ withγ€Š π”ž 》)
βŠ–NβŠ•α΄Ώ : ⁅ * ⁆̣ β–Ή βˆ… ⊒ π”ž βŠ• (βŠ– π”ž) ≋ 𝟘
βŠ–NβŠ•α΄Ώ = tr (ax βŠ•C withγ€Š π”ž β—ƒ (βŠ– π”ž) 》) (ax βŠ–NβŠ•α΄Έ withγ€Š π”ž 》)