This removes simp attributes from `Nat.succ.injEq` and `Nat.succ_sub_succ_eq_sub` to replace them with simprocs. This is because any reductions involving `Nat.succ` has a high risk of leading proof performance problems when dealing with even moderately large numbers. Here are a couple examples that will both report a maximum recursion depth error currently. These examples are fixed by this PR. ``` example : (123456: Nat) = 12345667 := by simp example (x : Nat) (p : x = 0) : 1000 - (x + 1000) = 0 := by simp ```
103 lines
3.1 KiB
Text
103 lines
3.1 KiB
Text
variable (a b : Nat)
|
|
|
|
/- 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
|