lean4-htt/tests/lean/run/simprocNat.lean
Rob23oba e8bbba06b7
fix: fix builtin simproc Nat.reduceAnd (#6773)
This PR fixes a typo that prevented `Nat.reduceAnd` from working
correctly.

Closes #6772
2025-01-25 12:57:24 +00:00

135 lines
4.3 KiB
Text

variable (a b : Nat)
/- bitwise operation tests -/
#check_simp (4 : Nat) &&& (5 : Nat) ~> 4
#check_simp (3 : Nat) ^^^ (1 : Nat) ~> 2
#check_simp (2 : Nat) ||| (1 : Nat) ~> 3
#check_simp (3 : Nat) <<< (2 : Nat) ~> 12
#check_simp (3 : Nat) >>> (1 : Nat) ~> 1
/- subtract diff tests -/
#check_simp (1000 : Nat) - 400 ~> 600
#check_simp (a + 1000) - 1000 ~> a
#check_simp (a + 400) - 1000 ~> a - 600
#check_simp (a + 1000) - 400 ~> a + 600
#check_simp 1000 - (a + 400) ~> 600 - a
#check_simp 400 - (a + 1000) ~> 0
#check_simp (a + 1000) - (b + 1000) ~> a - b
#check_simp (a + 1000) - (b + 400) ~> a + 600 - b
#check_simp (a + 400) - (b + 1000) ~> a - (b + 600)
/- eq tests -/
#check_simp (1234567 : Nat) = 123456 ~> False
#check_simp (1234567 : Nat) = 1234567 ~> True
#check_simp (123456 : Nat) = 1234567 ~> False
#check_simp (a + 1000) = 1000 ~> a = 0
#check_simp (a + 1000) = 400 ~> False
#check_simp (a + 400) = 1000 ~> a = 600
#check_simp 1000 = (a + 1000) ~> a = 0
#check_simp 400 = (a + 1000) ~> False
#check_simp 1000 = (a + 400) ~> a = 600
#check_simp (a + 1000) = (b + 1000) ~> a = b
#check_simp (a + 1000) = (b + 400) ~> a + 600 = b
#check_simp (a + 400) = (b + 1000) ~> a = b + 600
#check_simp (Nat.add a 400) = (Add.add b 1000) ~> a = b + 600
#check_simp (Nat.add a 400) = b.succ.succ ~> a + 398 = b
/- ne -/
#check_simp 1000 ≠ (a + 1000) ~> a ≠ 0
#check_simp (1234567 : Nat) ≠ 123456 ~> True
#check_simp (a + 400) ≠ (b + 1000) ~> a ≠ b + 600
/- leq -/
#check_simp (1234567 : Nat) ≤ 123456 ~> False
#check_simp (1234567 : Nat) ≤ 1234567 ~> True
#check_simp (123456 : Nat) ≤ 1234567 ~> True
#check_simp (a + 1000) ≤ 1000 ~> a = 0
#check_simp (a + 1000) ≤ 400 ~> False
#check_simp (a + 400) ≤ 1000 ~> a ≤ 600
#check_simp 1000 ≤ (a + 1000) ~> True
#check_simp 400 ≤ (a + 1000) ~> True
#check_simp 1000 ≤ (a + 400) ~> 600 ≤ a
#check_simp (a + 1000) ≤ (b + 1000) ~> a ≤ b
#check_simp (a + 1000) ≤ (b + 400) ~> a + 600 ≤ b
#check_simp (a + 400) ≤ (b + 1000) ~> a ≤ b + 600
#check_simp (Nat.add a 400) ≤ (Add.add b 1000) ~> a ≤ b + 600
#check_simp (Nat.add a 400) ≤ b.succ.succ ~> a + 398 ≤ b
/- ge (just make sure le rules apply) -/
#check_simp (123456 : Nat) ≥ 1234567 ~> False
#check_simp (a + 400) ≥ 1000 ~> a ≥ 600
#check_simp 1000 ≥ (a + 1000) ~> a = 0
#check_simp (a + 1000) ≥ (b + 400) ~> a + 600 ≥ b
/- beq tests -/
#check_simp (1234567 : Nat) == 123456 ~> false
#check_simp (1234567 : Nat) == 1234567 ~> true
#check_simp (123456 : Nat) == 1234567 ~> false
#check_simp (a + 1000) == 1000 ~> a == 0
#check_simp (a + 1000) == 400 ~> false
#check_simp (a + 400) == 1000 ~> a == 600
#check_simp 1000 == (a + 1000) ~> a == 0
#check_simp 400 == (a + 1000) ~> false
#check_simp 1000 == (a + 400) ~> a == 600
#check_simp (a + 1000) == (b + 1000) ~> a == b
#check_simp (a + 1000) == (b + 400) ~> a + 600 == b
#check_simp (a + 400) == (b + 1000) ~> a == b + 600
/- bne tests -/
#check_simp (1234567 : Nat) != 123456 ~> true
#check_simp (a + 1000) != 1000 ~> a != 0
#check_simp (a + 1000) != 400 ~> true
#check_simp (a + 400) != 1000 ~> a != 600
#check_simp 1000 != (a + 1000) ~> a != 0
#check_simp 400 != (a + 1000) ~> true
#check_simp 1000 != (a + 400) ~> a != 600
#check_simp (a + 1000) != (b + 1000) ~> a != b
#check_simp (a + 1000) != (b + 400) ~> a + 600 != b
#check_simp (a + 400) != (b + 1000) ~> a != b + 600
/-! Alternate instance tests
These check that the simplification rules will matching
offsets still trigger even when the expression for the
index is definition equal but not syntactically equal
to the default instance.
This can be relevant in Mathlib when rewriting using
theorems involving algebraic hierarchy classes.
-/
class AddCommMagma (G : Type u) extends Add G where
add_comm : ∀(x y : G), x + y = y + x
instance instAddExtNat : AddCommMagma Nat where
add_comm := Nat.add_comm
#check_tactic @Add.add _ instAddExtNat.toAdd a 1 = 4 ~> a = 3 by simp only [Nat.succ.injEq]
#check_tactic @HAdd.hAdd _ _ _ (@instHAdd _ instAddExtNat.toAdd) a 1 = 4 ~> a = 3 by simp only [Nat.succ.injEq]
#check_tactic @Add.add _ instAddNat a 1 = 4 ~> a = 3 by simp
#check_tactic @Add.add _ instAddExtNat.toAdd a 1 = 4 ~> a = 3 by simp
#check_tactic @HAdd.hAdd _ _ _ (@instHAdd _ instAddExtNat.toAdd) a 1 = 4 ~> a = 3 by simp