|
|
import TestGame.Metadata
|
|
|
|
|
|
import Mathlib.Data.Real.Basic -- definiert `ℝ`
|
|
|
import Mathlib.Algebra.Module.Basic -- definiert `module`
|
|
|
import Mathlib.Tactic.LibrarySearch
|
|
|
|
|
|
set_option tactic.hygienic false
|
|
|
|
|
|
Game "TestGame"
|
|
|
World "Module"
|
|
|
Level 1
|
|
|
|
|
|
Title "Module"
|
|
|
|
|
|
Introduction
|
|
|
"
|
|
|
Vektorräume sind in Lean etwas algemeiner definiert, als dies normalerweise in
|
|
|
einer Einführungsvorlesung antrifft: Man definiert ein \"Modul\" (Plural: Moduln)
|
|
|
über einem Ring. Ein Modul über einem Körper wird auch \"Vektorraum\" genannt.
|
|
|
Konkret heisst das:
|
|
|
|
|
|
Sei `R` ein Ring. Ein `R`-Modul ist eine kommutative Gruppe `(V, +)` zusammen mit
|
|
|
einer Abbildung `• : R × V → V` (Skalarmultiplitation genannt), die folgende
|
|
|
Eigenschaften beliebige `(r s : R)` und `(v w : V)`erfüllt:
|
|
|
- `r • (v + w) = r • v + r • w`
|
|
|
- `(r + s) • v = r • v + s • v`
|
|
|
- `(r * s) • v = r • s • v`
|
|
|
- `1 • r = r`
|
|
|
- `0 • v = 0`
|
|
|
- `r • 0 = 0`
|
|
|
|
|
|
Bemerkungen:
|
|
|
1) Über einem `[field R]` sind die letzten beiden Eigenschaften überflüssig, diese kann
|
|
|
man beweisen, wenn man Cancellation (`a₁ + x = a₂ + x → a₁ = a₂`) hat. In einem generellen
|
|
|
Ring, muss das aber nicht gegeben sein (siehe Nullteiler).
|
|
|
2) Die nötigen Annahmen um ein Modul in Lean zu erhalten sind tatsächlich noch etwas lockerer,
|
|
|
so muss `R` nicht ganz ein Ring sein (nur `[semiring R]`) und
|
|
|
`V` muss nicht ganz eine kommutative Gruppe sein (nur `[add_comm_monoid V]`).
|
|
|
|
|
|
|
|
|
Einen abstrakten Vektorraum definiert man wie folgt:
|
|
|
`variables {R V : Type*} [field R] [add_comm_monoid V] [module R V]`
|
|
|
|
|
|
Wenn man hingegen konkret zeigen will, dass ein existierendes Objekt ein Vektorraum ist,
|
|
|
kann man eine einsprechende Instanz wie folgt definieren:
|
|
|
|
|
|
```
|
|
|
instance Q_module : Module ℚ ℝ :=
|
|
|
{ smul := λa r, ↑a * r
|
|
|
smul_zero := _
|
|
|
zero_smul := _
|
|
|
one_smul := _
|
|
|
smul_add := _
|
|
|
add_smul := _
|
|
|
mul_smul := _ }
|
|
|
```
|
|
|
Man muss also angeben, welche Skalarmultiplikation man gerne hätte
|
|
|
(`smul`. In unserem Fall sagen wir einfach, diese soll Multiplikation in `ℝ` sein.)
|
|
|
und dazu jegliche Beweise, dass die Skalarmultiplikation sich mit der Ringstruktur verträgt.
|
|
|
Im nachfolgenden beweisen wir die Eigenschaften einzeln.
|
|
|
"
|
|
|
|
|
|
Statement
|
|
|
"Zeige, dass $\\mathbb{R}$ ein $\\mathbb{Q}$-Modul ist."
|
|
|
: Module ℚ ℝ :=
|
|
|
{ smul := fun a r ↦ ↑a * r,
|
|
|
smul_zero := by
|
|
|
intro a
|
|
|
rw [smul_zero]
|
|
|
zero_smul := by
|
|
|
intro a
|
|
|
change (0 : ℚ) * a = 0
|
|
|
simp
|
|
|
one_smul := by
|
|
|
intro b
|
|
|
change (1 : ℚ) * b = b
|
|
|
rw [Rat.cast_one, one_mul]
|
|
|
smul_add := by
|
|
|
intro a x y
|
|
|
change a * (x + y) = a * x + a * y
|
|
|
rw [mul_add]
|
|
|
add_smul := by
|
|
|
intro r s x
|
|
|
change (r + s : ℚ) * x = r * x + s * x
|
|
|
rw [Rat.cast_add, add_mul]
|
|
|
mul_smul := by
|
|
|
intro x y b
|
|
|
change (x * y : ℚ) * b = x * (y * b)
|
|
|
rw [Rat.cast_mul, mul_assoc]}
|