| 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 |