import NNG.Metadata import NNG.MyNat.AdvAddition import NNG.MyNat.Multiplication 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. Let me go through the proof, because it introduces several new concepts: * `cases b`, where `b : mynat` * `exfalso` * `apply succ_ne_zero` We're going to prove $a+b=0\\implies b=0$. Here is the strategy. Each natural number is either `0` or `succ(d)` for some other natural number `d`. So we can start the proof with `cases b with d,` and then we have two goals, the case `b = 0` (which you can solve easily) and the case `b = succ(d)`, which looks like this: ``` a d : mynat, H : a + succ d = 0 ⊢ succ d = 0 ``` Our goal is impossible to prove. 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,` to turn `H` into `H : succ (a + d) = 0`. 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. " Statement -- 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 induction b with d rfl rw [add_succ] at H exfalso apply succ_ne_zero (a + d) exact H Conclusion " "