Documentation

Init.Omega.Constraint

A Constraint consists of an optional lower and upper bound (inclusive), constraining a value to a set of the form , {x}, [x, y], [x, ∞), (-∞, y], or (-∞, ∞).

@[reducible, inline]

An optional lower bound on a integer.

Instances For
    @[reducible, inline]

    An optional upper bound on a integer.

    Instances For
      @[reducible, inline]

      A lower bound at x is satisfied at t if x ≤ t.

      Instances For
        @[reducible, inline]

        A upper bound at y is satisfied at t if t ≤ y.

        Instances For

          A Constraint consists of an optional lower and upper bound (inclusive), constraining a value to a set of the form , {x}, [x, y], [x, ∞), (-∞, y], or (-∞, ∞).

          Instances For
            @[implicit_reducible]
            Instances For
              @[implicit_reducible]

              A constraint is satisfied at t is both the lower bound and upper bound are satisfied.

              Instances For

                Apply a function to both the lower bound and upper bound.

                Instances For

                  Translate a constraint.

                  Instances For
                    theorem Lean.Omega.Constraint.translate_sat {t : Int} {c : Constraint} {v : Int} :
                    c.sat v = true(c.translate t).sat (v + t) = true

                    Flip a constraint. This operation is not useful by itself, but is used to implement neg and scale.

                    Instances For

                      Negate a constraint. [x, y] becomes [-y, -x].

                      Instances For

                        The trivial constraint, satisfied everywhere.

                        Instances For

                          The impossible constraint, unsatisfiable.

                          Instances For

                            An exact constraint.

                            Instances For
                              @[simp]
                              theorem Lean.Omega.Constraint.exact_sat (r t : Int) :
                              (exact r).sat t = decide (r = t)

                              Check if a constraint is unsatisfiable.

                              Instances For

                                Check if a constraint requires an exact value.

                                Instances For

                                  Scale a constraint by multiplying by an integer.

                                  • If k = 0 this is either impossible, if the original constraint was impossible, or the = 0 exact constraint.
                                  • If k is positive this takes [x, y] to [k * x, k * y]
                                  • If k is negative this takes [x, y] to [k * y, k * x].
                                  Instances For
                                    theorem Lean.Omega.Constraint.scale_sat {t : Int} {c : Constraint} (k : Int) (w : c.sat t = true) :
                                    (scale k c).sat (k * t) = true

                                    The sum of two constraints. [a, b] + [c, d] = [a + c, b + d].

                                    Instances For
                                      theorem Lean.Omega.Constraint.add_sat {c₁ c₂ : Constraint} {x₁ x₂ : Int} (w₁ : c₁.sat x₁ = true) (w₂ : c₂.sat x₂ = true) :
                                      (c₁.add c₂).sat (x₁ + x₂) = true

                                      A linear combination of two constraints.

                                      Instances For
                                        theorem Lean.Omega.Constraint.combo_sat {c₁ c₂ : Constraint} {x₁ x₂ : Int} (a : Int) (w₁ : c₁.sat x₁ = true) (b : Int) (w₂ : c₂.sat x₂ = true) :
                                        (combo a c₁ b c₂).sat (a * x₁ + b * x₂) = true

                                        The conjunction of two constraints.

                                        Instances For
                                          theorem Lean.Omega.Constraint.combine_sat (c c' : Constraint) (t : Int) :
                                          ((c.combine c').sat t = true) = (c.sat t = true c'.sat t = true)

                                          Dividing a constraint by a natural number, and tightened to integer bounds. Thus the lower bound is rounded up, and the upper bound is rounded down.

                                          Instances For
                                            theorem Lean.Omega.Constraint.div_sat (c : Constraint) (t : Int) (k : Nat) (n : k 0) (h : k t) (w : c.sat t = true) :
                                            (c.div k).sat (t / k) = true
                                            @[reducible, inline]

                                            It is convenient below to say that a constraint is satisfied at the dot product of two vectors, so we make an abbreviation sat' for this.

                                            Instances For
                                              theorem Lean.Omega.Constraint.combine_sat' {s t : Constraint} {x y : Coeffs} (ws : s.sat' x y = true) (wt : t.sat' x y = true) :
                                              (s.combine t).sat' x y = true
                                              theorem Lean.Omega.Constraint.div_sat' {c : Constraint} {x y : Coeffs} (h : x.gcd 0) (w : c.sat (x.dot y) = true) :
                                              (c.div x.gcd).sat' (x.sdiv x.gcd) y = true
                                              theorem Lean.Omega.Constraint.addInequality_sat {c : Int} {x y : Coeffs} (w : c + x.dot y 0) :
                                              { lowerBound := some (-c), upperBound := none }.sat' x y = true
                                              theorem Lean.Omega.Constraint.addEquality_sat {c : Int} {x y : Coeffs} (w : c + x.dot y = 0) :
                                              { lowerBound := some (-c), upperBound := some (-c) }.sat' x y = true

                                              Normalize a constraint, by dividing through by the GCD.

                                              Return none if there is nothing to do, to avoid adding unnecessary steps to the proof term.

                                              Instances For

                                                Normalize a constraint, by dividing through by the GCD.

                                                Instances For
                                                  @[reducible, inline]

                                                  Shorthand for the first component of normalize.

                                                  Instances For
                                                    @[reducible, inline]
                                                    noncomputable abbrev Lean.Omega.normalizeCoeffs (s : Constraint) (x : Coeffs) :

                                                    Shorthand for the second component of normalize.

                                                    Instances For

                                                      Multiply by -1 if the leading coefficient is negative, otherwise return none.

                                                      Instances For

                                                        Multiply by -1 if the leading coefficient is negative, otherwise do nothing.

                                                        Instances For
                                                          @[reducible, inline]

                                                          Shorthand for the first component of positivize.

                                                          Instances For
                                                            @[reducible, inline]
                                                            noncomputable abbrev Lean.Omega.positivizeCoeffs (s : Constraint) (x : Coeffs) :

                                                            Shorthand for the second component of positivize.

                                                            Instances For

                                                              positivize and normalize, returning none if neither does anything.

                                                              Instances For
                                                                @[reducible, inline]

                                                                Shorthand for the first component of tidy.

                                                                Instances For
                                                                  @[reducible, inline]

                                                                  Shorthand for the second component of tidy.

                                                                  Instances For
                                                                    theorem Lean.Omega.tidy_sat {s : Constraint} {x v : Coeffs} (w : s.sat' x v = true) :
                                                                    theorem Lean.Omega.combo_sat' (s t : Constraint) (a : Int) (x : Coeffs) (b : Int) (y v : Coeffs) (wx : s.sat' x v = true) (wy : t.sat' y v = true) :
                                                                    (Constraint.combo a s b t).sat' (Coeffs.combo a x b y) v = true
                                                                    @[reducible, inline]
                                                                    abbrev Lean.Omega.bmod_div_term (m : Nat) (a b : Coeffs) :

                                                                    The value of the new variable introduced when solving a hard equality.

                                                                    Instances For

                                                                      The coefficients of the new equation generated when solving a hard equality.

                                                                      Instances For
                                                                        theorem Lean.Omega.bmod_sat (m : Nat) (r : Int) (i : Nat) (x v : Coeffs) (h : x.length i) (p : v.get i = bmod_div_term m x v) (w : (Constraint.exact r).sat' x v = true) :