levels up to 'Lean'

pull/43/head
Jon Eugster 2 years ago
parent c679325c46
commit 99080aa5ff

@ -3,6 +3,8 @@ import TestGame.Metadata
import Mathlib.Algebra.BigOperators.Fin
import Mathlib.Tactic.Ring
import TestGame.Options.BigOperators
set_option tactic.hygienic false
Game "TestGame"
@ -56,7 +58,7 @@ NewLemmas Fin.sum_univ_castSucc Nat.succ_eq_add_one mul_add add_mul
Hint (n : ) : 2 * (∑ i : Fin (n + 1), ↑i) = n * (n + 1) =>
"Als Erinnerung, einen Induktionsbeweis startet man mit `induction n`."
Hint (n : ) : 2 * ∑ i : Fin (0 + 1), ↑i = 0 * (0 + 1) =>
Hint : 2 * ∑ i : Fin (Nat.zero + 1), ↑i = Nat.zero * (Nat.zero + 1) =>
"Den Induktionsanker $n = 0$ kann `simp` oft beweisen."
Hint (n : ) (hn : 2 * ∑ i : Fin (n + 1), ↑i = n * (n + 1)) :
@ -77,7 +79,8 @@ umschreiben. Dazu kannst du `mul_add` benützen.
Hint (n : ) (hn : 2 * ∑ i : Fin (n + 1), ↑i = n * (n + 1)) :
2 * ∑ x : Fin (n + 1), ↑x + 2 * (n + 1) = Nat.succ n * (Nat.succ n + 1) =>
"Jetzt kann die Induktionshypothese mit `rw` angewendet werden."
"`simp` vereinfacht `↑(↑Fin.castSucc.toEmbedding i)` zu `↑i`.
Danach kann die Induktionshypothese mit `rw` angewendet werden."
Hint (n : ) (hn : 2 * ∑ i : Fin (n + 1), ↑i = n * (n + 1)) :
n * (n + 1) + 2 * (n + 1) = Nat.succ n * (Nat.succ n + 1) =>

@ -36,7 +36,7 @@ HiddenHint (n : ) : (∑ i : Fin n, (2 * (i : ) + 1)) = n ^ 2 =>
Fange wieder mit `induction n` an.
"
HiddenHint (n : ) : ∑ i : Fin Nat.zero, ((2 : ) * i + 1) = Nat.zero ^ 2 =>
HiddenHint : ∑ i : Fin Nat.zero, ((2 : ) * i + 1) = Nat.zero ^ 2 =>
"
Den Induktionsanfang kannst du wieder mit `simp` beweisen.
"
@ -54,5 +54,5 @@ Hier kommt die Induktionshypothese ins Spiel.
HiddenHint (n : ) : n ^ 2 + (2 * n + 1) = Nat.succ n ^ 2 =>
"
Mit `rw [Fin.sum_univ_castSucc]` und `ring` kannst du hier abschliessen.
Mit `rw [Nat.succ_eq_add_one]` und `ring` kannst du hier abschliessen.
"

@ -44,7 +44,7 @@ $$
open BigOperators
Statement
"Zeige $\\sum_{i = 0}^n i^3 = (\\sum_{i = 0}^n i)^2$."
"Zeige $\\sum_{i = 0}^m i^3 = (\\sum_{i = 0}^m i)^2$."
(m : ) : (∑ i : Fin (m + 1), (i : )^3) = (∑ i : Fin (m + 1), (i : ))^2 := by
induction' m with m hm
simp
@ -59,26 +59,35 @@ Statement
NewLemmas arithmetic_sum add_pow_two
HiddenHint (m : ) : ∑ i : Fin (Nat.zero + 1), ↑i ^ 3 = (∑ i : Fin (Nat.zero + 1), ↑i) ^ 2 =>
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 =>
"`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 musst du versuchen, das Goal so umzuformen, dass du
`∑ i : Fin (m + 1), ↑i ^ 3` (Induktionshypothese) oder
`2 * (∑ i : Fin (m + 1), ↑i)` (arithmetische Summe) erhälst.
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)
"
HiddenHint (m : ) : ∑ i :
Fin (Nat.succ m + 1), (i : ) ^ 3 = (∑ i : Fin (Nat.succ m + 1), ↑i) ^ 2 =>
"
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 +
HiddenHint (m : ) : ∑ i : Fin (m + 1), (Fin.castSucc.toEmbedding i : ) ^ 3 +
↑(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 mit `rw` einsetzen."
"Jetzt kannst du die Induktionshypothese benützen."
Hint (m : ) : (∑ i : Fin (m + 1), ↑i) ^ 2 + (m + 1) ^ 3 = (∑ i : Fin (Nat.succ m + 1), ↑i) ^ 2 =>
Hint (m : ) : (∑ i : Fin (m + 1), (i : )) ^ 2 + (m + 1) ^ 3 = (∑ i : Fin (Nat.succ m + 1), ↑i) ^ 2 =>
"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.
@ -94,12 +103,18 @@ 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 =>
"wieder `simp`"
"Wenn du noch einen AUsdruck `↑(Fin.castSucc.toEmbedding i)` hast, solltest du mal
`simp` aufrufen."
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."
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

Loading…
Cancel
Save