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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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."