You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lean4game/server/testgame/TestGame/Levels/Sum/L06_Summary.lean

126 lines
4.5 KiB
Plaintext

2 years ago
import TestGame.Metadata
import TestGame.Options.BigOperators
import Mathlib.Algebra.BigOperators.Fin
import Mathlib.Tactic.Ring
import TestGame.ToBePorted
2 years ago
import TestGame.Options.ArithSum
2 years ago
Game "TestGame"
World "Sum"
2 years ago
Level 6
2 years ago
set_option tactic.hygienic false
2 years ago
Title "Zusammenfassung"
2 years ago
Introduction
"
2 years ago
Zusammenfassung aus diesem Kapitel
## Notationen / Begriffe
| | Beschreibung |
|:---------------------|:------------------------------------------|
| `Fin n` | Ist ein Typ mit Zahlen $0, \\ldots, n-1$. |
| `∑ (i : Fin n), a i` | $\\sum_{i=0}^{n-1} a_i$ |
## Taktiken
| | Taktik | Beispiel |
|:---|:--------------------------|:-------------------------------------|
| 20 | `simp` | Simplifikation. |
| 21 | `induction n` | Induktion über $n$ |
2 years ago
Und hier noch eine etwas schwierigere Übung.
Das Resultat aus Level 3 kannst du als `arithmetic_sum` wiederverwenden:
$$
2 \\cdot \\sum_{i = 0}^n i = n \\cdot (n + 1)
$$
"
open BigOperators
Statement
"Zeige $\\sum_{i = 0}^m i^3 = (\\sum_{i = 0}^m i)^2$."
2 years ago
(m : ) : (∑ i : Fin (m + 1), (i : )^3) = (∑ i : Fin (m + 1), (i : ))^2 := by
induction' m with m hm
simp
rw [Fin.sum_univ_castSucc]
simp
rw [hm]
rw [Fin.sum_univ_castSucc (n := m + 1)]
simp
rw [add_pow_two]
rw [arithmetic_sum]
ring
NewLemmas arithmetic_sum add_pow_two
HiddenHint (m : ) : ∑ i : Fin (m + 1), (i : ) ^ 3 = (∑ i : Fin (m + 1), ↑i) ^ 2 =>
"Führe auch hier einen Induktionsbeweis."
HiddenHint : ∑ i : Fin (Nat.zero + 1), (i : ) ^ 3 = (∑ i : Fin (Nat.zero + 1), ↑i) ^ 2 =>
2 years ago
"`simp` kann den Induktionsanfang beweisen."
Hint (m : ) : ∑ i : Fin (Nat.succ m + 1), (i : ) ^ 3 = (∑ i : Fin (Nat.succ m + 1), ↑i) ^ 2 =>
"Im Induktionsschritt willst du das Goal so umformen, dass du folgende Therme
ersetzen kannst:
* `∑ i : Fin (m + 1), ↑i ^ 3` (Induktionshypothese)
* `2 * (∑ i : Fin (m + 1), ↑i)` (arithmetische Summe)
"
2 years ago
HiddenHint (m : ) : ∑ i :
Fin (Nat.succ m + 1), (i : ) ^ 3 = (∑ i : Fin (Nat.succ m + 1), ↑i) ^ 2 =>
"
2 years ago
Als erstes kannst du mal mit dem bekannten `rw [Fin.sum_univ_castSucc]` anfangen.
"
HiddenHint (m : ) : ∑ i : Fin (m + 1), (Fin.castSucc.toEmbedding i : ) ^ 3 +
2 years ago
↑(Fin.last (m + 1)) ^ 3 = (∑ i : Fin (Nat.succ m + 1), ↑i) ^ 2 =>
"Mit `simp` kriegst du das `↑(Fin.castSucc.toEmbedding i)` weg"
Hint (m : ) : ∑ x : Fin (m + 1), (x : ) ^ 3 + (m + 1) ^ 3 =
(∑ i : Fin (Nat.succ m + 1), ↑i) ^ 2 =>
"Jetzt kannst du die Induktionshypothese benützen."
2 years ago
Hint (m : ) : (∑ i : Fin (m + 1), (i : )) ^ 2 + (m + 1) ^ 3 = (∑ i : Fin (Nat.succ m + 1), ↑i) ^ 2 =>
2 years ago
"Die linke Seite ist jetzt erst mal gut. Um auf der rechten Seite `Fin.sum_univ_castSucc`
anzuwenden, haben wir ein Problem: Lean schreibt immer die erste Instanz um, also würde gerne
auf der linken Seite `(∑ i : Fin (m + 1), ↑i) ^ 2` umschreiben.
Wir können Lean hier weiterhelfen, indem wir manche Argemente von `Fin.sum_univ_castSucc`
explizit angeben. Die Funktion hat ein Argument mit dem Namen `n`, welches wir z.B. explizit
angeben können:
```
rw [Fin.sum_univ_castSucc (n := m + 1)]
```
"
HiddenHint (m : ) : (∑ i : Fin (m + 1), ↑i) ^ 2 + (m + 1) ^ 3 =
(∑ i : Fin (m + 1), ↑(Fin.castSucc.toEmbedding i) + ↑(Fin.last (m + 1))) ^ 2 =>
"Wenn du noch einen AUsdruck `↑(Fin.castSucc.toEmbedding i)` hast, solltest du mal
`simp` aufrufen."
2 years ago
Hint (m : ) : (∑ i : Fin (m + 1), ↑i) ^ 2 + (m + 1) ^ 3 = (∑ i : Fin (m + 1), ↑i + (m + 1)) ^ 2 =>
"Die rechte Seite hat die Form $(a + b)^2$ welche mit `add_pow_two` zu $a^2 + 2ab + b^2$
umgeschrieben werden kann."
HiddenHint (m : ) : (∑ i : Fin (m + 1), ↑i) ^ 2 + (m + 1) ^ 3 =
(∑ i : Fin (m + 1), ↑i) ^ 2 + (2 * ∑ i : Fin (m + 1), ↑i) * (m + 1) + (m + 1) ^ 2 =>
"Wenn du noch einen AUsdruck `↑(Fin.castSucc.toEmbedding i)` hast, solltest du mal
`simp` aufrufen."
2 years ago
Hint (m : ) : (∑ i : Fin (m + 1), ↑i) ^ 2 + (m + 1) ^ 3 =
(∑ i : Fin (m + 1), ↑i) ^ 2 + (2 * ∑ i : Fin (m + 1), ↑i) * (m + 1) + (m + 1) ^ 2 =>
"Jetzt hast du in der Mitte `2 * ∑ i : Fin (m + 1), ↑i)`, welches du mit der
arithmetischen Summe `arithmetic_sum` umschreiben kannst."
Hint (m : ) : (∑ i : Fin (m + 1), ↑i) ^ 2 + (m + 1) ^ 3 =
(∑ i : Fin (m + 1), ↑i) ^ 2 + m * (m + 1) * (m + 1) + (m + 1) ^ 2 =>
"Den Rest sollte `ring` für dich übernehmen."