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/LeanStuff/L04_InstanceArguments.lean

79 lines
2.2 KiB
Plaintext

2 years ago
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
2 years ago
NewLemma Fin.sum_univ_castSucc
2 years ago
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."