lean4-htt/tests/lean/run/grind_linarith_1.lean
Kim Morrison 6970d77ae4
feat: the grothendieck envelope of an ordered semiring is an ordered ring (#8959)
This PR add instances showing that the Grothendieck (i.e. additive)
envelope of a semiring is an ordered ring if the original semiring is
ordered (and satisfies ExistsAddOfLE), and in this case the embedding is
monotone.
2025-06-24 03:23:18 +00:00

166 lines
5.4 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

open Lean.Grind
set_option grind.debug true
example [IntModule α] [Preorder α] [OrderedAdd α] (a b : α)
: (2:Int)*a + b < b + a + a → False := by
grind
example [IntModule α] [LinearOrder α] [OrderedAdd α] (a b : α)
: (2:Int)*a + b < b + a + a → False := by
grind
example [IntModule α] [Preorder α] [OrderedAdd α] (a b : α)
: (2:Int)*a + b < b + a + a → False := by
fail_if_success grind -linarith
grind
example [IntModule α] [LinearOrder α] [OrderedAdd α] (a b : α)
: (2:Int)*a + b ≥ b + a + a := by
grind
#guard_msgs (drop error) in
example [IntModule α] [Preorder α] [OrderedAdd α] (a b : α)
: (2:Int)*a + b ≥ b + a + a := by
fail_if_success grind
example [CommRing α] [Preorder α] [OrderedRing α] (a b : α)
: 2*a + b < b + a + a → False := by
grind
example [CommRing α] [Preorder α] [OrderedRing α] (a b : α)
: 2 + 2*a + b + 1 < b + a + a + 3 → False := by
grind
example [CommRing α] [LinearOrder α] [OrderedRing α] (a b : α)
: 2 + 2*a + b + 1 <= b + a + a + 3 := by
grind
example [IntModule α] [Preorder α] [OrderedAdd α] (a b c : α)
: a < b → b < c → c < a → False := by
grind
example [IntModule α] [LinearOrder α] [OrderedAdd α] (a b c : α)
: a < b → b < c → a < c := by
grind
example [IntModule α] [LinearOrder α] [OrderedAdd α] (a b c : α)
: a < b → b ≤ c → a < c := by
grind
example [IntModule α] [LinearOrder α] [OrderedAdd α] (a b c : α)
: a ≤ b → b ≤ c → a ≤ c := by
grind
example [IntModule α] [LinearOrder α] [OrderedAdd α] (a b c d : α)
: a < b → b < c + d → a - d < c := by
grind
example [CommRing α] [LinearOrder α] [OrderedRing α] (a b c d : α)
: a < b → b < c + d → a - d < c := by
grind
example [CommRing α] [Preorder α] [OrderedRing α] (a b c : α)
: a < b → 2*b < c → c < 2*a → False := by
grind
-- Test misconfigured instances
/--
trace: [grind.issues] type has a `Preorder` and is a `Semiring`, but is not an ordered ring, failed to synthesize
OrderedRing α
-/
#guard_msgs (drop error, trace) in
set_option trace.grind.issues true in
example [CommRing α] [Preorder α] [OrderedAdd α] (a b c : α)
: a < b → b + b < c → c < a → False := by
grind
example [CommRing α] [Preorder α] [OrderedRing α] (a b : α)
: a < 2 → b < a → b > 5 → False := by
grind
example [CommRing α] [Preorder α] [OrderedRing α] (a b : α)
: a < One.one + 4 → b < a → b ≥ 5 → False := by
grind
example [CommRing α] [Preorder α] [OrderedRing α] (a b : α)
: a < One.one + 5 → b < a → b ≥ 5 → False := by
fail_if_success grind
sorry
example [IntModule α] [Preorder α] [OrderedAdd α] (a b c d : α)
: a < c → b = a + d → b - d > c → False := by
grind
example [IntModule α] [Preorder α] [OrderedAdd α] (a b c d : α)
: a + d < c → b = a + (2:Int)*d → b - d > c → False := by
grind
example [CommRing α] [Preorder α] [OrderedRing α] (a b : α)
: a < 2 → b = a → b > 5 → False := by
grind
example [CommRing α] [Preorder α] [OrderedRing α] (a b : α)
: a < 2 → a = b + b → b > 5 → False := by
grind
example [CommRing α] [LinearOrder α] [OrderedRing α] (a b : α)
: a < 2 → a = b + b → b < 1 := by
grind
example [CommRing α] [LinearOrder α] [OrderedRing α] (a b : α)
: a ≤ 2 → a + b = 3*b → b ≤ 1 := by
grind
example [CommRing α] [LinearOrder α] [OrderedRing α] (a b c d e : α) :
2*a + b ≥ 1 → b ≥ 0 → c ≥ 0 → d ≥ 0 → e ≥ 0
→ a ≥ 3*c → c ≥ 6*e → d - e*5 ≥ 0
→ a + b + 3*c + d + 2*e ≥ 0 := by
grind
example [CommRing α] [Preorder α] [OrderedRing α] (a b c d e : α) :
2*a + b ≥ 1 → b ≥ 0 → c ≥ 0 → d ≥ 0 → e ≥ 0
→ a ≥ 3*c → c ≥ 6*e → d - e*5 ≥ 0
→ a + b + 3*c + d + 2*e < 0 → False := by
grind
example [CommRing α] [Preorder α] [OrderedRing α] (a b : α)
: a = 0 → b = 1 → a + b > 2 → False := by
grind
example [CommRing α] [LinearOrder α] [OrderedRing α] (a b c : α)
: a = 0 → a + b > 2 → b = c → 1 = c → False := by
grind
example [CommRing α] [LinearOrder α] [OrderedRing α] (a b : α)
: a = 0 → b = 1 → a + b ≤ 2 := by
grind
example [CommRing α] [LinearOrder α] [OrderedRing α] (a b : α)
: a*b + b*a > 1 → a*b > 0 := by
grind
example [CommRing α] [LinearOrder α] [OrderedRing α] (a b c : α)
: a*b + c > 1 → c = b*a → a*b > 0 := by
grind
-- It must not internalize subterms `b + c + d` and `b + b + d`
#guard_msgs (trace) in
set_option trace.grind.linarith.internalize true
example [CommRing α] [LinearOrder α] [OrderedRing α] (a b c d : α)
: a < b + c + d → c = b → a < b + b + d := by
grind
/--
trace: [grind.linarith.assert] -3 * y + 2 * x + One.one ≤ 0
[grind.linarith.assert] 2 * z + -4 * x + One.one ≤ 0
[grind.linarith.assert] -1 * z + 3 * y + One.one ≤ 0
[grind.linarith.assert] 6 * y + -4 * x + 3 * One.one ≤ 0
[grind.linarith.assert] 15 * One.one ≤ 0
[grind.linarith.assert] Zero.zero < 0
-/
#guard_msgs (trace) in
set_option trace.grind.cutsat.assert true in -- cutsat should **not** process the following constraints
set_option trace.grind.linarith.assert true in -- linarith should take over
set_option trace.grind.linarith.assert.store false in
example (x y z : Int) (h1 : 2 * x < 3 * y) (h2 : -4 * x + 2 * z < 0) : ¬ 12*y - 4* z < 0 := by
grind -cutsat