import NNG.Levels.Addition.Level_5 Game "NNG" World "Addition" Level 6 Title "add_right_comm" open MyNat Introduction " Lean sometimes writes `a + b + c`. What does it mean? The convention is that if there are no brackets displayed in an addition formula, the brackets are around the left most `+` (Lean's addition is \"left associative\"). So the goal in this level is `(a + b) + c = (a + c) + b`. This isn't quite `add_assoc` or `add_comm`, it's something you'll have to prove by putting these two theorems together. If you hadn't picked up on this already, `rw [add_assoc]` will change `(x + y) + z` to `x + (y + z)`, but to change it back you will need `rw [← add_assoc]`. Get the left arrow by typing `\\l` then the space bar (note that this is L for left, not a number 1). Similarly, if `h : a = b` then `rw [h]` will change `a`'s to `b`'s and `rw [← h]` will change `b`'s to `a`'s. " Statement MyNat.add_right_comm "For all natural numbers $a, b$ and $c$, we have $a + b + c = a + c + b$." (a b c : ℕ) : a + b + c = a + c + b := by Hint (hidden := true) "You want to change your goal to `a + (b + c) = _` so that you can then use commutativity." rw [add_assoc] Hint "Here you need to be more precise about where to rewrite theorems. `rw [add_comm]` will just find the first `_ + _` it sees and swap it around. You can target more specific additions like this: `rw [add_comm a]` will swap around additions of the form `a + _`, and `rw [add_comm a b]` will only swap additions of the form `a + b`." Branch rw [add_comm] Hint "`rw [add_comm]` just rewrites to first instance of `_ + _` it finds, which is not what you want to do here. Instead you can provide the arguments explicitely: * `rw [add_comm b c]` * `rw [add_comm b]` * `rw [add_comm b _]` * `rw [add_comm _ c]` would all have worked. You should go back and try again. " rw [add_comm b c] Branch rw [add_assoc] rfl rw [←add_assoc] rfl LemmaTab "Add" Conclusion " If you have got this far, then you have become very good at manipulating equalities in Lean. You can also now collect four collectibles (or `instance`s, as Lean calls them) ``` MyNat.addSemigroup -- (after level 2) MyNat.addMonoid -- (after level 2) MyNat.addCommSemigroup -- (after level 4) MyNat.addCommMonoid -- (after level 4) ``` These say that `ℕ` is a commutative semigroup/monoid. In Multiplication World you will be able to collect such advanced collectibles as `MyNat.commSemiring` and `MyNat.distrib`, and then move on to power world and the famous collectible at the end of it. One last thing -- didn't you think that solving this level `add_right_comm` was boring? Check out this AI that can do it for us. From now on, the `simp` AI becomes accessible (it's just an advanced tactic really), and can nail some really tedious-for-a-human-to-solve goals. For example check out this one-line proof: ``` example (a b c d e : ℕ ) : (((a + b) + c) + d) + e = (c + ((b + e) + a)) + d := by simp ``` Imagine having to do that one by hand! The AI closes the goal because it knows how to use associativity and commutativity sensibly in a commutative monoid. You are now done with addition world. Go back to the main menu (top left) and decide whether to press on with multiplication world and power world (which can be solved with `rw`, `refl` and `induction`), or to go on to Function World where you can learn the tactics needed to prove goals of the form $P\\implies Q$, thus enabling you to solve more advanced addition world levels such as $a+t=b+t\\implies a=b$. Note that Function World is more challenging mathematically; but if you can do Addition World you can surely do Multiplication World and Power World. " -- First we have to get the `AddCommMonoid` collectible, -- which we do by saying the magic words which make Lean's type class inference -- system give it to us. -- -/ -- instance : add_comm_monoid mynat := by structure_helper