|
|
|
|
import TestGame.Metadata
|
|
|
|
|
|
|
|
|
|
import Mathlib
|
|
|
|
|
import TestGame.Options.BigOperators
|
|
|
|
|
|
|
|
|
|
set_option tactic.hygienic false
|
|
|
|
|
|
|
|
|
|
Game "TestGame"
|
|
|
|
|
World "LeanStuff"
|
|
|
|
|
Level 4
|
|
|
|
|
|
|
|
|
|
Title "Instanz-Argumente"
|
|
|
|
|
|
|
|
|
|
Introduction
|
|
|
|
|
"
|
|
|
|
|
Bezüglich impliziten Argumente gibt es noch einige weitere Punkte oder Tricks,
|
|
|
|
|
die man wissen sollte.
|
|
|
|
|
|
|
|
|
|
* Instanz-Argumente wie `[Ring R]` sind auch impilzite Argumente. Der Unterschied ist, dass
|
|
|
|
|
Lean einen anderen Mechanismus braucht, um diese zu füllen: Es sucht nach einer entsprechenden
|
|
|
|
|
*Instanz* und, setzt die erste solche Instanz ein.
|
|
|
|
|
Ausserhalb eines Beweises könnte man auch mit
|
|
|
|
|
```
|
|
|
|
|
#synth Ring ℤ
|
|
|
|
|
```
|
|
|
|
|
testen, ob Lean eine ensprechende Instanz findet. Instanzen werden dafür gebraucht, Typen
|
|
|
|
|
mit (algebraischer) Stukturen zu versehen.
|
|
|
|
|
* Ein `_` irgendwo im Lean-Code ist immer ein Platzhalter, den Lean versucht aus dem Kontext zu
|
|
|
|
|
füllen. Das kann praktisch sein, wenn man etwas nicht ausschreiben will, das offensichtlich ist.
|
|
|
|
|
* Mit `@` kann man forcieren, dass alle Argumente explizit sind.
|
|
|
|
|
Für ein Lemma
|
|
|
|
|
```
|
|
|
|
|
lemma not_or_of_imp {A B : Prop} (h : A → B) :
|
|
|
|
|
¬A ∨ B := sorry
|
|
|
|
|
```
|
|
|
|
|
heisst das zum Beispiel dass `not_or_of_imp g` das gleiche ist wie
|
|
|
|
|
`@not_or_of_imp _ _ g`.
|
|
|
|
|
|
|
|
|
|
Und `Fin.sum_univ_castSucc (n := m + 1)` könnte man auch als
|
|
|
|
|
`@Fin.sum_univ_castSucc _ _ (m + 1)` schreiben.
|
|
|
|
|
"
|
|
|
|
|
|
|
|
|
|
open BigOperators
|
|
|
|
|
|
|
|
|
|
Statement
|
|
|
|
|
"Zeige $(\\sum_{i=0}^{m} i) + (m + 1) = \\sum_{i=0}^{m + 1} i$."
|
|
|
|
|
(m : ℕ) :
|
|
|
|
|
∑ i : Fin (m + 1), (i : ℕ) + (m + 1) = ∑ i : Fin (Nat.succ m + 1), ↑i := by
|
|
|
|
|
rw [Fin.sum_univ_castSucc (n := m + 1)]
|
|
|
|
|
rfl
|
|
|
|
|
|
|
|
|
|
OnlyTactic rw rfl
|
|
|
|
|
|
|
|
|
|
NewLemma Fin.sum_univ_castSucc
|
|
|
|
|
|
|
|
|
|
Hint (m : ℕ) :
|
|
|
|
|
∑ i : Fin (m + 1), (i : ℕ) + (m + 1) = ∑ i : Fin (Nat.succ m + 1), ↑i =>
|
|
|
|
|
"
|
|
|
|
|
Probier nochmals das gleiche, diesmal mit
|
|
|
|
|
```
|
|
|
|
|
rw [@Fin.sum_univ_castSucc _ _ (m + 1)]
|
|
|
|
|
```
|
|
|
|
|
anstatt
|
|
|
|
|
```
|
|
|
|
|
rw [Fin.sum_univ_castSucc (n := m + 1)]
|
|
|
|
|
```
|
|
|
|
|
"
|
|
|
|
|
|
|
|
|
|
Hint (m : ℕ) :
|
|
|
|
|
∑ i : Fin m, (Fin.castSucc.toEmbedding i : ℕ) + ↑(Fin.last m) + (m + 1) =
|
|
|
|
|
∑ i : Fin (Nat.succ m + 1), ↑i =>
|
|
|
|
|
"Sackgasse!"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Hint (m : ℕ) :
|
|
|
|
|
∑ i : Fin (m + 1), (i : ℕ) + (m + 1) =
|
|
|
|
|
∑ i : Fin (m + 1), ↑i + (m + 1) =>
|
|
|
|
|
"Jetzt sind beide Seiten gleich und das Goal kann mit `rfl` geschlossen werden."
|