levels and custom induction

This commit is contained in:
Jon Eugster
2023-03-31 17:52:39 +02:00
parent c8b0ac4e6c
commit 9b25eda668
28 changed files with 225 additions and 88 deletions
+13 -12
View File
@@ -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.
+14 -12
View File
@@ -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."
+24 -17
View File
@@ -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."
+8 -2
View File
@@ -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"
+3 -1
View File
@@ -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,
+7 -4
View File
@@ -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.