Documentation

Lean.Meta.Tactic.Grind.Arith.CommRing.Types

Instances For
    Equations
    Instances For

      A polynomial equipped with a chain of rewrite steps that justifies its equality to the original input. From an input polynomial p, we use equations (i.e., EqCnstr) as rewriting rules. For example, consider the following sequence of rewrites for the input polynomial x^2 + x*y using the equations x - 1 = 0 (c₁) and y - 2 = 0 (c₂).

      2*x^2 + x*y                  | s₁ := .input (2*x^2 + x*y)
      =           - 2*x*(x - 1)
      (2*x + x*y)                  | s₂ := .step (2*x + x*y)  1 s₁ (-2) x c₁
      =           - 2*1*(x - 1)
      (x*y + 2)                    | s₃ := .step (x*y + 2) 1 s₂ (-2) 1 c₁
      =           - 1*y*(x - 1)
      (y + 2)                      | s₄ := .step (y+2) 1 s₃ (-1) y c₁
      =           - 1*1*(y - 2)
      4                            | s₅ := .step 4 1 s₄ 1 1 c₂
      

      From the chain above, we build the certificate

      (-2*x - y - 2)*(x-1) + (-1)*(y-2)
      

      for

      4 = (2*x^2 + x*y)
      

      because x-1 = 0 and y-2=0

      • input (p : Poly) : PolyDerivation
      • step (p : Poly) (k₁ : Int) (d : PolyDerivation) (k₂ : Int) (m₂ : Mon) (c : EqCnstr) : PolyDerivation
        p = k₁*d.getPoly + k₂*m₂*c.p
        

        The coefficient k₁ is used because the leading monomial in c may not be monic. Thus, if we follow the chain back to the input polynomial, we have that p = C * input_p for a C that is equal to the product of all k₁s in the chain. We have that C ≠ 1 only if the ring does not implement NoNatZeroDivisors. Here is a small example where we simplify x+y using the equations 2*x - 1 = 0 (c₁), 3*y - 1 = 0 (c₂), and 6*z + 5 = 0 (c₃)

        x + y + z            | s₁ := .input (x + y + z)
        *2
        =   - 1*1*(2*x - 1)
        2*y + 2*z + 1        | s₂ := .step (2*y + 2*z + 1) 2 s₁ (-1) 1 c₁
        *3
        =   - 2*1*(3*y - 1)
        6*z + 5              | s₃ := .step (6*z + 5) 3 s₂ (-2) 1 c₂
        =   - 1*1*(6*z + 5)
        0                    | s₄ := .step (0) 1 s₃ (-1) 1 c₃
        

        For this chain, we build the certificate

        (-3)*(2*x - 1) + (-2)*(3*y - 1) + (-1)*(6*z + 5)
        

        for

        0 = 6*(x + y + z)
        

        Recall that if the ring implement NoNatZeroDivisors, then the following property holds:

        ∀ (k : Int) (a : α), k ≠ 0 → (intCast k) * a = 0 → a = 0
        

        grind can deduce that x+y+z = 0

      • normEq0 (p : Poly) (d : PolyDerivation) (c : EqCnstr) : PolyDerivation

        Given c.p == .num k

        p = d.getPoly.normEq0 k
        
      Instances For

        A disequality lhsrhs asserted by the core.

        Instances For

          Shared state for non-commutative and commutative rings.

          Instances For
            Equations
            • One or more equations did not get rendered due to their size.
            Instances For

              State for each CommRing processed by this module.

              Instances For
                Equations
                • One or more equations did not get rendered due to their size.
                Instances For

                  State for each CommSemiring processed by this module. Recall that CommSemiring are processed using the envelop OfCommSemiring.Q

                  Instances For
                    Equations
                    • One or more equations did not get rendered due to their size.
                    Instances For

                      State for all CommRing types detected by grind.

                      Instances For
                        Equations
                        • One or more equations did not get rendered due to their size.
                        Instances For