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 semirings.

          Instances For
            Equations
            • One or more equations did not get rendered due to their size.
            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

                        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