mirror of
https://github.com/leanprover/lean4.git
synced 2026-03-17 18:34:06 +00:00
This PR sets up the new integrated test/bench suite. It then migrates all benchmarks and some related tests to the new suite. There's also some documentation and some linting. For now, a lot of the old tests are left alone so this PR doesn't become even larger than it already is. Eventually, all tests should be migrated to the new suite though so there isn't a confusing mix of two systems.
390 lines
13 KiB
Lean4
390 lines
13 KiB
Lean4
variable (p q : Prop)
|
||
variable (b c d : Bool)
|
||
variable (u v w : Prop) [Decidable u] [Decidable v] [Decidable w]
|
||
|
||
-- Specific regressions found when introducing Boolean normalization
|
||
#check_simp (b != !c) = false ~> b ≠ c
|
||
#check_simp ¬(u → v ∨ w) ~> u ∧ ¬v ∧ ¬w
|
||
#check_simp decide (u ∧ (v → False)) ~> decide u && !decide v
|
||
#check_simp decide (cond true b c = true) ~> b
|
||
#check_simp decide (ite u b c = true) ~> ite u b c
|
||
#check_simp true ≠ (b || c) ~> b = false ∧ c = false
|
||
#check_simp ¬((!b = false) ∧ (c = false)) ~> b = true → c = true
|
||
#check_simp (((!b) && c) ≠ false) ~> b = false ∧ c = true
|
||
#check_simp (cond b false c ≠ false) ~> b = false ∧ c
|
||
#check_simp (b && c) = false ~> b → c = false
|
||
#check_simp (b && c) ≠ false ~> b ∧ c
|
||
#check_simp decide (u → False) ~> !decide u
|
||
#check_simp decide (¬u) ~> !decide u
|
||
#check_simp (b = true) ≠ (c = false) ~> b = c
|
||
#check_simp (b != c) != (false != d) ~> b != (c != d)
|
||
#check_simp (b == false) ≠ (c != d) ~> b = (c != d)
|
||
#check_simp (b = true) ≠ (c = false) ~> b = c
|
||
#check_simp ¬b = !c ~> b = c
|
||
#check_simp (b == c) = false ~> ¬(b = c)
|
||
#check_simp (true ≠ if u then b else c) ~> (if u then b = false else c = false)
|
||
#check_simp (u ∧ v → False) ~> u → v → False
|
||
#check_simp (u = (v ≠ w)) ~> (u ↔ ¬(v ↔ w))
|
||
#check_simp ((b = false) = (c = false)) ~> b = c
|
||
#check_simp True ≠ (c = false) ~> c = true
|
||
#check_simp u ∧ u ∧ v ~> u ∧ v
|
||
#check_simp b || (b || c) ~> b || c
|
||
#check_simp ((b ≠ c) : Bool) ~> !(decide (b = c))
|
||
#check_simp ((u ≠ v) : Bool) ~> !((u : Bool) == (v : Bool))
|
||
#check_simp decide (u → False) ~> !(decide u)
|
||
#check_simp decide (¬u) ~> !u
|
||
-- Specific regressions done
|
||
|
||
-- Round trip isomorphisms
|
||
#check_simp (decide (b : Prop)) ~> b
|
||
#check_simp ((u : Bool) : Prop) ~> u
|
||
|
||
/- # not -/
|
||
|
||
variable [Decidable u]
|
||
|
||
-- Ground
|
||
#check_simp (¬True) ~> False
|
||
#check_simp (¬true) ~> False
|
||
#check_simp (!True) ~> false
|
||
#check_simp (!true) ~> false
|
||
|
||
#check_simp (¬False) ~> True
|
||
#check_simp (!False) ~> true
|
||
#check_simp (¬false) ~> True
|
||
#check_simp (!false) ~> true
|
||
|
||
/- # Coercions and not -/
|
||
|
||
#check_simp ¬p !~>
|
||
#check_simp !b !~>
|
||
|
||
#check_simp (¬u : Prop) !~>
|
||
#check_simp (¬u : Bool) ~> !u
|
||
#check_simp (!u : Prop) ~> ¬u
|
||
#check_simp (!u : Bool) !~>
|
||
#check_simp (¬b : Prop) ~> b = false
|
||
#check_simp (¬b : Bool) ~> !b
|
||
#check_simp (!b : Prop) ~> b = false
|
||
#check_simp (!b : Bool) !~>
|
||
|
||
#check_simp (¬¬u) ~> u
|
||
|
||
/- # and -/
|
||
|
||
-- Validate coercions
|
||
#check_simp (u ∧ v : Prop) !~>
|
||
#check_simp (u ∧ v : Bool) ~> u && v
|
||
#check_simp (u && v : Prop) ~> u ∧ v
|
||
#check_simp (u && v : Bool) !~>
|
||
#check_simp (b ∧ c : Prop) !~>
|
||
#check_simp (b ∧ c : Bool) ~> b && c
|
||
#check_simp (b && c : Prop) ~> b ∧ c
|
||
#check_simp (b && c : Bool) !~>
|
||
|
||
-- Partial evaluation
|
||
#check_simp (True ∧ v : Prop) ~> v
|
||
#check_simp (True ∧ v : Bool) ~> (v : Bool)
|
||
#check_simp (True && v : Prop) ~> v
|
||
#check_simp (True && v : Bool) ~> (v : Bool)
|
||
#check_simp (true ∧ c : Prop) ~> (c : Prop)
|
||
#check_simp (true ∧ c : Bool) ~> c
|
||
#check_simp (true && c : Prop) ~> (c : Prop)
|
||
#check_simp (true && c : Bool) ~> c
|
||
|
||
#check_simp (u ∧ True : Prop) ~> u
|
||
#check_simp (u ∧ True : Bool) ~> (u : Bool)
|
||
#check_simp (u && True : Prop) ~> u
|
||
#check_simp (u && True : Bool) ~> (u : Bool)
|
||
#check_simp (b ∧ true : Prop) ~> (b : Prop)
|
||
#check_simp (b ∧ true : Bool) ~> b
|
||
#check_simp (b && true : Prop) ~> (b : Prop)
|
||
#check_simp (b && true : Bool) ~> b
|
||
|
||
#check_simp (False ∧ v : Prop) ~> False
|
||
#check_simp (False ∧ v : Bool) ~> false
|
||
#check_simp (False && v : Prop) ~> False
|
||
#check_simp (False && v : Bool) ~> false
|
||
#check_simp (false ∧ c : Prop) ~> False
|
||
#check_simp (false ∧ c : Bool) ~> false
|
||
#check_simp (false && c : Prop) ~> False
|
||
#check_simp (false && c : Bool) ~> false
|
||
|
||
#check_simp (u ∧ False : Prop) ~> False
|
||
#check_simp (u ∧ False : Bool) ~> false
|
||
#check_simp (u && False : Prop) ~> False
|
||
#check_simp (u && False : Bool) ~> false
|
||
#check_simp (b ∧ false : Prop) ~> False
|
||
#check_simp (b ∧ false : Bool) ~> false
|
||
#check_simp (b && false : Prop) ~> False
|
||
#check_simp (b && false : Bool) ~> false
|
||
|
||
-- Idempotence
|
||
#check_simp (u ∧ u) ~> u
|
||
#check_simp (u && u) ~> (u : Bool)
|
||
#check_simp (b ∧ b) ~> (b : Prop)
|
||
#check_simp (b && b) ~> b
|
||
|
||
-- Cancellation
|
||
#check_simp (u ∧ ¬u) ~> False
|
||
#check_simp (¬u ∧ u) ~> False
|
||
#check_simp (b && ¬b) ~> false
|
||
#check_simp (¬b && b) ~> false
|
||
|
||
-- Check we swap operators, but do apply deMorgan etc
|
||
#check_simp ¬(u ∧ v) ~> u → ¬v
|
||
#check_simp decide (¬(u ∧ v)) ~> !u || !v
|
||
#check_simp !(u ∧ v) ~> !u || !v
|
||
#check_simp ¬(b ∧ c) ~> b → c = false
|
||
#check_simp !(b ∧ c) ~> !b || !c
|
||
#check_simp ¬(u && v) ~> u → ¬ v
|
||
#check_simp ¬(b && c) ~> b = true → c = false
|
||
#check_simp !(u && v) ~> !u || !v
|
||
#check_simp !(b && c) ~> !b || !c
|
||
#check_simp ¬u ∧ ¬v !~>
|
||
#check_simp ¬b ∧ ¬c ~> ((b = false) ∧ (c = false))
|
||
#check_simp ¬u && ¬v ~> (!u && !v)
|
||
#check_simp ¬b && ¬c ~> (!b && !c)
|
||
|
||
-- Some ternary test cases
|
||
#check_simp (u ∧ (v ∧ w) : Prop) !~>
|
||
#check_simp (u ∧ (v ∧ w) : Bool) ~> (u && (v && w))
|
||
#check_simp ((u ∧ v) ∧ w : Prop) !~>
|
||
#check_simp ((u ∧ v) ∧ w : Bool) ~> ((u && v) && w)
|
||
#check_simp (b && (c && d) : Prop) ~> (b ∧ c ∧ d)
|
||
#check_simp (b && (c && d) : Bool) !~>
|
||
#check_simp ((b && c) && d : Prop) ~> ((b ∧ c) ∧ d)
|
||
#check_simp ((b && c) && d : Bool) !~>
|
||
|
||
/- # or -/
|
||
|
||
-- Validate coercions
|
||
#check_simp p ∨ q !~>
|
||
#check_simp q ∨ p !~>
|
||
#check_simp (u ∨ v : Prop) !~>
|
||
#check_simp (u ∨ v : Bool) ~> u || v
|
||
#check_simp (u || v : Prop) ~> u ∨ v
|
||
#check_simp (u || v : Bool) !~>
|
||
#check_simp (b ∨ c : Prop) !~>
|
||
#check_simp (b ∨ c : Bool) ~> b || c
|
||
#check_simp (b || c : Prop) ~> b ∨ c
|
||
#check_simp (b || c : Bool) !~>
|
||
|
||
-- Partial evaluation
|
||
#check_simp (True ∨ v : Prop) ~> True
|
||
#check_simp (True ∨ v : Bool) ~> true
|
||
#check_simp (True || v : Prop) ~> True
|
||
#check_simp (True || v : Bool) ~> true
|
||
#check_simp (true ∨ c : Prop) ~> True
|
||
#check_simp (true ∨ c : Bool) ~> true
|
||
#check_simp (true || c : Prop) ~> True
|
||
#check_simp (true || c : Bool) ~> true
|
||
|
||
#check_simp (u ∨ True : Prop) ~> True
|
||
#check_simp (u ∨ True : Bool) ~> true
|
||
#check_simp (u || True : Prop) ~> True
|
||
#check_simp (u || True : Bool) ~> true
|
||
#check_simp (b ∨ true : Prop) ~> True
|
||
#check_simp (b ∨ true : Bool) ~> true
|
||
#check_simp (b || true : Prop) ~> True
|
||
#check_simp (b || true : Bool) ~> true
|
||
|
||
#check_simp (False ∨ v : Prop) ~> v
|
||
#check_simp (False ∨ v : Bool) ~> (v : Bool)
|
||
#check_simp (False || v : Prop) ~> v
|
||
#check_simp (False || v : Bool) ~> (v : Bool)
|
||
#check_simp (false ∨ c : Prop) ~> (c : Prop)
|
||
#check_simp (false ∨ c : Bool) ~> c
|
||
#check_simp (false || c : Prop) ~> (c : Prop)
|
||
#check_simp (false || c : Bool) ~> c
|
||
|
||
#check_simp (u ∨ False : Prop) ~> u
|
||
#check_simp (u ∨ False : Bool) ~> (u : Bool)
|
||
#check_simp (u || False : Prop) ~> u
|
||
#check_simp (u || False : Bool) ~> (u : Bool)
|
||
#check_simp (b ∨ false : Prop) ~> (b : Prop)
|
||
#check_simp (b ∨ false : Bool) ~> b
|
||
#check_simp (b || false : Prop) ~> (b : Prop)
|
||
#check_simp (b || false : Bool) ~> b
|
||
|
||
-- Idempotence
|
||
#check_simp (u ∨ u) ~> u
|
||
#check_simp (u || u) ~> (u : Bool)
|
||
#check_simp (b ∨ b) ~> (b : Prop)
|
||
#check_simp (b || b) ~> b
|
||
|
||
-- Complement
|
||
-- Note. We may want to revisit this.
|
||
-- Decidable excluded middle currently does not simplify.
|
||
#check_simp ( u ∨ ¬u) !~>
|
||
#check_simp (¬u ∨ u) !~>
|
||
#check_simp ( b || ¬b) ~> true
|
||
#check_simp (¬b || b) ~> true
|
||
|
||
-- Check we swap operators, but do apply deMorgan etc
|
||
#check_simp ¬(u ∨ v) ~> ¬u ∧ ¬v
|
||
#check_simp !(u ∨ v) ~> !u && !v
|
||
#check_simp ¬(b ∨ c) ~> b = false ∧ c =false
|
||
#check_simp !(b ∨ c) ~> !b && !c
|
||
#check_simp ¬(u || v) ~> ¬u ∧ ¬v
|
||
#check_simp ¬(b || c) ~> b = false ∧ c = false
|
||
#check_simp !(u || v) ~> !u && !v
|
||
#check_simp !(b || c) ~> !b && !c
|
||
#check_simp ¬u ∨ ¬v !~>
|
||
#check_simp (¬b) ∨ (¬c) ~> b = false ∨ c = false
|
||
#check_simp ¬u || ¬v ~> (!u || !v)
|
||
#check_simp ¬b || ¬c ~> (!b || !c)
|
||
|
||
-- Some ternary test cases
|
||
#check_simp (u ∨ (v ∨ w) : Prop) !~>
|
||
#check_simp (u ∨ (v ∨ w) : Bool) ~> (u || (v || w))
|
||
#check_simp ((u ∨ v) ∨ w : Prop) !~>
|
||
#check_simp ((u ∨ v) ∨ w : Bool) ~> ((u || v) || w)
|
||
#check_simp (b || (c || d) : Prop) ~> (b ∨ c ∨ d)
|
||
#check_simp (b || (c || d) : Bool) !~>
|
||
#check_simp ((b || c) || d : Prop) ~> ((b ∨ c) ∨ d)
|
||
#check_simp ((b || c) || d : Bool) !~>
|
||
|
||
/- # and/or -/
|
||
|
||
-- We don't currently do automatic simplification across and/or/not
|
||
-- This tests for non-unexpected reductions.
|
||
|
||
#check_simp p ∧ (p ∨ q) !~>
|
||
#check_simp (p ∨ q) ∧ p !~>
|
||
|
||
#check_simp u ∧ (v ∨ w) !~>
|
||
#check_simp u ∨ (v ∧ w) !~>
|
||
#check_simp (v ∨ w) ∧ u !~>
|
||
#check_simp (v ∧ w) ∨ u !~>
|
||
#check_simp b && (c || d) !~>
|
||
#check_simp b || (c && d) !~>
|
||
#check_simp (c || d) && b !~>
|
||
#check_simp (c && d) || b !~>
|
||
|
||
/- # implication -/
|
||
|
||
#check_simp (b → c) !~>
|
||
#check_simp (u → v) !~>
|
||
#check_simp p → q !~>
|
||
#check_simp decide (u → ¬v) ~> !u || !v
|
||
|
||
/- # iff -/
|
||
|
||
#check_simp (u = v : Prop) ~> u ↔ v
|
||
#check_simp (u = v : Bool) ~> u == v
|
||
#check_simp (u ↔ v : Prop) !~>
|
||
#check_simp (u ↔ v : Bool) ~> u == v
|
||
#check_simp (u == v : Prop) ~> u ↔ v
|
||
#check_simp (u == v : Bool) !~>
|
||
|
||
#check_simp (b = c : Prop) !~>
|
||
#check_simp (b = c : Bool) !~>
|
||
#check_simp (b ↔ c : Prop) ~> b = c
|
||
#check_simp (b ↔ c : Bool) ~> decide (b = c)
|
||
#check_simp (b == c : Prop) ~> b = c
|
||
#check_simp (b == c : Bool) !~>
|
||
|
||
-- Partial evaluation
|
||
#check_simp (True = v : Prop) ~> v
|
||
#check_simp (True = v : Bool) ~> (v : Bool)
|
||
#check_simp (True ↔ v : Prop) ~> v
|
||
#check_simp (True ↔ v : Bool) ~> (v : Bool)
|
||
#check_simp (True == v : Prop) ~> v
|
||
#check_simp (True == v : Bool) ~> (v : Bool)
|
||
#check_simp (true = c : Prop) ~> c = true
|
||
#check_simp (true = c : Bool) ~> c
|
||
#check_simp (true ↔ c : Prop) ~> c = true
|
||
#check_simp (true ↔ c : Bool) ~> c
|
||
#check_simp (true == c : Prop) ~> (c : Prop)
|
||
#check_simp (true == c : Bool) ~> c
|
||
|
||
#check_simp (v = True : Prop) ~> v
|
||
#check_simp (v = True : Bool) ~> (v : Bool)
|
||
#check_simp (v ↔ True : Prop) ~> v
|
||
#check_simp (v ↔ True : Bool) ~> (v : Bool)
|
||
#check_simp (v == True : Prop) ~> v
|
||
#check_simp (v == True : Bool) ~> (v : Bool)
|
||
#check_simp (c = true : Prop) !~>
|
||
#check_simp (c = true : Bool) ~> c
|
||
#check_simp (c ↔ true : Prop) ~> c = true
|
||
#check_simp (c ↔ true : Bool) ~> c
|
||
#check_simp (c == true : Prop) ~> c = true
|
||
#check_simp (c == true : Bool) ~> c
|
||
|
||
#check_simp (True = v : Prop) ~> v
|
||
#check_simp (True = v : Bool) ~> (v : Bool)
|
||
#check_simp (True ↔ v : Prop) ~> v
|
||
#check_simp (True ↔ v : Bool) ~> (v : Bool)
|
||
#check_simp (True == v : Prop) ~> v
|
||
#check_simp (True == v : Bool) ~> (v : Bool)
|
||
#check_simp (true = c : Prop) ~> c = true
|
||
#check_simp (true = c : Bool) ~> c
|
||
#check_simp (true ↔ c : Prop) ~> c = true
|
||
#check_simp (true ↔ c : Bool) ~> c
|
||
#check_simp (true == c : Prop) ~> (c : Prop)
|
||
#check_simp (true == c : Bool) ~> c
|
||
|
||
#check_simp (v = False : Prop) ~> ¬v
|
||
#check_simp (v = False : Bool) ~> !v
|
||
#check_simp (v ↔ False : Prop) ~> ¬v
|
||
#check_simp (v ↔ False : Bool) ~> !v
|
||
#check_simp (v == False : Prop) ~> ¬v
|
||
#check_simp (v == False : Bool) ~> !v
|
||
#check_simp (c = false : Prop) !~>
|
||
#check_simp (c = false : Bool) ~> !c
|
||
#check_simp (c ↔ false : Prop) ~> c = false
|
||
#check_simp (c ↔ false : Bool) ~> !c
|
||
#check_simp (c == false : Prop) ~> c = false
|
||
#check_simp (c == false : Bool) ~> !c
|
||
|
||
#check_simp (False = v : Prop) ~> ¬v
|
||
#check_simp (False = v : Bool) ~> !v
|
||
#check_simp (False ↔ v : Prop) ~> ¬v
|
||
#check_simp (False ↔ v : Bool) ~> !v
|
||
#check_simp (False == v : Prop) ~> ¬v
|
||
#check_simp (False == v : Bool) ~> !v
|
||
#check_simp (false = c : Prop) ~> c = false
|
||
#check_simp (false = c : Bool) ~> !c
|
||
#check_simp (false ↔ c : Prop) ~> c = false
|
||
#check_simp (false ↔ c : Bool) ~> !c
|
||
#check_simp (false == c : Prop) ~> c = false
|
||
#check_simp (false == c : Bool) ~> !c
|
||
|
||
-- Ternary (expand these)
|
||
|
||
#check_simp (u == (v = w)) ~> u == (v == w)
|
||
#check_simp (u == (v == w)) !~>
|
||
|
||
/- # bne -/
|
||
|
||
#check_simp p ≠ q ~> ¬(p ↔ q)
|
||
#check_simp (b != c : Bool) !~>
|
||
#check_simp ¬(p = q) ~> ¬(p ↔ q)
|
||
#check_simp b ≠ c ~> b ≠ c
|
||
#check_simp ¬(b = c) !~>
|
||
#check_simp ¬(b ↔ c) ~> ¬(b = c)
|
||
#check_simp (b != c : Prop) ~> b ≠ c
|
||
#check_simp u ≠ v ~> ¬(u ↔ v)
|
||
#check_simp ¬(u = v) ~> ¬(u ↔ v)
|
||
#check_simp ¬(u ↔ v) !~>
|
||
#check_simp ((u:Bool) != v : Bool) !~>
|
||
#check_simp ((u:Bool) != v : Prop) ~> ¬(u ↔ v)
|
||
|
||
/- # equality and and/or interactions -/
|
||
|
||
#check_simp (u == (v ∨ w)) ~> u == (v || w)
|
||
#check_simp (u == (v || w)) !~>
|
||
#check_simp ((u ∧ v) == w) ~> (u && v) == w
|
||
|
||
/- # ite/cond -/
|
||
|
||
#check_simp if b then c else d !~>
|
||
#check_simp if b then p else q !~>
|
||
#check_simp if u then p else q !~>
|
||
#check_simp if u then b else c !~>
|
||
#check_simp if u then u else q ~> ¬u → q
|
||
#check_simp if u then q else u ~> u ∧ q
|
||
#check_simp if u then q else q ~> q
|
||
#check_simp cond b c d !~>
|