module GpdCont.Group.Solve where open import Agda.Builtin.Reflection using (Term ; TC) open import Cubical.Foundations.Prelude open import Cubical.Foundations.Structure open import Cubical.Data.Nat.Base open import Cubical.Algebra.Group.Base open import Cubical.Tactics.MonoidSolver.MonoidExpression using (Expr) open import Cubical.Tactics.MonoidSolver.Solver using (module Eval) renaming (solve to naiveSolveMonoid) open import Cubical.Tactics.MonoidSolver.Reflection using (solveMonoid ; module ReflectionSolver) module _ {ℓ} (G : Group ℓ) where private M = Group→Monoid G naiveSolveGroup : ∀ {n : ℕ} (e₁ e₂ : Expr ⟨ M ⟩ n) → (v : Eval.Env M n) → (p : Eval.eval M (Eval.normalize M e₁) v ≡ Eval.eval M (Eval.normalize M e₂) v) → Eval.⟦ M ⟧ e₁ v ≡ Eval.⟦ M ⟧ e₂ v naiveSolveGroup = naiveSolveMonoid M macro solveGroup : Term → Term → TC Unit solveGroup = ReflectionSolver.solve-macro (quote GroupStr._·_) (quote GroupStr.1g) (quote naiveSolveGroup)