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

syntax PDiff | PD

type
  * : 0-ary

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

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)
  (βˆ‚βŠ•) a : * |> x : * |- d0 (add (x, a)) = one
  (βˆ‚βŠ—) a : * |> x : * |- d0 (mult(a, x)) = a
  (βˆ‚C) f : (*,*).* |> x : *  y : * |- d1 (d0 (f[x,y])) = d0 (d1 (f[x,y]))
  (βˆ‚Chβ‚‚) f : (*,*).*  g h : *.* |> x : * |- d0 (f[g[x], h[x]]) = add (mult(pd(z. f[z, h[x]], g[x]), d0(g[x])), mult(pd(z. f[g[x], z], h[x]), d0(h[x])))
  (βˆ‚Ch₁) f g : *.* |> x : * |- d0 (f[g[x]]) = mult (pd (z. f[z], g[x]), d0(g[x]))
-}

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

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

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

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

-- Axioms of equality
data _β–Ή_⊒_≋ₐ_ : βˆ€ 𝔐 Ξ“ {Ξ±} β†’ (𝔐 β–· PD) Ξ± Ξ“ β†’ (𝔐 β–· PD) Ξ± Ξ“ β†’ Set where
  𝟘UβŠ•α΄Έ : ⁅ * ⁆̣             β–Ή     βˆ…     ⊒               𝟘 βŠ• π”ž ≋ₐ π”ž
  βŠ•A   : ⁅ * ⁆ ⁅ * ⁆ ⁅ * ⁆̣ β–Ή     βˆ…     ⊒         (π”ž βŠ• π”Ÿ) βŠ• 𝔠 ≋ₐ π”ž βŠ• (π”Ÿ βŠ• 𝔠)
  βŠ•C   : ⁅ * ⁆ ⁅ * ⁆̣       β–Ή     βˆ…     ⊒               π”ž βŠ• π”Ÿ ≋ₐ π”Ÿ βŠ• π”ž
  πŸ™UβŠ—α΄Έ : ⁅ * ⁆̣             β–Ή     βˆ…     ⊒               πŸ™ βŠ— π”ž ≋ₐ π”ž
  βŠ—A   : ⁅ * ⁆ ⁅ * ⁆ ⁅ * ⁆̣ β–Ή     βˆ…     ⊒         (π”ž βŠ— π”Ÿ) βŠ— 𝔠 ≋ₐ π”ž βŠ— (π”Ÿ βŠ— 𝔠)
  βŠ—DβŠ•α΄Έ : ⁅ * ⁆ ⁅ * ⁆ ⁅ * ⁆̣ β–Ή     βˆ…     ⊒         π”ž βŠ— (π”Ÿ βŠ• 𝔠) ≋ₐ (π”ž βŠ— π”Ÿ) βŠ• (π”ž βŠ— 𝔠)
  𝟘XβŠ—α΄Έ : ⁅ * ⁆̣             β–Ή     βˆ…     ⊒               𝟘 βŠ— π”ž ≋ₐ 𝟘
  βŠ–NβŠ•α΄Έ : ⁅ * ⁆̣             β–Ή     βˆ…     ⊒           (βŠ– π”ž) βŠ• π”ž ≋ₐ 𝟘
  βŠ—C   : ⁅ * ⁆ ⁅ * ⁆̣       β–Ή     βˆ…     ⊒               π”ž βŠ— π”Ÿ ≋ₐ π”Ÿ βŠ— π”ž
  βˆ‚βŠ•   : ⁅ * ⁆̣             β–Ή   ⌊ * βŒ‹   ⊒         βˆ‚β‚€ (xβ‚€ βŠ• π”ž) ≋ₐ πŸ™
  βˆ‚βŠ—   : ⁅ * ⁆̣             β–Ή   ⌊ * βŒ‹   ⊒         βˆ‚β‚€ (π”ž βŠ— xβ‚€) ≋ₐ π”ž
  βˆ‚C   : ⁅ * Β· * ⊩ * ⁆̣     β–Ή ⌊ * βˆ™ * βŒ‹ ⊒  βˆ‚β‚ βˆ‚β‚€ π”žβŸ¨ xβ‚€ β—‚ x₁ ⟩ ≋ₐ βˆ‚β‚€ βˆ‚β‚ π”žβŸ¨ xβ‚€ β—‚ x₁ ⟩
  βˆ‚Chβ‚‚ : ⁅ * Β· * ⊩ * ⁆ ⁅ * ⊩ * ⁆ ⁅ * ⊩ * ⁆̣ β–Ή ⌊ * βŒ‹
       ⊒ βˆ‚β‚€ π”žβŸ¨ (π”ŸβŸ¨ xβ‚€ ⟩) β—‚ (π” βŸ¨ xβ‚€ ⟩) ⟩ ≋ₐ ((βˆ‚ π”žβŸ¨ xβ‚€ β—‚ (π” βŸ¨ x₁ ⟩) ⟩ ∣ π”ŸβŸ¨ xβ‚€ ⟩) βŠ— (βˆ‚β‚€ π”ŸβŸ¨ xβ‚€ ⟩))
                                       βŠ• ((βˆ‚ π”žβŸ¨ (π”ŸβŸ¨ x₁ ⟩) β—‚ xβ‚€ ⟩ ∣ π” βŸ¨ xβ‚€ ⟩) βŠ— (βˆ‚β‚€ π” βŸ¨ xβ‚€ ⟩))

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γ€Š π”ž 》)

