levels and custom induction
This commit is contained in:
@@ -43,24 +43,25 @@ In diesem Kapitel lernen wir endliche Summen und mehr Übungen zur Induktion.
|
||||
open BigOperators
|
||||
|
||||
Statement (n : ℕ) : (∑ i : Fin n, (0 + 0)) = 0 := by
|
||||
Hint "BUG"
|
||||
Hint "
|
||||
**Du**: Oh das ist ganz schön viel neues… Mal sehen, das sagt wohl
|
||||
$( \\sum_i 0 + 0 ) = 0$. Dann ist das vielleicht doch nicht so komplex.
|
||||
|
||||
-- TODO (Bug): Invalid escape sequence:
|
||||
-- "**Du**: Oh das ist ganz schön viel neues… Mal sehen, das sagt wohl
|
||||
-- $( \\sum_i 0 + 0 ) = 0$. Dann ist das vielleicht doch nicht so komplex.
|
||||
**Robo**: Genau! Man schreibt `\\sum`. Beachte den Index:
|
||||
$( \\sum_\{i=0}^\{n-1} 0 + 0 ) = 0$, also `Fin n` ist ein Typ mit den Elementen
|
||||
$(0, \\ldots, n-1)$.
|
||||
|
||||
-- **Robo**: Genau! Man schreibt `\\sum`. Beachte den Index:
|
||||
-- $( \\sum_\{i=0}^\{n-1} 0 + 0 ) = 0$, also `Fin n` ist ein Typ mit den Elementen
|
||||
-- $\\{0, \\ldots, n-1\\}$.
|
||||
**Du**: Oke, also `Fin n` hat `n` Elemente. Und was mach ich jetzt?
|
||||
|
||||
-- **Du**: Oke, also `Fin n` hat `n` Elemente. Und was mach ich jetzt?
|
||||
**Robo**: `simp` ist eine ganz starke Taktik, die viele Terme vereinfacht, wir
|
||||
fangen besser an, diese zu benützen.
|
||||
|
||||
-- **Robo**: `simp` ist eine ganz starke Taktik, die viele Terme vereinfacht, wir
|
||||
-- fangen besser an, diese zu benützen.
|
||||
|
||||
-- Irgendwie hast du das Gefühl ein Déjà-vue zu haben…"
|
||||
Irgendwie hast du das Gefühl ein Déjà-vue zu haben…"
|
||||
simp
|
||||
|
||||
OnlyTactic simp
|
||||
LemmaTab "Sum"
|
||||
|
||||
Conclusion "**Unbekannte**: Sehr gut, folgt mir!"
|
||||
|
||||
-- TODO: Cannot write $\\{0\\}$ inside a hint.
|
||||
|
||||
@@ -4,6 +4,7 @@ import Adam.ToBePorted
|
||||
import Mathlib
|
||||
|
||||
set_option tactic.hygienic false
|
||||
open Finset
|
||||
|
||||
Game "Adam"
|
||||
World "Sum"
|
||||
@@ -22,21 +23,21 @@ open BigOperators
|
||||
Statement
|
||||
"$\\sum_{i=0}^{n-1} (i + 1) = n + \\sum_{i=0}^{n-1} i$."
|
||||
(n : ℕ) : ∑ i : Fin n, ((i : ℕ) + 1) = n + (∑ i : Fin n, (i : ℕ)) := by
|
||||
-- Hint "**Du**: Hmm, wieder `simp`?
|
||||
Hint "**Du**: Hmm, wieder `simp`?
|
||||
|
||||
-- **Robo**: Nicht ganz. `simp` benützt nur Lemmas, die klar eine Vereinfachung darstellen,
|
||||
-- und in deiner Bibliothek mit `@[simp]` markiert wird. Hier brauchen wir eine andere
|
||||
-- Umformung:
|
||||
**Robo**: Nicht ganz. `simp` benützt nur Lemmas, die klar eine Vereinfachung darstellen,
|
||||
und in deiner Bibliothek mit `@[simp]` markiert wird. Hier brauchen wir eine andere
|
||||
Umformung:
|
||||
|
||||
-- $$
|
||||
-- \\sum_\{i = 0}^n a_i + b_i = \\sum_\{i = 0}^n a_i + \\sum_\{j = 0}^n b_j
|
||||
-- $$
|
||||
$$
|
||||
\\sum_\{i = 0}^n a_i + b_i = \\sum_\{i = 0}^n a_i + \\sum_\{j = 0}^n b_j
|
||||
$$
|
||||
|
||||
-- **Robo*: Da unklar ist, welche Seite \"einfacher\" ist, wird so ein Lemma nicht mit
|
||||
-- `@[simp]` markiert. Das heisst du musst `Finset.sum_add_distrib` mit `rw`
|
||||
-- explizit anwenden.
|
||||
-- "
|
||||
rw [Finset.sum_add_distrib]
|
||||
**Robo**: Da unklar ist, welche Seite \"einfacher\" ist, wird so ein Lemma nicht mit
|
||||
`@[simp]` markiert. Das heisst du musst `sum_add_distrib` mit `rw`
|
||||
explizit anwenden.
|
||||
"
|
||||
rw [sum_add_distrib]
|
||||
Hint "**Robo**: Die zweite Summe `∑ x : Fin n, 1` kann jetzt aber mit
|
||||
`simp` zu `n` vereinfacht werden."
|
||||
simp
|
||||
@@ -49,6 +50,7 @@ Statement
|
||||
ring
|
||||
|
||||
NewLemma Finset.sum_add_distrib add_comm
|
||||
LemmaTab "Sum"
|
||||
|
||||
Conclusion "Eure Begleitung scheint mit der Antwort zu frieden zu sein und zeigt
|
||||
freudig an dem Turm empor, den ihr soeben erreicht habt."
|
||||
|
||||
@@ -25,6 +25,8 @@ einmal Daten verarbeitet. Und die antwort auf deine Frage: Vermutlich ein Stein
|
||||
dem anderen.
|
||||
"
|
||||
|
||||
open Fin
|
||||
|
||||
open BigOperators
|
||||
|
||||
Statement arithmetic_sum
|
||||
@@ -34,17 +36,18 @@ Statement arithmetic_sum
|
||||
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
|
||||
**Robo**: Ja dann ist's einfach `induction n with d hd`! Der `with d hd` teil ist
|
||||
Optional und hilft dir die Induktionsvariable und -hypothese zu benennen."
|
||||
induction n with d hd
|
||||
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" -- :
|
||||
immer mit `rw [sum_univ_castSucc]` anfangen" -- :
|
||||
|
||||
-- $$\\sum_\{i=0}^n a_i = \\sum_{i=0}^\{n-1} a_i + a_n$$"
|
||||
rw [Fin.sum_univ_castSucc]
|
||||
rw [sum_univ_castSucc]
|
||||
-- TODO: Bug. Dieser Hint wird nicht angezeigt.
|
||||
Hint "**Du**: Oh das sieht jetz aber kompliziert aus…
|
||||
|
||||
@@ -63,27 +66,31 @@ Statement arithmetic_sum
|
||||
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.
|
||||
rw [hd]
|
||||
Hint "**Du**: Der Rest ist einfach Rechnerei.
|
||||
|
||||
**Du**: Aber wieso?
|
||||
**Robo**: Dann wir `ring` wohl keine Probleme haben."
|
||||
-- Hint "**Robo**: Jetzt musst du noch kurz `rw [Nat.succ_eq_add_one]` anwenden.
|
||||
|
||||
**Robo**: Naja, `ring` ist jetzt auch noch nicht so stark, und erkennt nicht dass `n.succ`
|
||||
und `n + 1` das gleiche sind.
|
||||
-- **Du**: Aber wieso?
|
||||
|
||||
**Du**: Aber das könnte man doch ändern, oder?
|
||||
-- **Robo**: Naja, `ring` ist jetzt auch noch nicht so stark, und erkennt nicht dass `n.succ`
|
||||
-- und `n + 1` das gleiche sind.
|
||||
|
||||
**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]
|
||||
-- **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
|
||||
LemmaTab "Sum"
|
||||
|
||||
Conclusion "Du schaust dich um und bewunderst das Tal in dem hunderte, wenn nicht tausende,
|
||||
Steintürme in allen Formen und Höhen stehen."
|
||||
|
||||
@@ -18,6 +18,8 @@ Du gehst zu einem etwas kleineren Nachbarsturm.
|
||||
"
|
||||
set_option tactic.hygienic false
|
||||
|
||||
open Fin
|
||||
|
||||
open BigOperators
|
||||
|
||||
Statement odd_arithmetic_sum
|
||||
@@ -26,8 +28,12 @@ Statement odd_arithmetic_sum
|
||||
Hint "**Robo**: Das funktioniert genau gleich wie zuvor, viel Glück."
|
||||
induction n
|
||||
simp
|
||||
rw [Fin.sum_univ_castSucc]
|
||||
Hint (hidden := true) "Den Induktionschritt mit Summen willst du
|
||||
eigentlich immer mit `rw [sum_univ_castSucc]` beginnen."
|
||||
rw [sum_univ_castSucc]
|
||||
simp
|
||||
rw [n_ih]
|
||||
rw [Nat.succ_eq_add_one]
|
||||
--rw [Nat.succ_eq_add_one]
|
||||
ring
|
||||
|
||||
LemmaTab "Sum"
|
||||
|
||||
@@ -9,6 +9,7 @@ import Adam.Options.ArithSum
|
||||
set_option tactic.hygienic false
|
||||
|
||||
open BigOperators
|
||||
open Finset
|
||||
|
||||
Game "Adam"
|
||||
World "Sum"
|
||||
@@ -35,10 +36,11 @@ Statement
|
||||
|
||||
**Du**: Hast du nicht ein Lemma dafür?
|
||||
|
||||
**Robo**: Doch, probier mal `Finset.sum_comm`."
|
||||
**Robo**: Doch, probier mal `sum_comm`."
|
||||
rw [Finset.sum_comm]
|
||||
|
||||
NewLemma Finset.sum_comm
|
||||
LemmaTab "Sum"
|
||||
|
||||
Conclusion "
|
||||
Euer Begleiter ist ganz begeistert als er dir das Stück Papier aus den Händen nimmt,
|
||||
|
||||
@@ -38,6 +38,8 @@ Da löst sich aus der Steinlandschaft plötzlich ein grosser Steingolem. Er scha
|
||||
bedrohlich an und fragt in tiefer Stimme:
|
||||
"
|
||||
|
||||
open Fin
|
||||
|
||||
open BigOperators
|
||||
|
||||
Statement (m : ℕ) : (∑ i : Fin (m + 1), (i : ℕ)^3) = (∑ i : Fin (m + 1), (i : ℕ))^2 := by
|
||||
@@ -45,7 +47,7 @@ Statement (m : ℕ) : (∑ i : Fin (m + 1), (i : ℕ)^3) = (∑ i : Fin (m + 1),
|
||||
induction m
|
||||
Hint "**Du**: Also den Induktionsanfang kann man einfach zeigen…"
|
||||
simp
|
||||
Hint "**Robo**: Und jetzt wieder `rw [Fin.sum_univ_castSucc]` und `simp` um vorwärts zu
|
||||
Hint (hidden := true) "**Robo**: Und jetzt wieder `rw [sum_univ_castSucc]` und `simp` um vorwärts zu
|
||||
kommen!"
|
||||
rw [Fin.sum_univ_castSucc]
|
||||
simp
|
||||
@@ -56,9 +58,9 @@ Statement (m : ℕ) : (∑ i : Fin (m + 1), (i : ℕ)^3) = (∑ i : Fin (m + 1),
|
||||
|
||||
Der Golem schaut dich finster an.
|
||||
|
||||
**Robo**: Du willst `Fin.sum_univ_castSucc` auf der rechten Seite anwenden, aber es
|
||||
**Robo**: Du willst `sum_univ_castSucc` auf der rechten Seite anwenden, aber es
|
||||
gibt mehrere Orte, wo das Lemma passen würde.
|
||||
Deshalb musst du mit `rw [Fin.sum_univ_castSucc (n := {n} + 1)]` angeben, wo genau.
|
||||
Deshalb musst du mit `rw [sum_univ_castSucc (n := {n} + 1)]` angeben, wo genau.
|
||||
|
||||
**Du**: Was bedeutet das?
|
||||
|
||||
@@ -83,9 +85,10 @@ Statement (m : ℕ) : (∑ i : Fin (m + 1), (i : ℕ)^3) = (∑ i : Fin (m + 1),
|
||||
ring
|
||||
|
||||
NewLemma arithmetic_sum add_pow_two
|
||||
LemmaTab "Sum"
|
||||
|
||||
Conclusion "Der Golem denkt ganz lange nach, und ihr bekommt das Gefühl, dass er gar nie
|
||||
aggressive war, sondern nur eine sehr tiefe Stimme hat.
|
||||
aggressiv war, sondern nur eine sehr tiefe Stimme hat.
|
||||
|
||||
Mit einem kleinen Erdbeben setzt er sich hin und winkt euch dankend zu.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user