import NNG.Levels.AdvAddition.Level_9 import Std.Tactic.RCases Game "NNG" World "AdvAddition" Level 10 Title "add_left_eq_zero" open MyNat Introduction " In Lean, `a ≠ b` is *defined to mean* `(a = b) → False`. This means that if you see `a ≠ b` you can *literally treat it as saying* `(a = b) → False`. Computer scientists would say that these two terms are *definitionally equal*. The following lemma, $a+b=0\\implies b=0$, will be useful in inequality world. " Statement MyNat.add_left_eq_zero "If $a$ and $b$ are natural numbers such that $$ a + b = 0, $$ then $b = 0$." {a b : ℕ} (h : a + b = 0) : b = 0 := by Hint " You want to start of by making a distinction `b = 0` or `b = succ d` for some `d`. You can do this with ``` induction b ``` even if you are never going to use the induction hypothesis. " -- TODO: induction vs rcases Branch rcases b -- TODO: `⊢ zero = 0` :( induction b with d · rfl · Hint "This goal seems impossible! However, our hypothesis `h` is also impossible, meaning that we still have a chance! First let's see why `h` is impossible. We can ``` rw [add_succ] at h ``` " rw [add_succ] at h Hint " Because `succ_ne_zero (a + {d})` is a proof that `succ (a + {d}) ≠ 0`, it is also a proof of the implication `succ (a + {d}) = 0 → False`. Hence `succ_ne_zero (a + {d}) h` is a proof of `False`! Unfortunately our goal is not `False`, it's a generic false statement. Recall however that the `exfalso` command turns any goal into `False` (it's logically OK because `False` implies every proposition, true or false). You can probably take it from here. " Branch have j := succ_ne_zero (a + d) h exfalso exact j exfalso apply succ_ne_zero (a + d) exact h LemmaTab "Add" Conclusion " "