lean4-htt/tests/elab/sym_simp_2.lean
Garmelon 08eb78a5b2
chore: switch to new test/bench suite (#12590)
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.
2026-02-25 13:51:53 +00:00

194 lines
6.5 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.

import Lean
open Lean Meta Elab Tactic
elab "sym_simp" : tactic => do
let methods : Sym.Simp.Methods := { post := Sym.Simp.evalGround }
liftMetaTactic1 fun mvarId => Sym.SymM.run do
let mvarId ← Sym.preprocessMVar mvarId
(← Sym.simpGoal mvarId methods).toOption
-- Basic arithmetic: Nat
example : 2 + 3 = 5 := by sym_simp
example : 10 - 3 = 7 := by sym_simp
example : 4 * 5 = 20 := by sym_simp
example : 20 / 4 = 5 := by sym_simp
example : 17 % 5 = 2 := by sym_simp
example : 2 ^ 10 = 1024 := by sym_simp
example : Nat.succ 5 = 6 := by sym_simp
example : Nat.gcd 12 18 = 6 := by sym_simp
-- Basic arithmetic: Int
example : (2 : Int) + 3 = 5 := by sym_simp
example : (10 : Int) - 15 = -5 := by sym_simp
example : (-3 : Int) * 4 = -12 := by sym_simp
example : (-20 : Int) / 4 = -5 := by sym_simp
example : (17 : Int) % 5 = 2 := by sym_simp
example : (2 : Int) ^ 10 = 1024 := by sym_simp
example : Int.gcd (-12) 18 = 6 := by sym_simp
example : Int.tdiv 17 5 = 3 := by sym_simp
example : Int.fdiv (-17) 5 = -4 := by sym_simp
example : Int.tmod 17 5 = 2 := by sym_simp
example : Int.fmod (-17) 5 = 3 := by sym_simp
example : Int.bdiv 17 5 = 3 := by sym_simp
example : Int.bmod 17 5 = 2 := by sym_simp
-- Negation
example : -(-5 : Int) = 5 := by sym_simp
example : -(3 : Int8) = -3 := by sym_simp
-- Bitwise: Nat
example : 5 &&& 3 = 1 := by sym_simp
example : 5 ||| 3 = 7 := by sym_simp
example : 5 ^^^ 3 = 6 := by sym_simp
-- Shifts: Nat
example : 1 <<< 4 = 16 := by sym_simp
example : 16 >>> 2 = 4 := by sym_simp
-- UInt8
example : (200 : UInt8) + 100 = 44 := by sym_simp -- overflow
example : (5 : UInt8) * 3 = 15 := by sym_simp
example : (100 : UInt8) - 50 = 50 := by sym_simp
example : -(1 : UInt8) = 255 := by sym_simp
example : (0xFF : UInt8) &&& 0x0F = 0x0F := by sym_simp
example : ~~~(0 : UInt8) = 255 := by sym_simp
-- UInt16
example : (1000 : UInt16) + 2000 = 3000 := by sym_simp
example : (100 : UInt16) * 100 = 10000 := by sym_simp
-- UInt32
example : (100000 : UInt32) + 200000 = 300000 := by sym_simp
example : (1 : UInt32) <<< 20 = 1048576 := by sym_simp
-- UInt64
example : (1 : UInt64) <<< 40 = 1099511627776 := by sym_simp
-- Int8
example : (100 : Int8) + 50 = -106 := by sym_simp -- overflow
example : (-128 : Int8) - 1 = 127 := by sym_simp -- underflow
example : -((-128) : Int8) = -128 := by sym_simp -- edge case
-- Int16
example : (1000 : Int16) + 2000 = 3000 := by sym_simp
-- Int32
example : (100000 : Int32) * 100 = 10000000 := by sym_simp
-- Int64
example : (1000000000 : Int64) * 1000 = 1000000000000 := by sym_simp
-- Rat
example : (1 : Rat) / 2 + 1 / 3 = 5 / 6 := by sym_simp
example : (2 : Rat) / 3 * 3 / 4 = 1 / 2 := by sym_simp
example : (1 : Rat) / 2 - 1 / 3 = 1 / 6 := by sym_simp
example : ((2 : Rat) / 3)⁻¹ = 3 / 2 := by sym_simp
-- Fin
example : (3 : Fin 5) + 4 = 2 := by sym_simp -- wraps
example : (2 : Fin 10) * 3 = 6 := by sym_simp
example : -(1 : Fin 5) = 4 := by sym_simp
-- BitVec
example : (2 : BitVec 8) + 3 = 5 := by sym_simp
example : (0x0F : BitVec 8) &&& 0x3C = 0x0C := by sym_simp
example : (0x0F : BitVec 8) ||| 0x30 = 0x3F := by sym_simp
example : (0xFF : BitVec 8) ^^^ 0xAA = 0x55 := by sym_simp
example : ~~~(0x0F : BitVec 8) = 0xF0 := by sym_simp
example : (1 : BitVec 8) <<< 4 = 16 := by sym_simp
example : (0x80 : BitVec 8) >>> 4 = 0x08 := by sym_simp
example : (100 : BitVec 8) + 200 = 44 := by sym_simp -- overflow
-- Predicates: Nat
example : (2 < 3) = True := by sym_simp
example : (5 < 3) = False := by sym_simp
example : (3 ≤ 3) = True := by sym_simp
example : (4 ≤ 3) = False := by sym_simp
example : (5 > 3) = True := by sym_simp
example : (2 > 3) = False := by sym_simp
example : (3 ≥ 3) = True := by sym_simp
example : (2 ≥ 3) = False := by sym_simp
example : (5 = 5) = True := by sym_simp
example : (5 = 6) = False := by sym_simp
example : (5 ≠ 6) = True := by sym_simp
example : (5 ≠ 5) = False := by sym_simp
-- Predicates: Int
example : ((-3 : Int) < 2) = True := by sym_simp
example : ((5 : Int) < -3) = False := by sym_simp
example : ((-3 : Int) ≤ -3) = True := by sym_simp
example : ((2 : Int) = 2) = True := by sym_simp
example : ((2 : Int) ≠ 3) = True := by sym_simp
-- Predicates: Rat
example : ((1 : Rat) / 2 < 2 / 3) = True := by sym_simp
example : ((1 : Rat) / 2 = 2 / 4) = True := by sym_simp
-- Predicates: String
example : "hello" < "world" := by sym_simp
example : "a" ≤ "a" := by sym_simp
example : ¬ "a" > "b" := by sym_simp
example : "a" = "a" := by sym_simp
example : "a" ≠ "b" := by sym_simp
-- Predicates: Char
example : 'h' < 'w' := by sym_simp
example : 'a' ≤ 'a' := by sym_simp
example : ¬ 'a' > 'b' := by sym_simp
example : 'a' = 'a' := by sym_simp
example : 'a' ≠ 'b' := by sym_simp
-- Predicates: Fixed-width
example : ((100 : UInt8) < 200) = True := by sym_simp
example : ((-50 : Int8) < 50) = True := by sym_simp
example : ((1000 : UInt16) ≤ 1000) = True := by sym_simp
example : ((-50 : Int8) > 50) = False := by sym_simp
-- Predicates: BitVec
example : ((5 : BitVec 8) < 10) = True := by sym_simp
example : ((255 : BitVec 8) = 255) = True := by sym_simp
-- Predicates: Fin
example : ((2 : Fin 5) < 3) = True := by sym_simp
example : ((4 : Fin 5) ≤ 4) = True := by sym_simp
-- Dvd
example : (3 12) = True := by sym_simp
example : (5 12) = False := by sym_simp
example : ((3 : Int) -12) = True := by sym_simp
example : ((5 : Int) 12) = False := by sym_simp
-- BEq / bne (Bool results)
example : ((5 : Nat) == 5) = true := by sym_simp
example : ((5 : Nat) == 6) = false := by sym_simp
example : ((5 : Nat) != 6) = true := by sym_simp
example : ((5 : Nat) != 5) = false := by sym_simp
example : ((5 : Int) == 5) = true := by sym_simp
example : ((0xFF : BitVec 8) == 255) = true := by sym_simp
-- Identity fast path (isSameExpr)
example : ∀ n : Nat, (n = n) = True := by intro n; sym_simp
example : ∀ n : Nat, (n ≠ n) = False := by intro n; sym_simp
-- Edge cases
example : 0 / 0 = 0 := by sym_simp -- Nat division by zero
example : 5 % 0 = 5 := by sym_simp -- Nat mod by zero
example : 0 ^ 0 = 1 := by sym_simp -- 0^0 = 1 in Lean
theorem ex₁ : (2 / 3 : Rat) + 2 / 3 = 8 / 6 := by sym_simp
/--
info: theorem ex₁ : 2 / 3 + 2 / 3 = 8 / 6 :=
Eq.mpr (Eq.trans (congr (congrArg Eq (Eq.refl (4 / 3))) (Eq.refl (4 / 3))) (eq_self (4 / 3))) True.intro
-/
#guard_msgs in
#print ex₁
theorem ex₂ : (- 2) = (- (- (- 2))) := by sym_simp
/--
info: theorem ex₂ : -2 = - - -2 :=
Eq.mpr (Eq.trans (congrArg (Eq (-2)) (congrArg Neg.neg (Eq.refl 2))) (eq_self (-2))) True.intro
-/
#guard_msgs in
#print ex₂