levels
This commit is contained in:
@@ -13,6 +13,7 @@ import TestGame.Levels.LeanStuff
|
|||||||
import TestGame.Levels.SetTheory
|
import TestGame.Levels.SetTheory
|
||||||
import TestGame.Levels.Function
|
import TestGame.Levels.Function
|
||||||
import TestGame.Levels.SetFunction
|
import TestGame.Levels.SetFunction
|
||||||
|
import TestGame.Levels.LinearAlgebra
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -45,5 +46,6 @@ Path Predicate → Contradiction → LeanStuff → SetTheory → SetTheory2 →
|
|||||||
Path Predicate → Induction → LeanStuff → Function → SetFunction
|
Path Predicate → Induction → LeanStuff → Function → SetFunction
|
||||||
Path SetTheory2 → Numbers
|
Path SetTheory2 → Numbers
|
||||||
|
|
||||||
|
Path Module → Basis → Module2
|
||||||
|
|
||||||
MakeGame
|
MakeGame
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
import TestGame.Levels.LinearAlgebra.L01_Module
|
||||||
|
import TestGame.Levels.LinearAlgebra.L02_VectorNotation
|
||||||
|
import TestGame.Levels.LinearAlgebra.L03_VectorNotation
|
||||||
|
import TestGame.Levels.LinearAlgebra.L04_Submodule
|
||||||
|
import TestGame.Levels.LinearAlgebra.L05_Submodule
|
||||||
|
import TestGame.Levels.LinearAlgebra.L06_Span
|
||||||
|
import TestGame.Levels.LinearAlgebra.L07_Span
|
||||||
|
import TestGame.Levels.LinearAlgebra.L08_GeneratingSet
|
||||||
|
|
||||||
|
import TestGame.Levels.LinearAlgebra.M01_LinearMap
|
||||||
|
import TestGame.Levels.LinearAlgebra.M02_LinearIndep
|
||||||
|
import TestGame.Levels.LinearAlgebra.M04_Basis
|
||||||
|
import TestGame.Levels.LinearAlgebra.M05_Basis
|
||||||
|
|
||||||
|
import TestGame.Levels.LinearAlgebra.N01_Span
|
||||||
|
import TestGame.Levels.LinearAlgebra.N02_Span
|
||||||
|
import TestGame.Levels.LinearAlgebra.N03_Idempotent
|
||||||
|
import TestGame.Levels.LinearAlgebra.N04_Idempotent
|
||||||
|
import TestGame.Levels.LinearAlgebra.N05_Sum
|
||||||
|
import TestGame.Levels.LinearAlgebra.N06_Sum
|
||||||
|
import TestGame.Levels.LinearAlgebra.N07_Prod
|
||||||
|
import TestGame.Levels.LinearAlgebra.N08_Prod
|
||||||
|
import TestGame.Levels.LinearAlgebra.N09_Prod
|
||||||
|
|
||||||
|
Game "TestGame"
|
||||||
|
World "Module"
|
||||||
|
Title "Vektorraum"
|
||||||
|
|
||||||
|
Game "TestGame"
|
||||||
|
World "Basis"
|
||||||
|
Title "Lineare Abbildungen"
|
||||||
|
|
||||||
|
Game "TestGame"
|
||||||
|
World "Module2"
|
||||||
|
Title "Mehr Vektorräume"
|
||||||
@@ -0,0 +1,89 @@
|
|||||||
|
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]}
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
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
|
||||||
|
"
|
||||||
|
Häufig in der linearen Algebra hat man ganz einfach Vektoren über `ℚ` oder `ℝ`
|
||||||
|
und möchte diese explizit definieren.
|
||||||
|
|
||||||
|
Reele Vektorräume definiert man in Lean am besten als Funktion von einem Indexset.
|
||||||
|
|
||||||
|
So ist `Fin 2` eine Menge, die nur `0` und `1` enthält
|
||||||
|
und `ℚ²` wird als `Fin 2 → ℚ` definiert. Hier machen wir uns eine
|
||||||
|
lokale notation dafür:
|
||||||
|
|
||||||
|
```
|
||||||
|
notation `ℚ²` := Fin 2 → ℚ
|
||||||
|
```
|
||||||
|
|
||||||
|
Das mag auf den ersten Blick etwas unintuitiv erscheinen, hat aber den Vorteil,
|
||||||
|
dass man die ganze
|
||||||
|
Infrastruktur für Funktionen einfach direkt für Vektoren und
|
||||||
|
Matrizen mitgebrauchen kann.
|
||||||
|
|
||||||
|
Wir können uns auch noch ein paar andere standardmässige `ℚ`-Vektorräume definieren.
|
||||||
|
|
||||||
|
```
|
||||||
|
notation \"ℚ³\" => Fin 3 → ℚ
|
||||||
|
notation \"ℚ^(\" n \")\" => (Fin n) → ℚ
|
||||||
|
```
|
||||||
|
|
||||||
|
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.
|
||||||
|
"
|
||||||
|
|
||||||
|
notation "ℚ³" => Fin 3 → ℚ
|
||||||
|
notation "ℚ^(" n ")" => (Fin n) → ℚ
|
||||||
|
|
||||||
|
Statement
|
||||||
|
""
|
||||||
|
: ![ (2 : ℚ), 5 ] + ![ 1/2, -7 ] = ![5/2, -2] := by
|
||||||
|
funext i
|
||||||
|
fin_cases i <;>
|
||||||
|
simp <;>
|
||||||
|
ring
|
||||||
|
|
||||||
|
NewTactics fin_cases funext
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
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
|
||||||
|
|
||||||
|
Game "TestGame"
|
||||||
|
World "Module"
|
||||||
|
Level 3
|
||||||
|
|
||||||
|
Title "Konkrete Vektorräume"
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
"
|
||||||
|
Beachte dass Skalarmultiplikation mit `•` geschrieben wird, und nicht mit `*`!
|
||||||
|
"
|
||||||
|
|
||||||
|
Statement
|
||||||
|
""
|
||||||
|
: 5 • ![ (2 : ℚ), 5 ] + ![ 1, 0 ] = ![11, 25] := by
|
||||||
|
funext i
|
||||||
|
fin_cases i <;>
|
||||||
|
simp <;>
|
||||||
|
ring
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
import TestGame.Metadata
|
||||||
|
|
||||||
|
import Mathlib.Algebra.Module.Submodule.Lattice
|
||||||
|
|
||||||
|
Game "TestGame"
|
||||||
|
World "Module"
|
||||||
|
Level 4
|
||||||
|
|
||||||
|
Title "Untervektorräume"
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
"
|
||||||
|
Sei `K` ein Körper und `V` ein `K`-Modul.
|
||||||
|
|
||||||
|
```
|
||||||
|
variable {K V : Type _} [Field K]
|
||||||
|
variable [AddCommMonoid V] [Module K V]
|
||||||
|
```
|
||||||
|
|
||||||
|
Untermodule/Untervektorräume werden in Lean ein bisschen anders definiert als Module/Vektorräume.
|
||||||
|
|
||||||
|
Grob gesagt ist `V` ein Typ (denke z.B. an eine generelle Menge)
|
||||||
|
und `[module K V]` eine Instanz, die von Lean automatisc gefunden wird und
|
||||||
|
sagt, dass auf `V` eine `K`-Modulstruktur existiert. Hingegen ist `submodule K V` die Menge aller
|
||||||
|
Untermodulen
|
||||||
|
in `V`. Deshalb definieren wir Untermodule, indem wir Elemente aus dieser Menge auswählen:
|
||||||
|
|
||||||
|
```
|
||||||
|
variable (U : Submodule K V)
|
||||||
|
```
|
||||||
|
|
||||||
|
Unter anderem hat dies den Vorteil, dass `submodule K V` eine Lattice ist, also eine `≤`-Operation
|
||||||
|
besitzt. Auf dem Papier
|
||||||
|
schreibt man normalerweise `U₁ ⊆ U₂` um zu sagen, dass das eine Untermodul eine Teilmenge des
|
||||||
|
anderen ist, in Lean braucht
|
||||||
|
man dafür immer `≤`.
|
||||||
|
|
||||||
|
Ganz `V` als Untermodul von sich selbst betrachtet, schreibt man als `⊤` (`\\top`), also das
|
||||||
|
grösste Element in dieser Lattice,
|
||||||
|
und das Null-Untermodule `{0}` with als `⊥` geschrieben (`\\bot`), also das kleinste Element.
|
||||||
|
"
|
||||||
|
|
||||||
|
Statement
|
||||||
|
"Jeder Untervektorraum `U ⊆ V` ist eine Teilmenge von `V`."
|
||||||
|
{K V : Type _} [Field K] [AddCommMonoid V] [Module K V] (U : Submodule K V) : U ≤ ⊤ := by
|
||||||
|
simp only [le_top]
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
import TestGame.Metadata
|
||||||
|
|
||||||
|
import Mathlib.Algebra.Module.Submodule.Lattice
|
||||||
|
|
||||||
|
Game "TestGame"
|
||||||
|
World "Module"
|
||||||
|
Level 5
|
||||||
|
|
||||||
|
Title "Untervektorräume"
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
"
|
||||||
|
Elemente aus einem Untervektorraum $U$ wählt man gleich aus, wie Elemente in einer Menge.
|
||||||
|
Nämlich man nimmt ein Element `(x : V)` und sagt, dass es in `U` liegt mit `x ∈ U` (`\\in`).
|
||||||
|
"
|
||||||
|
|
||||||
|
Statement
|
||||||
|
"TODO: Spannendere Aufgaben."
|
||||||
|
{K V : Type _} [Field K] [AddCommMonoid V] [Module K V] (U : Submodule K V) :
|
||||||
|
∀ (x : V), x ∈ U ∨ x ∉ U := by
|
||||||
|
intro x
|
||||||
|
rw [or_iff_not_imp_left]
|
||||||
|
tauto
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
import TestGame.Metadata
|
||||||
|
|
||||||
|
import Mathlib.Algebra.Module.Submodule.Lattice
|
||||||
|
import Mathlib.Data.Real.Basic -- definiert `ℝ`
|
||||||
|
import Mathlib.Data.Fin.VecNotation -- Importiert Matrix/Vektor-Notation
|
||||||
|
--import Mathlib.LinearAlgebra.FinSupp -- contains `top_le_span_range_iff_forall_exists_fun`
|
||||||
|
import Mathlib.Tactic.FinCases
|
||||||
|
import Mathlib.Algebra.BigOperators.Finsupp -- default?
|
||||||
|
import Mathlib.LinearAlgebra.Span
|
||||||
|
|
||||||
|
Game "TestGame"
|
||||||
|
World "Module"
|
||||||
|
Level 6
|
||||||
|
|
||||||
|
Title "Hülle"
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
"
|
||||||
|
Ein typischer Untervektorraum ist die Hülle `⟨M⟩`, oder `span`, also die Menge aller
|
||||||
|
`K`-Linearkombinationen von Elementen aus der Menge `M`.
|
||||||
|
|
||||||
|
In Lean ist dies `Submodule.span K M`.
|
||||||
|
|
||||||
|
"
|
||||||
|
|
||||||
|
local notation "ℝ²" => Fin 2 → ℝ
|
||||||
|
|
||||||
|
open Submodule Set Finsupp
|
||||||
|
|
||||||
|
Statement mem_span_of_mem
|
||||||
|
"Zeige, dass $x \\in M$ auch Element von der $K$-linearen Hülle
|
||||||
|
\\langle M \\rangle ist."
|
||||||
|
{V K : Type _} [Field K] [AddCommMonoid V]
|
||||||
|
[Module K V] (M : Set V) {x : V} (h : x ∈ M) :
|
||||||
|
x ∈ span K M := by
|
||||||
|
rw [mem_span]
|
||||||
|
intro p hp
|
||||||
|
specialize hp h
|
||||||
|
assumption
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
import TestGame.Metadata
|
||||||
|
|
||||||
|
import Mathlib.Algebra.Module.Submodule.Lattice
|
||||||
|
import Mathlib.Data.Real.Basic -- definiert `ℝ`
|
||||||
|
import Mathlib.Data.Fin.VecNotation -- Importiert Matrix/Vektor-Notation
|
||||||
|
--import Mathlib.LinearAlgebra.FinSupp -- contains `top_le_span_range_iff_forall_exists_fun`
|
||||||
|
import Mathlib.Tactic.FinCases
|
||||||
|
import Mathlib.Algebra.BigOperators.Finsupp -- default?
|
||||||
|
import Mathlib.LinearAlgebra.Span
|
||||||
|
import Mathlib.Tactic.LibrarySearch
|
||||||
|
import Mathlib
|
||||||
|
|
||||||
|
Game "TestGame"
|
||||||
|
World "Module"
|
||||||
|
Level 7
|
||||||
|
|
||||||
|
Title "Hülle"
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
"
|
||||||
|
"
|
||||||
|
|
||||||
|
-- notation "ℝ²" => Fin 2 → ℝ
|
||||||
|
|
||||||
|
open Submodule Set Finsupp
|
||||||
|
|
||||||
|
open BigOperators -- Summen Notation
|
||||||
|
|
||||||
|
-- TODO: Why is this not in Mathlib?
|
||||||
|
lemma mem_span_of_mem {V K : Type _} [Field K] [AddCommMonoid V]
|
||||||
|
[Module K V] (M : Set V) {x : V} (h : x ∈ M) :
|
||||||
|
x ∈ span K M := by
|
||||||
|
rw [mem_span]
|
||||||
|
intro p hp
|
||||||
|
specialize hp h
|
||||||
|
assumption
|
||||||
|
|
||||||
|
Statement
|
||||||
|
"Für $x, y \\in M$, zeige dass $x + 2y$ in der $K$-linearen Hülle $\\langle M \\rangle$ liegt."
|
||||||
|
{V K : Type _} [Field K] [AddCommMonoid V] [Module K V] (M : Set V) {x y : V}
|
||||||
|
(h₁ : x ∈ M) (h₂ : y ∈ M) :
|
||||||
|
x + (2 : K) • y ∈ span K M := by
|
||||||
|
apply add_mem
|
||||||
|
apply mem_span_of_mem
|
||||||
|
assumption
|
||||||
|
apply smul_mem
|
||||||
|
apply mem_span_of_mem
|
||||||
|
assumption
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
import TestGame.Metadata
|
||||||
|
|
||||||
|
import Mathlib.Algebra.Module.Submodule.Lattice
|
||||||
|
import Mathlib.Data.Real.Basic -- definiert `ℝ`
|
||||||
|
import Mathlib.Data.Fin.VecNotation -- Importiert Matrix/Vektor-Notation
|
||||||
|
--import Mathlib.LinearAlgebra.FinSupp -- contains `top_le_span_range_iff_forall_exists_fun`
|
||||||
|
import Mathlib.Tactic.FinCases
|
||||||
|
import Mathlib.Algebra.BigOperators.Finsupp -- default?
|
||||||
|
import Mathlib.LinearAlgebra.Span
|
||||||
|
|
||||||
|
Game "TestGame"
|
||||||
|
World "Module"
|
||||||
|
Level 8
|
||||||
|
|
||||||
|
Title "Erzeugendensystem"
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
"
|
||||||
|
Dass eine Familie von Vektoren `M` den ganzen Vektorraum
|
||||||
|
aufspannt, sagt man in Lean mit `⊤ ≤ span K M`. (Man könnte auch `span K M = ⊤` schreiben,
|
||||||
|
aber per Konvention wird `≤` bevorzugt, da `x ≤ ⊤` immer gilt (siehe `le_top`))
|
||||||
|
"
|
||||||
|
|
||||||
|
-- notation "ℝ²" => Fin 2 → ℝ
|
||||||
|
|
||||||
|
open Submodule Set Finsupp
|
||||||
|
|
||||||
|
open BigOperators -- Summen Notation
|
||||||
|
|
||||||
|
Statement
|
||||||
|
"Zeige, dass `![1, 0], ![1, 1]` den ganzen `ℝ`-Vektorraum `ℝ²` aufspannt."
|
||||||
|
: ⊤ ≤ span ℝ (Set.range ![(![1, 0] : Fin 2 → ℝ), ![1, 1]]) := by
|
||||||
|
--rw [top_le_span_range_iff_forall_exists_fun]
|
||||||
|
sorry
|
||||||
|
-- intro v,
|
||||||
|
|
||||||
|
-- use ![v 0 - v 1, v 1],
|
||||||
|
-- simp,
|
||||||
|
-- funext i,
|
||||||
|
-- fin_cases i;
|
||||||
|
-- simp,
|
||||||
|
|
||||||
|
--NewLemmas top_le_span_range_iff_forall_exists_fun le_top
|
||||||
@@ -0,0 +1,91 @@
|
|||||||
|
import TestGame.Metadata
|
||||||
|
|
||||||
|
import Mathlib.Data.Real.Basic -- definiert `ℝ`
|
||||||
|
import Mathlib.Algebra.Module.LinearMap -- definiert `→ₗ`
|
||||||
|
import Mathlib.Tactic.FinCases
|
||||||
|
import Mathlib.Data.Fin.VecNotation
|
||||||
|
|
||||||
|
Game "TestGame"
|
||||||
|
World "Basis"
|
||||||
|
Level 1
|
||||||
|
|
||||||
|
notation "ℝ²" => Fin 2 → ℝ
|
||||||
|
|
||||||
|
Title "Lineare Abbildung"
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
"
|
||||||
|
Sei `R` ein Ring und `V W` zwei `R`-Moduln. Eine `R`-lineare Abbildung wird in Lean
|
||||||
|
folgendermassen geschrieben: `V →ₗ[R] W` (`\\to` + `\\_l`).
|
||||||
|
|
||||||
|
Man erstellt eine lineare Abbildung aus einer Funktion `f : V → W` zusammen mit den beweisen,
|
||||||
|
dass `f` Addition und Skalarmultiplikation erhält,
|
||||||
|
i.e. `f (x + y) = f x + f y` und `f (r • x) = r • f x`.
|
||||||
|
|
||||||
|
Hier definieren wir zum Beispiel die Null-Abbildung, die einfach alles auf `0` sendet:
|
||||||
|
|
||||||
|
```
|
||||||
|
variables {R V W : Type*} [ring R] [add_comm_monoid V] [add_comm_monoid W]
|
||||||
|
[module R V] [module R W]
|
||||||
|
|
||||||
|
def my_zero_map : V →ₗ[R] W :=
|
||||||
|
{ to_fun := λ x, 0,
|
||||||
|
map_add' :=
|
||||||
|
begin
|
||||||
|
intros,
|
||||||
|
simp,
|
||||||
|
end,
|
||||||
|
map_smul' :=
|
||||||
|
begin
|
||||||
|
intros,
|
||||||
|
simp,
|
||||||
|
end }
|
||||||
|
```
|
||||||
|
|
||||||
|
"
|
||||||
|
|
||||||
|
Statement
|
||||||
|
"
|
||||||
|
Zeige dass die Abbildung
|
||||||
|
|
||||||
|
```
|
||||||
|
ℝ² → ℝ²
|
||||||
|
(x, y) ↦ (5x + 2y, x - y)
|
||||||
|
```
|
||||||
|
|
||||||
|
`ℝ`-linear ist.
|
||||||
|
"
|
||||||
|
: ℝ² →ₗ[ℝ] ℝ² :=
|
||||||
|
{ toFun := fun v ↦ ![5 * (v 1) + 2 * (v 2), (v 1) - (v 2)]
|
||||||
|
map_add' := by
|
||||||
|
-- Wähle zwei beliebige Vektoren mit `intros` aus.
|
||||||
|
intro x y
|
||||||
|
-- Das Lemma `funext` sagt das zwei Funktionen identisch sind, wenn sie für jeden Wert ereinstimmen:
|
||||||
|
-- `(∀ i, f i = g i) → f = g`. Da Vektoren einfach als Funktionen von einem Indexset codiert sind,
|
||||||
|
-- kannst du mit `apply funext` komponentenweise rechnen.
|
||||||
|
funext i
|
||||||
|
-- Mit `fin_cases i` kannst du pro möglichem Wert von `i` ein Goal auftun. D.h. im ersten gilt dann
|
||||||
|
-- `i = 0`, im zweiten Goal `i = 1`.
|
||||||
|
fin_cases i
|
||||||
|
-- Dies ist der Fall `i = 0`.
|
||||||
|
-- Das Goal hat jetzt Terme der Form `![a, b] 0`, und du weisst was das sein sollte, nämlich
|
||||||
|
-- einfach der erste Komponent `a`. Die Taktik `simp` ist für solche Vereinfachungnen gedacht.
|
||||||
|
· simp
|
||||||
|
-- Einfache Rechenaufgaben hast du ja bereits gemacht.
|
||||||
|
-- `ring` oder `linarith` machen dies automatisch für dich.
|
||||||
|
ring
|
||||||
|
-- Und jetzt noch den Fall `i = 1`.
|
||||||
|
· simp
|
||||||
|
ring
|
||||||
|
map_smul' := by
|
||||||
|
intro r x
|
||||||
|
funext i
|
||||||
|
fin_cases i
|
||||||
|
-- Bemerkung: Wenn du jetzt `simp` brauchst, macht es sogar noch mehr als vorher.
|
||||||
|
-- Skalarmultiplikation ist einfach als komponentenweise Multiplikation definiert.
|
||||||
|
-- Entsprechend braucht `simp` ein Lemma `smul_eq_mul : a • b = a * b`.
|
||||||
|
· simp
|
||||||
|
ring
|
||||||
|
· simp
|
||||||
|
ring
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
import TestGame.Metadata
|
||||||
|
|
||||||
|
import Mathlib.Algebra.Module.Submodule.Lattice
|
||||||
|
import Mathlib.Data.Real.Basic -- definiert `ℝ`
|
||||||
|
import Mathlib.Algebra.Module.LinearMap -- definiert `→ₗ`
|
||||||
|
import Mathlib.Tactic.FinCases
|
||||||
|
import Mathlib.Data.Fin.VecNotation
|
||||||
|
-- import Mathlib.LinearAlgebra.Finsupp
|
||||||
|
import Mathlib.Algebra.BigOperators.Basic -- default
|
||||||
|
-- import Mathlib.LinearAlgebra.LinearIndependent
|
||||||
|
|
||||||
|
Game "TestGame"
|
||||||
|
World "Basis"
|
||||||
|
Level 2
|
||||||
|
|
||||||
|
Title "Lineare Unabhängigkeit"
|
||||||
|
|
||||||
|
--notation "ℝ²" => Fin 2 → ℝ
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
"
|
||||||
|
"
|
||||||
|
|
||||||
|
Statement
|
||||||
|
"Zeige, dass `![1, 0], ![1, 1]` linear unabhängig über `ℝ` sind."
|
||||||
|
: True := by -- linearIndependent ℝ ![(![1, 0] : ℝ²), ![1, 1]] := by
|
||||||
|
trivial
|
||||||
|
|
||||||
|
-- begin
|
||||||
|
-- rw fintype.linear_independent_iff,
|
||||||
|
-- intros c h,
|
||||||
|
-- simp at h,
|
||||||
|
-- intros i,
|
||||||
|
-- fin_cases i,
|
||||||
|
-- swap,
|
||||||
|
-- { exact h.2 },
|
||||||
|
-- { have h' := h.1,
|
||||||
|
-- rw [h.2, add_zero] at h',
|
||||||
|
-- exact h'}
|
||||||
|
-- end
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
import TestGame.Metadata
|
||||||
|
|
||||||
|
import Mathlib.Algebra.Module.Submodule.Lattice
|
||||||
|
|
||||||
|
Game "TestGame"
|
||||||
|
World "Basis"
|
||||||
|
Level 4
|
||||||
|
|
||||||
|
Title "Basis"
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
"
|
||||||
|
|
||||||
|
"
|
||||||
|
|
||||||
|
Statement
|
||||||
|
""
|
||||||
|
: True := by -- Basis (Fin 2) ℝ ℝ² := by
|
||||||
|
trivial
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
import TestGame.Metadata
|
||||||
|
|
||||||
|
import Mathlib.Algebra.Module.Submodule.Lattice
|
||||||
|
|
||||||
|
Game "TestGame"
|
||||||
|
World "Basis"
|
||||||
|
Level 5
|
||||||
|
|
||||||
|
Title "Lineare Abbildung"
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
"
|
||||||
|
|
||||||
|
"
|
||||||
|
|
||||||
|
Statement
|
||||||
|
""
|
||||||
|
: True := by
|
||||||
|
trivial
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
import TestGame.Metadata
|
||||||
|
|
||||||
|
import Mathlib.Algebra.Module.Submodule.Lattice
|
||||||
|
import Mathlib.Data.Real.Basic -- definiert `ℝ`
|
||||||
|
import Mathlib.Data.Fin.VecNotation -- Importiert Matrix/Vektor-Notation
|
||||||
|
--import Mathlib.LinearAlgebra.FinSupp -- contains `top_le_span_range_iff_forall_exists_fun`
|
||||||
|
import Mathlib.Tactic.FinCases
|
||||||
|
import Mathlib.Algebra.BigOperators.Finsupp -- default?
|
||||||
|
import Mathlib.LinearAlgebra.Span
|
||||||
|
|
||||||
|
Game "TestGame"
|
||||||
|
World "Module2"
|
||||||
|
Level 1
|
||||||
|
|
||||||
|
open Submodule
|
||||||
|
|
||||||
|
-- Verpackungswahn 1a)
|
||||||
|
Title "Verpackungswahn"
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
"
|
||||||
|
|
||||||
|
"
|
||||||
|
|
||||||
|
Statement
|
||||||
|
""
|
||||||
|
{K V : Type _} [Field K] [AddCommMonoid V] [Module K V] (M : Set V) :
|
||||||
|
span K ↑(span K M) = span K M := by
|
||||||
|
apply Submodule.span_eq
|
||||||
|
-- or : simp
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
import TestGame.Metadata
|
||||||
|
|
||||||
|
import Mathlib.Algebra.Module.Submodule.Lattice
|
||||||
|
import Mathlib.Data.Real.Basic -- definiert `ℝ`
|
||||||
|
import Mathlib.Data.Fin.VecNotation -- Importiert Matrix/Vektor-Notation
|
||||||
|
--import Mathlib.LinearAlgebra.FinSupp -- contains `top_le_span_range_iff_forall_exists_fun`
|
||||||
|
import Mathlib.Tactic.FinCases
|
||||||
|
import Mathlib.Algebra.BigOperators.Finsupp -- default?
|
||||||
|
import Mathlib.LinearAlgebra.Span
|
||||||
|
import Mathlib
|
||||||
|
|
||||||
|
open Submodule
|
||||||
|
|
||||||
|
Game "TestGame"
|
||||||
|
World "Module2"
|
||||||
|
Level 2
|
||||||
|
|
||||||
|
Title "Lineare Abbildung"
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
"
|
||||||
|
(Verpackungswahn)
|
||||||
|
If `f` is a function and `M` a subset of its domain, then
|
||||||
|
`f '' M` or `set.image f M` is the notation for the image, which is
|
||||||
|
usally denoted `f(M) = {y | ∃ x ∈ M, f(x) = y}` in mathematical texts.
|
||||||
|
"
|
||||||
|
|
||||||
|
-- TODO: This is blocked by
|
||||||
|
-- https://github.com/leanprover/lean4/issues/2074
|
||||||
|
|
||||||
|
set_option autoImplicit false
|
||||||
|
-- set_option pp.all true
|
||||||
|
|
||||||
|
Statement
|
||||||
|
"" : True := by
|
||||||
|
sorry
|
||||||
|
|
||||||
|
-- example {K V W : Type} [Field K] [AddCommMonoid V] [AddCommMonoid W]
|
||||||
|
-- [Module K V] [Module K W] (M : Set V) (f : V →ₗ[K] W) :
|
||||||
|
-- f '' span K M = @span K (f '' M) := by
|
||||||
|
-- sorry
|
||||||
|
|
||||||
|
-- example {K V : Type} [Field K] [AddCommMonoid V]
|
||||||
|
-- [Module K V] (M : Set V) (f : V →ₗ[K] V) : f '' M = f '' M = := by
|
||||||
|
-- rfl
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
import TestGame.Metadata
|
||||||
|
|
||||||
|
import Mathlib.Algebra.Module.Submodule.Lattice
|
||||||
|
import Mathlib.Data.Real.Basic
|
||||||
|
import Mathlib.LinearAlgebra.Basic
|
||||||
|
|
||||||
|
Game "TestGame"
|
||||||
|
World "Module2"
|
||||||
|
Level 3
|
||||||
|
|
||||||
|
Title "Lineare Abbildung"
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
"
|
||||||
|
|
||||||
|
"
|
||||||
|
|
||||||
|
Statement
|
||||||
|
""
|
||||||
|
{R V : Type _} [Semiring R] [AddCommGroup V] [Module R V]
|
||||||
|
(p : V →ₗ[R] V) (h : p ∘ p = p) : LinearMap.ker p ⊔ LinearMap.range p = ⊤ := by
|
||||||
|
sorry
|
||||||
|
-- rw eq_top_iff,
|
||||||
|
-- intros v hv,
|
||||||
|
|
||||||
|
-- rw ←sub_add_cancel v (p v),
|
||||||
|
|
||||||
|
-- apply submodule.add_mem_sup,
|
||||||
|
-- { rw [linear_map.mem_ker],
|
||||||
|
-- rw [map_sub],
|
||||||
|
-- change p v - (p ∘ p) v = 0, -- oder: rw [function.comp, function.funext_iff] at h,
|
||||||
|
-- rw h,
|
||||||
|
-- simp },
|
||||||
|
-- { simp }
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
import TestGame.Metadata
|
||||||
|
|
||||||
|
import Mathlib.Algebra.Module.Submodule.Lattice
|
||||||
|
import Mathlib.Data.Real.Basic
|
||||||
|
import Mathlib.LinearAlgebra.Basic
|
||||||
|
|
||||||
|
Game "TestGame"
|
||||||
|
World "Module2"
|
||||||
|
Level 4
|
||||||
|
|
||||||
|
Title "Lineare Abbildung"
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
"
|
||||||
|
|
||||||
|
"
|
||||||
|
|
||||||
|
Statement
|
||||||
|
""
|
||||||
|
{R V : Type _} [Semiring R] [AddCommGroup V] [Module R V]
|
||||||
|
(p : V →ₗ[R] V)(h : p ∘ p = p) : LinearMap.ker p ⊓ LinearMap.range p = ⊥ := by
|
||||||
|
sorry
|
||||||
|
-- rw eq_bot_iff,
|
||||||
|
-- intros v hv,
|
||||||
|
-- rw submodule.mem_bot,
|
||||||
|
-- rw submodule.mem_inf at hv,
|
||||||
|
-- cases hv.2 with w hw,
|
||||||
|
-- rw ←hw,
|
||||||
|
-- rw ←h,
|
||||||
|
-- change p (p w) = _,
|
||||||
|
-- rw hw,
|
||||||
|
-- rw ←linear_map.mem_ker,
|
||||||
|
-- exact hv.1,
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
import TestGame.Metadata
|
||||||
|
|
||||||
|
import Mathlib.Algebra.Module.Submodule.Lattice
|
||||||
|
import Mathlib.LinearAlgebra.Span
|
||||||
|
|
||||||
|
open Submodule
|
||||||
|
|
||||||
|
Game "TestGame"
|
||||||
|
World "Module2"
|
||||||
|
Level 5
|
||||||
|
|
||||||
|
Title "Lineare Abbildung"
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
"
|
||||||
|
Die interne Summe von Untermodulen wird in Lean mit `⊔` (`\\sup`) geschrieben.
|
||||||
|
"
|
||||||
|
|
||||||
|
Statement
|
||||||
|
"
|
||||||
|
Zeige, dass `V₁ ⊔ V₂` tatsächlich die interne Summe `⟨V₁ ∪ V₂⟩` ist.
|
||||||
|
"
|
||||||
|
{K V : Type _} [Field K] [AddCommMonoid V] [Module K V] (V₁ V₂ : Submodule K V) :
|
||||||
|
V₁ ⊔ V₂ = span K ( (V₁ : Set V) ∪ V₂ ) := by
|
||||||
|
rw [span_union]
|
||||||
|
simp
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
import TestGame.Metadata
|
||||||
|
|
||||||
|
import Mathlib.Algebra.Module.Submodule.Lattice
|
||||||
|
import Mathlib.LinearAlgebra.Span
|
||||||
|
|
||||||
|
open Submodule
|
||||||
|
|
||||||
|
Game "TestGame"
|
||||||
|
World "Module2"
|
||||||
|
Level 6
|
||||||
|
|
||||||
|
Title "Lineare Abbildung"
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
"
|
||||||
|
Eine interne Summe über eine Familie von Untermodulen `(T : ι → submodule K V)`
|
||||||
|
wird als `⨆ (i : ι), T i` geschrieben (`\\supr`).
|
||||||
|
"
|
||||||
|
|
||||||
|
Statement
|
||||||
|
""
|
||||||
|
{K V ι : Type _} [Field K] [AddCommMonoid V] [Module K V]
|
||||||
|
(T : ι → Submodule K V) : (⨆ (i : ι), T i) = span K ( ⋃ i, T i) := by
|
||||||
|
rw [Submodule.span_unionᵢ]
|
||||||
|
simp
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
import TestGame.Metadata
|
||||||
|
|
||||||
|
import Mathlib.Algebra.Module.Submodule.Lattice
|
||||||
|
import Mathlib.Data.Real.Basic
|
||||||
|
import Mathlib.LinearAlgebra.Span
|
||||||
|
|
||||||
|
Game "TestGame"
|
||||||
|
World "Module2"
|
||||||
|
Level 7
|
||||||
|
|
||||||
|
Title "Lineare Abbildung"
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
"
|
||||||
|
Die externe Summe von (Unter-) Modulen wird als `V × W` geschrieben
|
||||||
|
Das Produkt zweier Module wird mit `×` geschrieben.
|
||||||
|
|
||||||
|
Lean weiss dann automatisch, dass das Produkt wieder ein Vektorraum ist.
|
||||||
|
-/
|
||||||
|
example : module ℝ (ℝ × ℝ) := infer_instance
|
||||||
|
|
||||||
|
/-
|
||||||
|
Und `ℝ × ℝ` und `fin 2 → ℝ` sind natürlich Isomorph. In Praxis eignet sich
|
||||||
|
die Funktionsschreibweise besser, deshalb verwenden wir diese als
|
||||||
|
definition für `ℝ²`.
|
||||||
|
|
||||||
|
Hier die Äquivalenz als generelle Typen:
|
||||||
|
-/
|
||||||
|
example : (fin 2 → ℝ) ≃ ℝ × ℝ :=
|
||||||
|
begin
|
||||||
|
apply pi_fin_two_equiv,
|
||||||
|
end
|
||||||
|
|
||||||
|
/-
|
||||||
|
Äquivalenz als Vektorräume schreibt man als `ℝ`-lineare Äquivalenz `≃ₗ[ℝ]`.
|
||||||
|
"
|
||||||
|
|
||||||
|
Statement
|
||||||
|
"Zeige dass das Produkt `ℝ × ℝ` und `ℝ²` isomorph sind als `ℝ`-Vektorräume."
|
||||||
|
: ((Fin 2) → ℝ) ≃ₗ[ℝ] ℝ × ℝ := by
|
||||||
|
sorry
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
import TestGame.Metadata
|
||||||
|
|
||||||
|
import Mathlib.Algebra.Module.Submodule.Lattice
|
||||||
|
import Mathlib.Data.Real.Basic
|
||||||
|
import Mathlib.LinearAlgebra.Span
|
||||||
|
|
||||||
|
universe u
|
||||||
|
|
||||||
|
Game "TestGame"
|
||||||
|
World "Module2"
|
||||||
|
Level 8
|
||||||
|
|
||||||
|
Title "Lineare Abbildung"
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
"
|
||||||
|
Eine Familie von Vektorräumen schreibt man erst einmal als Funktion einer Indexmenge `ι`.
|
||||||
|
-/
|
||||||
|
|
||||||
|
variables {ι : Type u} {V : ι → Type u}
|
||||||
|
|
||||||
|
/-
|
||||||
|
Für einen einzelnen Vektorraum würde man jetzt Instanzen `[add_comm_monoid V] [module K V]`
|
||||||
|
definieren. Lean-Instanzen-Manager versteht hier `∀`-Ausdrücke:
|
||||||
|
-/
|
||||||
|
|
||||||
|
variables [∀i, add_comm_monoid (V i)] [∀i, module K (V i)]
|
||||||
|
|
||||||
|
/-
|
||||||
|
Ein externes Produkt von Vektorräumen schreibt man einfach mit `\\Pi`, also `Π i, V i`.
|
||||||
|
|
||||||
|
Lean kann aus den Ausdrücken oben dann automatisch herausfinden, dass `Π i, V i`
|
||||||
|
ein `K`-Vektorraum ist:
|
||||||
|
"
|
||||||
|
|
||||||
|
Statement
|
||||||
|
"Sei `U` ein `K`-Vektorraum und `fᵢ : U → Vᵢ` eine Familie von `K`-lineare Abbildungen
|
||||||
|
in `K`-Vektorräume. Dann gibt es genau eine Abbildung `f : U → (Π i, V i)`, die mit
|
||||||
|
allen kommutiert."
|
||||||
|
{K U : Type u} [Field K] {ι : Type u} {V : ι → Type u}
|
||||||
|
[∀ i, AddCommMonoid (V i)] [∀ i, Module K (V i)]
|
||||||
|
[AddCommMonoid U] [Module K U]
|
||||||
|
(f : ∀ i, U →ₗ[K] (V i)) : U →ₗ[K] (∀ i, V i) := by
|
||||||
|
sorry
|
||||||
|
-- { to_fun := λv i, f i v,
|
||||||
|
-- map_add' :=
|
||||||
|
-- begin
|
||||||
|
-- intros,
|
||||||
|
-- funext,
|
||||||
|
-- simp,
|
||||||
|
-- end,
|
||||||
|
-- map_smul' :=
|
||||||
|
-- begin
|
||||||
|
-- intros,
|
||||||
|
-- funext,
|
||||||
|
-- simp,
|
||||||
|
-- end }
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
import TestGame.Metadata
|
||||||
|
|
||||||
|
import Mathlib.Algebra.Module.Submodule.Lattice
|
||||||
|
import Mathlib.Data.Real.Basic
|
||||||
|
import Mathlib.LinearAlgebra.Span
|
||||||
|
|
||||||
|
Game "TestGame"
|
||||||
|
World "Module2"
|
||||||
|
Level 9
|
||||||
|
|
||||||
|
Title "Lineare Abbildung"
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
"
|
||||||
|
|
||||||
|
"
|
||||||
|
|
||||||
|
universe u
|
||||||
|
|
||||||
|
variable {K : Type u} [Field K]
|
||||||
|
variable {ι : Type u} {V : ι → Type u}
|
||||||
|
variable [∀i, AddCommMonoid (V i)] [∀i, Module K (V i)]
|
||||||
|
|
||||||
|
/-
|
||||||
|
Ein externes Summe von Vektorräumen schreibt man mit `\Pi\0`, also `Π₀ i, V i`.
|
||||||
|
Das Suffix `_₀` wird in Mathlib häufig dafür verwendet "endlichen Support" zu bezeichnen.
|
||||||
|
|
||||||
|
-/
|
||||||
|
example : Module K (Π₀ i, V i) := inferInstance
|
||||||
|
|
||||||
|
variable {U : Type u} [AddCommMonoid U] [Module K U]
|
||||||
|
|
||||||
|
Statement
|
||||||
|
"" : True := by
|
||||||
|
sorry
|
||||||
|
|
||||||
|
-- -- :(
|
||||||
|
-- variable [decidable_eq ι]
|
||||||
|
-- variable [Π (i : ι) (x : V i), decidable (x ≠ 0)]
|
||||||
|
|
||||||
|
-- def my_sum_map (f : Π i, V i →ₗ[K] U) : (Π₀ i, V i) →ₗ[K] U :=
|
||||||
|
-- { to_fun := λ x, x.sum (λ i, (f i)),
|
||||||
|
-- map_add' :=
|
||||||
|
-- begin
|
||||||
|
-- intros,
|
||||||
|
-- funext,
|
||||||
|
-- sorry,
|
||||||
|
-- end,
|
||||||
|
-- map_smul' :=
|
||||||
|
-- begin
|
||||||
|
-- intros,
|
||||||
|
-- funext,
|
||||||
|
-- simp,
|
||||||
|
-- sorry
|
||||||
|
-- end }
|
||||||
|
|
||||||
|
-- Statement
|
||||||
|
-- "Sei `U` ein `K`-Vektorraum und `fᵢ : Vᵢ → U` eine Familie von `K`-lineare Abbildungen
|
||||||
|
-- in `K`-Vektorräume. Dann gibt es genau eine Abbildung `f : (Π₀ i, V i) → U`, die mit
|
||||||
|
-- allen kommutiert."
|
||||||
|
-- (f : ∀ i, V i →ₗ[K] U) :
|
||||||
|
-- ∃! (g : (Π₀ i, V i) →ₗ[K] U), (∀ i v, f i v = g (dfinsupp.single i v)) :=
|
||||||
|
-- by
|
||||||
|
-- let g := my_sum_map f,
|
||||||
|
-- use g,
|
||||||
|
-- constructor,
|
||||||
|
-- { simp,
|
||||||
|
-- intros,
|
||||||
|
-- sorry },
|
||||||
|
-- { intros g' h,
|
||||||
|
-- apply linear_map.ext,
|
||||||
|
-- intro x,
|
||||||
|
-- sorry
|
||||||
|
-- -- change (λ i, g' x i) = λ i, f i x, -- Wieso?
|
||||||
|
-- -- funext,
|
||||||
|
-- -- symmetry,
|
||||||
|
-- -- apply h,
|
||||||
|
-- }
|
||||||
@@ -45,7 +45,7 @@ Als Abschlussübung kannst du folgende Äquivalenz zeigen:
|
|||||||
|
|
||||||
Statement
|
Statement
|
||||||
"TODO":
|
"TODO":
|
||||||
True := by
|
True := by
|
||||||
trivial
|
trivial
|
||||||
|
|
||||||
Conclusion ""
|
Conclusion ""
|
||||||
|
|||||||
Reference in New Issue
Block a user