|
|
import Adam.Metadata
|
|
|
|
|
|
import Mathlib.Algebra.BigOperators.Fin
|
|
|
import Mathlib.Tactic.Ring
|
|
|
|
|
|
import Adam.ToBePorted
|
|
|
|
|
|
set_option tactic.hygienic false
|
|
|
|
|
|
Game "Adam"
|
|
|
World "Sum"
|
|
|
Level 3
|
|
|
|
|
|
Title "Arithmetische Summe"
|
|
|
|
|
|
Introduction
|
|
|
"
|
|
|
**Du**: Wie werden solche Meisterwerke eigentlich gebaut?
|
|
|
|
|
|
Da zeigt eure Begleitung auf eine kleine Steinplatte neben dem Eingang,
|
|
|
auf der eien Beschreibung gekritzelt ist.
|
|
|
|
|
|
**Robo**: Das ist wohl der bekannte arithmetische Turm von Indu, über den hab ich schon
|
|
|
einmal Daten verarbeitet. Und die antwort auf deine Frage: Vermutlich ein Stein nach
|
|
|
dem anderen.
|
|
|
"
|
|
|
|
|
|
open BigOperators
|
|
|
|
|
|
Statement arithmetic_sum
|
|
|
"$2 \\cdot \\sum_{i = 0}^n i = n \\cdot (n + 1)$."
|
|
|
(n : ℕ) : 2 * (∑ i : Fin (n + 1), ↑i) = n * (n + 1) := by
|
|
|
Hint "**Du**: Klar, die werden ja nicht oben anfangen mit bauen. Sag mal,
|
|
|
wie zeige ich denn die arithmetische Summe, die hier gekritzelt steht?
|
|
|
Ich würde gerne Induktion über $n$ anwenden.
|
|
|
|
|
|
**Robo**: Ja dann ist's einfach `induction n`, ist doch logisch!"
|
|
|
induction n
|
|
|
Hint "**Du**: Zuerst den Induktionsanfang…
|
|
|
|
|
|
**Robo**: Diesen kannst du oft mit `simp` abkürzen!"
|
|
|
simp
|
|
|
Hint "**Robo**: Jetzt im Induktionsschritt: Bei Induktion über endlichen Summen willst du
|
|
|
immer mit `rw [Fin.sum_univ_castSucc]` anfangen" -- :
|
|
|
|
|
|
-- $$\\sum_\{i=0}^n a_i = \\sum_{i=0}^\{n-1} a_i + a_n$$"
|
|
|
rw [Fin.sum_univ_castSucc]
|
|
|
-- TODO: Bug. Dieser Hint wird nicht angezeigt.
|
|
|
Hint "**Du**: Oh das sieht jetz aber kompliziert aus…
|
|
|
|
|
|
**Robo**: Da musst du etwas drüber hinweg lesen. Am besten machst du kurz `simp`,
|
|
|
dann sieht's schon wieder besser aus."
|
|
|
simp
|
|
|
Hint "**Du**: Was bedeutet eigentlich der kleine Pfeil `↑`?
|
|
|
|
|
|
**Robo**: Das ist eine *Coersion*. Sowas wie wenn man eine natürliche Zahl als Integer anschaut,
|
|
|
also die natürliche Abbildung `ℕ ↪ ℤ`. Oder hier, wenn ein Element `x : Fin n` stattdessen als
|
|
|
Element in `(↑x : ℕ)` angeschaut wird.
|
|
|
|
|
|
**Robo**: Übrigens, um die Induktionshypothese anzuwenden brauchst du zuerst das Lemma
|
|
|
`mul_add`."
|
|
|
rw [mul_add]
|
|
|
Hint "**Du**: Und wie wende ich jetzt die Induktionshypothese an?
|
|
|
|
|
|
**Robo mit `rw` wie jede andere Annahme auch."
|
|
|
rw [n_ih]
|
|
|
Hint "**Robo**: Jetzt musst du noch kurz `rw [Nat.succ_eq_add_one]` anwenden.
|
|
|
|
|
|
**Du**: Aber wieso?
|
|
|
|
|
|
**Robo**: Naja, `ring` ist jetzt auch noch nicht so stark, und erkennt nicht dass `n.succ`
|
|
|
und `n + 1` das gleiche sind.
|
|
|
|
|
|
**Du**: Aber das könnte man doch ändern, oder?
|
|
|
|
|
|
**Robo**: Vielleicht wenn wir einmal einem Techniker begegnen, der mir ein Update
|
|
|
einspielen kann…"
|
|
|
Branch
|
|
|
ring_nf
|
|
|
Hint "**Robo**: Wie gesagt, brauch doch `rw [Nat.succ_eq_add_one]` als Fix für meine
|
|
|
kleinen Maken."
|
|
|
rw [Nat.succ_eq_add_one]
|
|
|
ring
|
|
|
|
|
|
NewTactic induction
|
|
|
NewLemma Fin.sum_univ_castSucc Nat.succ_eq_add_one mul_add add_mul Nat.zero_eq
|
|
|
|
|
|
Conclusion "Du schaust dich um und bewunderst das Tal in dem hunderte, wenn nicht tausende,
|
|
|
Steintürme in allen Formen und Höhen stehen."
|