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)