PFR/Tactic/RPowSimp.lean

GitHub source file

Explanation legend Lean4 Domain Explanation Language (L4DEL)

L4DEL explanations are a separate layer. They do not change the Lean source. Intuition is explanatory prose; numbered items are a reading path; sources link the wording back to evidence.

L4DEL
Lean4 Domain Explanation Language

Credit: The upstream authors and contributors retain credit for the project and mathematics. lean4-explainer only renders their pinned source and adds the separately disclosed explanation layer.

Project sources: Pinned project documentation, Polynomial Freiman-Ruzsa proof paper, arXiv v2

40 declarations, 0 contain sorry, 0 declared as axioms

Imports (1)
Imported by 2 files
  1. structure Mathlib.Tactic.RPowRing.Context The read-only state of the RPowRing monad line 15 source

    Source documentation

    The read-only state of the RPowRing monad.

    standard axioms: Classical.choice, Quot.sound, propext what this means

    structure Context where
    …
  2. structure Mathlib.Tactic.RPowRing.Config Configuration for ring_nf line 24 source

    Source documentation

    Configuration for ring_nf.

    no axioms what this means

    structure Config where
    …
  3. abbrev Mathlib.Tactic.RPowRing.M Documented declaration: M line 37 source

    Source documentation

    The monad for RingNF contains, in addition to the AtomM state, a simp context for the main traversal and a simp function (which has another simp context) to simplify normalized polynomials.

    standard axioms: Classical.choice, Quot.sound, propext what this means

    Proof uses: ReaderT, Mathlib.Tactic.RPowRing.Context, Mathlib.Tactic.AtomM

    abbrev M := ReaderT Context AtomM

    Mentions: Mathlib.Tactic.RPowRing.Context

  4. inductive Mathlib.Tactic.RPowRing.ExBase A monomial, which is a product of powers of ExBase expressions, terminated by a (nonzero) constant coefficient line 43 source

    Source documentation

    A monomial, which is a product of powers of ExBase expressions, terminated by a (nonzero) constant coefficient.

    no axioms what this means

    Statement uses: Qq.Quoted, Lean.Expr.const, Lean.Name.mkStr1, List.nil, Lean.Level

    inductive ExBase : (e : Q(ℝ)) → Type
      /-- A coefficient `value`, which must not be `0`. `e` is a raw rat cast.
      If `value` is not an integer, then `hyp` should be a proof of `(value.den : α) ≠ 0`. -/
      | atom (id : ℕ) (x : Q(ℝ)) : ExBase x
      /-- A product `x ^ e * b` is a monomial if `b` is a monomial. Here `x` is an `ExBase`
      and `e` is an `ExBase` representing a monomial expression in `ℕ` (it is a monomial instead of
      a polynomial because we eagerly normalize `x ^ (a + b) = x ^ a * x ^ b`.) -/
      | pow (id : ℕ) (x : Q(ℝ)) (h : Q(0 < $x)) (e : Q(ℝ)) : ExBase q($x ^ $e)
  5. def Mathlib.Tactic.RPowRing.ExBase.id line 52 source

    no axioms what this means

    Statement uses: Qq.Quoted, Lean.Expr.const, Lean.Name.mkStr1, List.nil, Lean.Level, Mathlib.Tactic.RPowRing.ExBase, Nat

    Proof uses: Lean.Expr.app, Lean.Name.mkStr2, List.cons, Lean.Level.zero, Lean.Expr.lit, Lean.Literal.natVal

    1 instances, coercions and auxiliary constants left out.

  6. inductive Mathlib.Tactic.RPowRing.ExProd A monomial, which is a product of powers of ExBase expressions, terminated by a (nonzero) constant coefficient line 59 source

    Source documentation

    A monomial, which is a product of powers of ExBase expressions, terminated by a (nonzero) constant coefficient.

    no axioms what this means

    Statement uses: Qq.Quoted, Lean.Expr.const, Lean.Name.mkStr1, List.nil, Lean.Level

    inductive ExProd : (e : Q(ℝ)) → Type
      /-- A coefficient `value`, which must not be `0`. `e` is a raw rat cast.
      If `value` is not an integer, then `hyp` should be a proof of `(value.den : α) ≠ 0`. -/
      | one : ExProd q(1)
      /-- A product `x ^ e * b` is a monomial if `b` is a monomial. Here `x` is an `ExBase`
      and `e` is an `ExProd` representing a monomial expression in `ℕ` (it is a monomial instead of
      a polynomial because we eagerly normalize `x ^ (a + b) = x ^ a * x ^ b`.) -/
      | mul {x b : Q(ℝ)} : ExBase x → ExProd b → ExProd q($x * $b)

    Mentions: Mathlib.Tactic.RPowRing.ExBase

  7. instance Mathlib.Tactic.RPowRing.(instance at line 68) line 68 source
  8. instance Mathlib.Tactic.RPowRing.(instance at line 69) line 69 source
  9. def Mathlib.Tactic.RPowRing.ExBase.toProd Embed an exponent (an ExBase, ExProd pair) as an ExProd by multiplying by 1 line 72 source

    Source documentation

    Embed an exponent (an ExBase, ExProd pair) as an ExProd by multiplying by 1.

    no axioms what this means

    Statement uses: Qq.Quoted, Lean.Expr.const, Lean.Name.mkStr1, List.nil, Lean.Level, Mathlib.Tactic.RPowRing.ExBase, Mathlib.Tactic.RPowRing.ExProd, Qq.Quoted.unsafeMk, Lean.Expr.app, Lean.Name.mkStr2, List.cons, Lean.Level.zero, Lean.Expr.lit, Lean.Literal.natVal

    Proof uses: Mathlib.Tactic.RPowRing.ExProd.mul, Mathlib.Tactic.RPowRing.ExProd.one

    def ExBase.toProd {a : Q(ℝ)} (va : ExBase a) : ExProd q($a * 1) := .mul va .one

    Mentions: Mathlib.Tactic.RPowRing.ExBase, Mathlib.Tactic.RPowRing.ExProd

  10. abbrev Mathlib.Tactic.RPowRing.Result line 74 source

    no axioms what this means

    Statement uses: Qq.Quoted, Qq.Quoted.unsafeMk, Lean.Expr.sort, Lean.Level.succ, Lean.Level.zero, Lean.Expr.const, Lean.Name.mkStr1, List.nil, Lean.Level

    Proof uses: Mathlib.Tactic.Ring.Common.Result

  11. instance Mathlib.Tactic.RPowRing.(instance at line 76) line 76 source
  12. theorem Mathlib.Tactic.RPowRing.atom_pf line 79 source

    standard axioms: Classical.choice, Quot.sound, propext what this means

    Statement uses: Real, Eq, HMul.hMul, OfNat.ofNat

    Proof uses: of_eq_true, Eq.trans, True, congrArg, mul_one, eq_self

    11 instances, coercions and auxiliary constants left out.

    Tactic trace: 1 steps

    Open to load the checked before-and-after goal states.

  13. theorem Mathlib.Tactic.RPowRing.atom_pf' line 80 source

    standard axioms: Classical.choice, Quot.sound, propext what this means

    Statement uses: Real, Eq, HMul.hMul, OfNat.ofNat

    Proof uses: of_eq_true, Eq.trans, True, congr, congrArg, congrFun', mul_one, eq_self

    11 instances, coercions and auxiliary constants left out.

    Tactic trace: 1 steps

    Open to load the checked before-and-after goal states.

  14. theorem Mathlib.Tactic.RPowRing.atom_pow_pf line 81 source

    standard axioms: Classical.choice, Quot.sound, propext what this means

    Statement uses: Real, Eq, HMul.hMul, HPow.hPow, OfNat.ofNat

    Proof uses: of_eq_true, Eq.trans, True, congrArg, congrFun', Real.rpow_one, mul_one, eq_self

    15 instances, coercions and auxiliary constants left out.

    Tactic trace: 1 steps

    Open to load the checked before-and-after goal states.

  15. theorem Mathlib.Tactic.RPowRing.atom_pow_pf' line 82 source

    standard axioms: Classical.choice, Quot.sound, propext what this means

    Statement uses: Real, Eq, HMul.hMul, HPow.hPow, Nat, OfNat.ofNat

    Proof uses: of_eq_true, Eq.trans, True, congr, congrArg, congrFun', pow_one, mul_one, eq_self

    21 instances, coercions and auxiliary constants left out.

    Tactic trace: 1 steps

    Open to load the checked before-and-after goal states.

  16. def Mathlib.Tactic.RPowRing.evalAtom Evaluates an atom, an expression where ring can find no additional structure line 89 source

    Source documentation

    Evaluates an atom, an expression where ring can find no additional structure.

    • a = a ^ 1 * 1 + 0

    standard axioms: Classical.choice, Quot.sound, propext what this means

    Statement uses: Qq.Quoted, Lean.Expr.const, Lean.Name.mkStr1, List.nil, Lean.Level, Mathlib.Tactic.AtomM, Mathlib.Tactic.RPowRing.Result, Mathlib.Tactic.RPowRing.ExProd

    Proof uses: Bind.bind, Mathlib.Tactic.AtomM.Context, StateRefT', IO.RealWorld, Mathlib.Tactic.AtomM.State, Lean.Meta.MetaM, MonadReader.read, Lean.Meta.Simp.Result, liftM, ReaderT, Lean.Meta.Context, Lean.Meta.State, Lean.Core.CoreM, Mathlib.Tactic.AtomM.Context.evalAtom, Lean.Meta.Simp.Result.expr, Prod, Nat, Lean.Expr, Mathlib.Tactic.AtomM.addAtom, Mathlib.Meta.Positivity.Strictness and 20 more

    14 instances, coercions and auxiliary constants left out.

    def evalAtom (e : Q(ℝ)) : AtomM (Result ExProd e) := do
    …

    Mentions: Mathlib.Tactic.RPowRing.Result, Mathlib.Tactic.RPowRing.ExProd

  17. theorem Mathlib.Tactic.RPowRing.mul_pf_left line 102 source

    standard axioms: Classical.choice, Quot.sound, propext what this means

    Statement uses: Real, Eq, HMul.hMul

    Proof uses: Eq.mpr, id, congrArg, mul_assoc, Eq.refl

    7 instances, coercions and auxiliary constants left out.

    Tactic trace: 2 steps

    Open to load the checked before-and-after goal states.

  18. theorem Mathlib.Tactic.RPowRing.mul_pf_right line 105 source

    standard axioms: Classical.choice, Quot.sound, propext what this means

    Statement uses: Real, Eq, HMul.hMul

    Proof uses: Eq.mpr, id, congrArg, mul_left_comm, Eq.refl

    8 instances, coercions and auxiliary constants left out.

    Tactic trace: 2 steps

    Open to load the checked before-and-after goal states.

  19. theorem Mathlib.Tactic.RPowRing.mul_pp_pf_overlap line 108 source

    standard axioms: Classical.choice, Quot.sound, propext what this means

    Statement uses: Real, LT.lt, OfNat.ofNat, Eq, HMul.hMul, HPow.hPow, HAdd.hAdd

    Proof uses: Eq.mpr, id, congrArg, Real.rpow_add, mul_mul_mul_comm, Eq.refl

    22 instances, coercions and auxiliary constants left out.

    Tactic trace: 2 steps

    Open to load the checked before-and-after goal states.

  20. def Mathlib.Tactic.RPowRing.evalMul Multiplies two monomials va, vb together to get a normalized result monomial line 122 source

    Source documentation

    Multiplies two monomials va, vb together to get a normalized result monomial.

    • x * y = (x * y) (for x, y coefficients)
    • x * (b₁ * b₂) = b₁ * (b₂ * x) (for x coefficient)
    • (a₁ * a₂) * y = a₁ * (a₂ * y) (for y coefficient)
    • (x ^ ea * a₂) * (x ^ eb * b₂) = x ^ (ea + eb) * (a₂ * b₂) (if ea and eb are identical except coefficient)
    • (a₁ * a₂) * (b₁ * b₂) = a₁ * (a₂ * (b₁ * b₂)) (if a₁.lt b₁)
    • (a₁ * a₂) * (b₁ * b₂) = b₁ * ((a₁ * a₂) * b₂) (if not a₁.lt b₁)

    no axioms what this means

    Statement uses: Qq.Quoted, Lean.Expr.const, Lean.Name.mkStr1, List.nil, Lean.Level, Mathlib.Tactic.RPowRing.ExProd, Mathlib.Tactic.RPowRing.Result, Qq.Quoted.unsafeMk, Lean.Expr.sort, Lean.Level.succ, Lean.Level.zero, Lean.Expr.app, Lean.Name.mkStr2, List.cons

    Proof uses: Inhabited.default

    1 instances, coercions and auxiliary constants left out.

    partial def evalMul {a b : Q(ℝ)} (va : ExProd a) (vb : ExProd b) : Result ExProd q($a * $b) :=
    …

    Mentions: Mathlib.Tactic.RPowRing.ExProd, Mathlib.Tactic.RPowRing.Result

  21. theorem Mathlib.Tactic.RPowRing.pow_pos line 146 source

    standard axioms: Classical.choice, Quot.sound, propext what this means

    Statement uses: Real, LT.lt, OfNat.ofNat, HMul.hMul, HPow.hPow

    Proof uses: mul_pos, Real.rpow_pos_of_pos

    18 instances, coercions and auxiliary constants left out.

  22. theorem Mathlib.Tactic.RPowRing.pow_pf line 149 source

    standard axioms: Classical.choice, Quot.sound, propext what this means

    Statement uses: Real, LT.lt, OfNat.ofNat, Eq, HPow.hPow, HMul.hMul

    Proof uses: Eq.mpr, id, congrArg, Real.mul_rpow, LT.lt.le, Real.rpow_pos_of_pos, Real.rpow_mul, Eq.refl

    16 instances, coercions and auxiliary constants left out.

    Tactic trace: 2 steps

    Open to load the checked before-and-after goal states.

  23. def Mathlib.Tactic.RPowRing.evalPow line 153 source

    no axioms what this means

    Statement uses: Qq.Quoted, Lean.Expr.const, Lean.Name.mkStr1, List.nil, Lean.Level, Mathlib.Tactic.RPowRing.ExProd, Option, Prod, Lean.Expr.app, Lean.Name.mkStr2, List.cons, Lean.Level.zero, Lean.Expr.lit, Lean.Literal.natVal, Mathlib.Tactic.RPowRing.Result, Qq.Quoted.unsafeMk, Lean.Expr.sort, Lean.Level.succ

    2 instances, coercions and auxiliary constants left out.

  24. theorem Mathlib.Tactic.RPowRing.pow_congr line 163 source

    standard axioms: Classical.choice, Quot.sound, propext what this means

    Statement uses: Real, Eq, HPow.hPow

    Proof uses: Eq.refl, Eq.symm

    5 instances, coercions and auxiliary constants left out.

    Tactic trace: 2 steps

    Open to load the checked before-and-after goal states.

  25. theorem Mathlib.Tactic.RPowRing.inv_congr line 165 source

    standard axioms: Classical.choice, Quot.sound, propext what this means

    Statement uses: Real, Eq, HPow.hPow, Neg.neg, OfNat.ofNat, Inv.inv

    Proof uses: of_eq_true, Eq.trans, True, congrArg, Real.rpow_neg_one, eq_self, Eq.symm

    13 instances, coercions and auxiliary constants left out.

    Tactic trace: 2 steps

    Open to load the checked before-and-after goal states.

  26. theorem Mathlib.Tactic.RPowRing.npow_congr line 168 source

    standard axioms: Classical.choice, Quot.sound, propext what this means

    Statement uses: Real, Nat, Eq, HPow.hPow, NPow.npow

    Proof uses: of_eq_true, Eq.trans, True, congrArg, Real.rpow_natCast, eq_self, Eq.symm

    14 instances, coercions and auxiliary constants left out.

    Tactic trace: 2 steps

    Open to load the checked before-and-after goal states.

  27. def Mathlib.Tactic.RPowRing.eval line 171 source

    standard axioms: Classical.choice, Quot.sound, propext what this means

    Statement uses: Qq.Quoted, Lean.Expr.const, Lean.Name.mkStr1, List.nil, Lean.Level, Mathlib.Tactic.AtomM, Mathlib.Tactic.RPowRing.Result, Mathlib.Tactic.RPowRing.ExProd

    Proof uses: Inhabited.default, Mathlib.Tactic.AtomM.Context, StateRefT', IO.RealWorld, Mathlib.Tactic.AtomM.State, Lean.Meta.MetaM

    5 instances, coercions and auxiliary constants left out.

  28. def Mathlib.Tactic.RPowRing.rewrite line 200 source

    standard axioms: Classical.choice, Quot.sound, propext what this means

    Statement uses: Lean.Expr, optParam, Bool, Bool.true, Mathlib.Tactic.RPowRing.M, Lean.Meta.Simp.Result

    Proof uses: Mathlib.Tactic.RPowRing.Context, Mathlib.Tactic.AtomM.Context, ST.Ref, IO.RealWorld, Mathlib.Tactic.AtomM.State, Lean.Meta.Simp.Simproc, Bind.bind, Lean.Meta.Simp.SimpM, Lean.Meta.Simp.MethodsRef, ReaderT, Lean.Meta.Simp.Context, StateRefT', Lean.Meta.Simp.State, Lean.Meta.MetaM, Except, Lean.Meta.Simp.Step, MonadExcept.tryCatch, Lean.Exception, Lean.Meta.Context, Lean.Meta.State and 71 more

    43 instances, coercions and auxiliary constants left out.

  29. def Mathlib.Tactic.RPowRing.M.run Runs a tactic in the RingNF.M monad, given initial data: * s: a reference to the mutable state of ring, for persisting across calls line 224 source

    Source documentation

    Runs a tactic in the RingNF.M monad, given initial data:

    • s: a reference to the mutable state of ring, for persisting across calls. This ensures that atom ordering is used consistently.
    • cfg: the configuration options
    • x: the tactic to run

    standard axioms: Classical.choice, Quot.sound, propext what this means

    Statement uses: IO.Ref, Mathlib.Tactic.AtomM.State, Mathlib.Tactic.RPowRing.Config, Mathlib.Tactic.RPowRing.M, Lean.Meta.MetaM

    Proof uses: Bind.bind, Lean.Meta.SimpTheorems, List.foldlM, Lean.Name, Lean.Meta.SimpTheorems.addConst, Bool.true, Bool.false, OfNat.ofNat, Nat, Lean.Meta.SimpTheorems.mk, Lean.Meta.DiscrTree.empty, Lean.Meta.SimpTheorem, EmptyCollection.emptyCollection, Lean.PHashSet, Lean.Meta.Origin, Lean.PersistentHashMap.mk, Array, Lean.PersistentHashMap.Node.entries, Lean.PersistentHashMap.mkEmptyEntriesArray, Lean.Elab.Tactic.simpOnlyBuiltins and 87 more

    18 instances, coercions and auxiliary constants left out.

    def M.run {α : Type} (s : IO.Ref AtomM.State) (cfg : RPowRing.Config) (x : M α) : MetaM α := do
    …

    Mentions: Mathlib.Tactic.RPowRing.Config, Mathlib.Tactic.RPowRing.M

  30. def Mathlib.Tactic.RPowRing.rpowRingTarget Use rpow_ring to rewrite the main goal line 241 source

    Source documentation

    Use rpow_ring to rewrite the main goal.

    standard axioms: Classical.choice, Quot.sound, propext what this means

    Statement uses: IO.Ref, Mathlib.Tactic.AtomM.State, Mathlib.Tactic.RPowRing.Config, Lean.Elab.Tactic.TacticM, Unit

    Proof uses: Lean.Elab.Tactic.withMainContext, Bind.bind, Lean.MVarId, Lean.Elab.Tactic.getMainGoal, Lean.Expr, liftM, ReaderT, Lean.Meta.Context, StateRefT', IO.RealWorld, Lean.Meta.State, Lean.Core.CoreM, Lean.Elab.Tactic.Context, Lean.Elab.Tactic.State, Lean.Elab.Term.TermElabM, Lean.Elab.Term.State, Lean.Meta.MetaM, Lean.Elab.Term.Context, Lean.MVarId.getType, Lean.instantiateMVars and 18 more

    9 instances, coercions and auxiliary constants left out.

    def rpowRingTarget (s : IO.Ref AtomM.State) (cfg : Config) : TacticM Unit := withMainContext do
    …

    Mentions: Mathlib.Tactic.RPowRing.Config

  31. def Mathlib.Tactic.RPowRing.rpowRingLocalDecl Use rpow_ring to rewrite hypothesis h line 252 source

    Source documentation

    Use rpow_ring to rewrite hypothesis h.

    standard axioms: Classical.choice, Quot.sound, propext what this means

    Statement uses: IO.Ref, Mathlib.Tactic.AtomM.State, Mathlib.Tactic.RPowRing.Config, Lean.FVarId, Lean.Elab.Tactic.TacticM, Unit

    Proof uses: Lean.Elab.Tactic.withMainContext, Bind.bind, Lean.Expr, liftM, ReaderT, Lean.Meta.Context, StateRefT', IO.RealWorld, Lean.Meta.State, Lean.Core.CoreM, Lean.Elab.Tactic.Context, Lean.Elab.Tactic.State, Lean.Elab.Term.TermElabM, Lean.Elab.Term.State, Lean.Meta.MetaM, Lean.Elab.Term.Context, Lean.FVarId.getType, Lean.instantiateMVars, Lean.MVarId, Lean.Elab.Tactic.getMainGoal and 11 more

    9 instances, coercions and auxiliary constants left out.

    def rpowRingLocalDecl (s : IO.Ref AtomM.State) (cfg : Config) (fvarId : FVarId) :
        TacticM Unit := withMainContext do
    …

    Mentions: Mathlib.Tactic.RPowRing.Config

  32. def Mathlib.Tactic.RPowRing.elabRPowRingConv Elaborator for the rpow_ring tactic line 285 source

    Source documentation

    Elaborator for the rpow_ring tactic.

    standard axioms: Classical.choice, Quot.sound, propext what this means

    Statement uses: Lean.Elab.Tactic.Tactic

    Proof uses: Lean.Syntax, ite, Lean.Elab.Tactic.TacticM, Unit, Eq, Bool, Lean.Syntax.isOfKind, Lean.Name.mkStr4, Bool.true, Lean.Syntax.getArg, OfNat.ofNat, Nat, Option, Lean.TSyntax, List.cons, Lean.SyntaxNodeKind, List.nil, Option.map, Lean.TSyntax.mk, Lean.Syntax.getOptional? and 46 more

    16 instances, coercions and auxiliary constants left out.

    @[tactic rpowRingConv] def elabRPowRingConv : Tactic := fun stx ↦ match stx with
    …
  33. theorem Mathlib.Tactic.RPowRing._root_.Real.pow_neg line 293 source
  34. theorem Mathlib.Tactic.RPowRing._root_.Real.inv_rpow' line 296 source
  35. theorem Mathlib.Tactic.RPowRing._root_.Real.rpow_inv line 299 source
  36. lemma Mathlib.Tactic.RPowRing.fix_cast₁ line 302 source

    standard axioms: Classical.choice, Quot.sound, propext what this means

    Statement uses: Eq, Real, Int.ofNat, OfNat.ofNat, Nat

    Proof uses: Iff.mpr, Int, Int.cast_eq_one, rfl

    20 instances, coercions and auxiliary constants left out.

  37. lemma Mathlib.Tactic.RPowRing.fix_cast₂ line 304 source

    standard axioms: Classical.choice, Quot.sound, propext what this means

    Statement uses: Nat, Eq, Real, Int.ofNat

    Proof uses: rfl

    6 instances, coercions and auxiliary constants left out.

  38. lemma Mathlib.Tactic.RPowRing.fix_cast₃ line 306 source

    standard axioms: Classical.choice, Quot.sound, propext what this means

    Statement uses: Nat, Nat.AtLeastTwo, Eq, Real, OfNat.ofNat

    Proof uses: Eq.refl

    5 instances, coercions and auxiliary constants left out.

    Tactic trace: 1 steps

    Open to load the checked before-and-after goal states.

  39. def Mathlib.Tactic.RPowRing.delab_ofNat line 309 source

    standard axioms: Classical.choice, Quot.sound, propext what this means

    Statement uses: Lean.PrettyPrinter.Delaborator.Delab

    Proof uses: Lean.PrettyPrinter.Delaborator.whenPPOption, Lean.getPPNotation, Lean.PrettyPrinter.Delaborator.SubExpr.withNaryArg, Lean.Syntax.Term, Lean.PrettyPrinter.Delaborator.DelabM, Lean.PrettyPrinter.Delaborator.Context, StateRefT', IO.RealWorld, Lean.PrettyPrinter.Delaborator.State, Lean.Meta.MetaM, OfNat.ofNat, Nat, Lean.PrettyPrinter.Delaborator.delab

    6 instances, coercions and auxiliary constants left out.

    Tactic trace: 1 steps

    Open to load the checked before-and-after goal states.

  40. example Mathlib.Tactic.RPowRing.(example at line 323) line 323 source