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

syntax Ring | R

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
-}

module Ring.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 Ring.Signature
open import Ring.Syntax

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

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

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

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

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

-- Derived equations
𝟘UβŠ•α΄Ώ : ⁅ * ⁆̣ β–Ή βˆ… ⊒ π”ž βŠ• 𝟘 ≋ π”ž
𝟘UβŠ•α΄Ώ = tr (ax βŠ•C withγ€Š π”ž β—ƒ 𝟘 》) (ax 𝟘UβŠ•α΄Έ withγ€Š π”ž 》)
βŠ–NβŠ•α΄Ώ : ⁅ * ⁆̣ β–Ή βˆ… ⊒ π”ž βŠ• (βŠ– π”ž) ≋ 𝟘
βŠ–NβŠ•α΄Ώ = tr (ax βŠ•C withγ€Š π”ž β—ƒ (βŠ– π”ž) 》) (ax βŠ–NβŠ•α΄Έ withγ€Š π”ž 》)