-- Derivative of a variable is 1
βˆ‚id : ⁅⁆ β–Ή ⌊ * βŒ‹ ⊒ βˆ‚β‚€ xβ‚€ ≋ πŸ™
βˆ‚id = begin
      βˆ‚β‚€ xβ‚€       β‰‹βŸ¨ cong[ thm 𝟘UβŠ•α΄Ώ withγ€Š xβ‚€ 》 ]inside βˆ‚β‚€ β—Œα΅ƒ βŸ©β‚›
      βˆ‚β‚€ (xβ‚€ βŠ• 𝟘) β‰‹βŸ¨ ax βˆ‚βŠ• withγ€Š 𝟘 》 ⟩
      πŸ™           ∎

-- Derivative of 0 is 0
βˆ‚πŸ˜ : ⁅⁆ β–Ή ⌊ * βŒ‹ ⊒ βˆ‚β‚€ 𝟘 ≋ 𝟘
βˆ‚πŸ˜ = begin
      βˆ‚β‚€ 𝟘         β‰‹βŸ¨ cong[ ax 𝟘XβŠ—α΄Έ withγ€Š xβ‚€ 》 ]inside βˆ‚β‚€ β—Œα΅ƒ βŸ©β‚›
      βˆ‚β‚€ (𝟘 βŠ— xβ‚€)  β‰‹βŸ¨ ax βˆ‚βŠ— withγ€Š 𝟘 》 ⟩
      𝟘            ∎

-- Unary chain rule
βˆ‚Ch₁ : ⁅ * ⊩ * ⁆ ⁅ * ⊩ * ⁆̣ β–Ή ⌊ * βŒ‹
     ⊒ βˆ‚β‚€ π”žβŸ¨ (π”ŸβŸ¨ xβ‚€ ⟩) ⟩ ≋ (βˆ‚ π”žβŸ¨ xβ‚€ ⟩ ∣ π”ŸβŸ¨ xβ‚€ ⟩) βŠ— (βˆ‚β‚€ π”ŸβŸ¨ xβ‚€ ⟩)
βˆ‚Ch₁ = begin
      βˆ‚β‚€ (π”žβŸ¨ (π”ŸβŸ¨ xβ‚€ ⟩) ⟩)
  β‰‹βŸ¨ ax βˆ‚Chβ‚‚ withγ€Š π”žβŸ¨ xβ‚€ ⟩ β—ƒ π”ŸβŸ¨ xβ‚€ ⟩ β—ƒ 𝟘 》 ⟩
        (βˆ‚ π”žβŸ¨ xβ‚€ ⟩ ∣ (π”ŸβŸ¨ xβ‚€ ⟩)) βŠ— (βˆ‚β‚€ (π”ŸβŸ¨ xβ‚€ ⟩))
      βŠ• ((βˆ‚ π”žβŸ¨ (π”ŸβŸ¨ x₁ ⟩) ⟩ ∣ 𝟘) βŠ— (βˆ‚β‚€ 𝟘))
  β‰‹βŸ¨ cong[ thm βˆ‚πŸ˜ ]inside (βˆ‚ π”žβŸ¨ xβ‚€ ⟩ ∣ (π”ŸβŸ¨ xβ‚€ ⟩)) βŠ— (βˆ‚β‚€ (π”ŸβŸ¨ xβ‚€ ⟩)) βŠ•
                          ((βˆ‚ π”žβŸ¨ (π”ŸβŸ¨ x₁ ⟩) ⟩ ∣ 𝟘) βŠ— β—ŒαΆœ) ⟩
        (βˆ‚ π”žβŸ¨ xβ‚€ ⟩ ∣ (π”ŸβŸ¨ xβ‚€ ⟩)) βŠ— (βˆ‚β‚€ (π”ŸβŸ¨ xβ‚€ ⟩))
      βŠ• (βˆ‚ π”žβŸ¨ (π”ŸβŸ¨ x₁ ⟩) ⟩ ∣ 𝟘) βŠ— 𝟘
  β‰‹βŸ¨ cong[ thm 𝟘XβŠ—α΄Ώ withγ€Š (βˆ‚ π”žβŸ¨ (π”ŸβŸ¨ x₁ ⟩) ⟩ ∣ 𝟘) 》 ]inside (βˆ‚ π”žβŸ¨ xβ‚€ ⟩ ∣ (π”ŸβŸ¨ xβ‚€ ⟩)) βŠ— (βˆ‚β‚€ (π”ŸβŸ¨ xβ‚€ ⟩)) βŠ• β—ŒαΆœ ⟩
        (βˆ‚ π”žβŸ¨ xβ‚€ ⟩ ∣ (π”ŸβŸ¨ xβ‚€ ⟩)) βŠ— (βˆ‚β‚€ (π”ŸβŸ¨ xβ‚€ ⟩))
      βŠ• 𝟘
  β‰‹βŸ¨ thm 𝟘UβŠ•α΄Ώ withγ€Š (βˆ‚ π”žβŸ¨ xβ‚€ ⟩ ∣ (π”ŸβŸ¨ xβ‚€ ⟩)) βŠ— (βˆ‚β‚€ (π”ŸβŸ¨ xβ‚€ ⟩)) 》 ⟩
      (βˆ‚ π”žβŸ¨ xβ‚€ ⟩ ∣ π”ŸβŸ¨ xβ‚€ ⟩) βŠ— (βˆ‚β‚€ π”ŸβŸ¨ xβ‚€ ⟩)
  ∎