|
|
import TestGame.Metadata
|
|
|
|
|
|
import Mathlib.Data.Real.Basic -- definiert `ℝ`
|
|
|
import Mathlib.Algebra.Module.Pi -- definiert `Module ℚ (fin 2 → ℚ)`
|
|
|
import Mathlib.Data.Fin.VecNotation
|
|
|
import Mathlib.Tactic.FinCases
|
|
|
|
|
|
set_option tactic.hygienic false
|
|
|
|
|
|
Game "TestGame"
|
|
|
World "Module"
|
|
|
Level 2
|
|
|
|
|
|
Title "Konkrete Vektorräume"
|
|
|
|
|
|
Introduction
|
|
|
"
|
|
|
Den $\\mathbb{Q}$-Vektorraum $\\mathbb{Q}^3$ definiert man am besten mit
|
|
|
der lokalen Notation
|
|
|
|
|
|
```
|
|
|
local notation `ℚ³` := Fin 3 → ℚ
|
|
|
```
|
|
|
|
|
|
Dabei ist `Fin 3` die Indexmenge $\\{0, 1, 2\\}$.
|
|
|
|
|
|
Die schreibweise für einen Vektor ist `![ _, _ ]`. Zu beachten ist,
|
|
|
dass man bei Zahlen explizit einen Typ angeben muss, sonst denkt sich
|
|
|
Lean, man arbeite über `ℕ`.
|
|
|
|
|
|
Um direkt Vektoroperationen über `ℚ` auszurechnen, kann man oft
|
|
|
`#eval` benützen:
|
|
|
|
|
|
```
|
|
|
#eval ![ (2 : ℚ), 5 ] + ![ 1/2, -7 ]
|
|
|
```
|
|
|
zeigt `![5/2, -2]` an.
|
|
|
|
|
|
Um eine Gleichheit in einem Beweis zu verwenden, muss man andere Taktiken
|
|
|
benützen.
|
|
|
|
|
|
Am hilfreichsten ist die kombination `funext i, fin_cases i`, die
|
|
|
Dann eine Vektorgleichung komponentenweise aufteilt.
|
|
|
|
|
|
Für jede Komponente kann man dann mit `simp` und `ring` weiterkommen.
|
|
|
"
|
|
|
|
|
|
local notation "ℚ³" => Fin 3 → ℚ
|
|
|
local notation "ℚ^(" n ")" => (Fin n) → ℚ
|
|
|
|
|
|
Statement
|
|
|
""
|
|
|
: ![ (2 : ℚ), 5 ] + ![ 1/2, -7 ] = ![5/2, -2] := by
|
|
|
funext i
|
|
|
fin_cases i <;>
|
|
|
simp <;>
|
|
|
ring
|
|
|
|
|
|
NewTactic fin_cases funext
|