lemma docs and levels

pull/54/head
Jon Eugster 2 years ago
parent 0fc992e330
commit 10a12a8e77

@ -34,7 +34,7 @@ Path Predicate → Inequality → Sum
-- Path Inequality → Prime -- Path Inequality → Prime
-- Path Sum → Inequality -- → Induction -- Path Sum → Inequality -- → Induction
Path Lean → SetTheory → SetTheory2 → SetFunction Path Lean → SetTheory → SetTheory2 → SetFunction → Module
Path Lean → Function → SetFunction Path Lean → Function → SetFunction

@ -84,9 +84,6 @@ This lemma says `∀ a : , a + 0 = a`.
## Eigenschaften ## Eigenschaften
* `simp`-Lemma:
* Namespace: `-`
* Minimal Import: `Mathlib.`
* Mathlib Doc" * Mathlib Doc"
LemmaDoc add_succ as "add_succ" in "Addition" LemmaDoc add_succ as "add_succ" in "Addition"
@ -94,9 +91,6 @@ LemmaDoc add_succ as "add_succ" in "Addition"
## Eigenschaften ## Eigenschaften
* `simp`-Lemma:
* Namespace: `-`
* Minimal Import: `Mathlib.`
* Mathlib Doc: [#]()" * Mathlib Doc: [#]()"
LemmaDoc not_forall as "not_forall" in "Logic" LemmaDoc not_forall as "not_forall" in "Logic"
@ -223,6 +217,7 @@ LemmaDoc Subset.antisymm_iff as "Subset.antisymm_iff" in "Set"
`Set.Subset.antisymm_iff {α : Type u} {a : Set α} {b : Set α} : a = b ↔ a ⊆ b ∧ b ⊆ a` `Set.Subset.antisymm_iff {α : Type u} {a : Set α} {b : Set α} : a = b ↔ a ⊆ b ∧ b ⊆ a`
Zwei Mengen sind identisch, wenn sowohl $A \\subseteq B$ wie auch $B \\subseteq A$. Zwei Mengen sind identisch, wenn sowohl $A \\subseteq B$ wie auch $B \\subseteq A$.
## Details ## Details
`rw [Subset.antisymm_iff]` ist eine Möglichkeit Gleichungen von Mengen zu zeigen. `rw [Subset.antisymm_iff]` ist eine Möglichkeit Gleichungen von Mengen zu zeigen.
@ -240,60 +235,57 @@ für eine verwandte Version.
" "
LemmaDoc Nat.prime_def_lt'' as "Nat.prime_def_lt''" in "Nat" LemmaDoc Nat.prime_def_lt'' as "prime_def_lt''" in "Nat"
" "
`Nat.prime_def_lt'' {p : } :
Nat.Prime p ↔ 2 ≤ p ∧ ∀ (m : ), m p → m = 1 m = p`
Die bekannte Definition einer Primmzahl in ``: Eine Zahl (`p ≥ 2`) mit genau zwei Teilern.
## Eigenschaften ## Eigenschaften
* `simp`-Lemma: * `simp`-Lemma: Nein
* Namespace: `-` * Namespace: `Nat`
* Minimal Import: `Mathlib.` * Mathlib Doc: [#Nat.prime_def_lt''](https://leanprover-community.github.io/mathlib4_docs/Mathlib/Data/Nat/Prime.html#Nat.prime_def_lt'')
* Mathlib Doc: [#]()
" "
LemmaDoc Finset.sum_add_distrib as "Finset.sum_add_distrib" in "Sum" LemmaDoc Finset.sum_add_distrib as "sum_add_distrib" in "Sum"
" "
## Eigenschaften ## Eigenschaften
* `simp`-Lemma: * `simp`-Lemma: Nein
* Namespace: `-` * Namespace: `Finset`
* Minimal Import: `Mathlib.` * Mathlib Doc: [#Finset.sum_add_distrib](https://leanprover-community.github.io/mathlib4_docs/Mathlib/Algebra/BigOperators/Basic.html#Finset.sum_add_distrib)
* Mathlib Doc: [#]()
" "
LemmaDoc Fin.sum_univ_castSucc as "Fin.sum_univ_castSucc" in "Sum" LemmaDoc Fin.sum_univ_castSucc as "sum_univ_castSucc" in "Sum"
" "
## Eigenschaften ## Eigenschaften
* `simp`-Lemma: * `simp`-Lemma: Nein
* Namespace: `-` * Namespace: `Fin`
* Minimal Import: `Mathlib.` * Mathlib Doc: [#sum_univ_castSucc](https://leanprover-community.github.io/mathlib4_docs/Mathlib/Algebra/BigOperators/Fin.html#Fin.sum_univ_castSucc)
* Mathlib Doc: [#]()
" "
LemmaDoc Nat.succ_eq_add_one as "Nat.succ_eq_add_one" in "Sum" LemmaDoc Nat.succ_eq_add_one as "succ_eq_add_one" in "Sum"
" "
## Eigenschaften ## Eigenschaften
* `simp`-Lemma: * `simp`-Lemma: Nein
* Namespace: `-` * Namespace: `Nat`
* Minimal Import: `Mathlib.` * Mathlib Doc: [#succ_eq_add_one](https://leanprover-community.github.io/mathlib4_docs/Init/Data/Nat/Basic.html#Nat.succ_eq_add_one)
* Mathlib Doc: [#]()
" "
LemmaDoc Nat.zero_eq as "Nat.succ_eq_add_one" in "Sum" LemmaDoc Nat.zero_eq as "zero_eq" in "Sum"
" "
## Eigenschaften ## Eigenschaften
* `simp`-Lemma: * Mathlib Doc: [#zero_eq](https://leanprover-community.github.io/mathlib4_docs/Init/Data/Nat/Basic.html#Nat.zero_eq)
* Namespace: `-`
* Minimal Import: `Mathlib.`
* Mathlib Doc: [#]()
" "
LemmaDoc add_comm as "add_comm" in "Nat" LemmaDoc add_comm as "add_comm" in "Nat"
@ -301,10 +293,7 @@ LemmaDoc add_comm as "add_comm" in "Nat"
## Eigenschaften ## Eigenschaften
* `simp`-Lemma: * Mathlib Doc: [#add_comm](https://leanprover-community.github.io/mathlib4_docs/Mathlib/Algebra/Group/Defs.html#add_comm)
* Namespace: `-`
* Minimal Import: `Mathlib.`
* Mathlib Doc: [#]()
" "
LemmaDoc mul_add as "mul_add" in "Nat" LemmaDoc mul_add as "mul_add" in "Nat"
@ -312,10 +301,7 @@ LemmaDoc mul_add as "mul_add" in "Nat"
## Eigenschaften ## Eigenschaften
* `simp`-Lemma: * Mathlib Doc: [#mul_add](https://leanprover-community.github.io/mathlib4_docs/Mathlib/Algebra/Ring/Defs.html#mul_add)
* Namespace: `-`
* Minimal Import: `Mathlib.`
* Mathlib Doc: [#]()
" "
LemmaDoc add_mul as "add_mul" in "Nat" LemmaDoc add_mul as "add_mul" in "Nat"
@ -323,10 +309,7 @@ LemmaDoc add_mul as "add_mul" in "Nat"
## Eigenschaften ## Eigenschaften
* `simp`-Lemma: * Mathlib Doc: [#add_mul](https://leanprover-community.github.io/mathlib4_docs/Mathlib/Algebra/Ring/Defs.html#add_mul)
* Namespace: `-`
* Minimal Import: `Mathlib.`
* Mathlib Doc: [#]()
" "
LemmaDoc arithmetic_sum as "arithmetic_sum" in "Sum" LemmaDoc arithmetic_sum as "arithmetic_sum" in "Sum"
@ -334,10 +317,7 @@ LemmaDoc arithmetic_sum as "arithmetic_sum" in "Sum"
## Eigenschaften ## Eigenschaften
* `simp`-Lemma: * Not a mathlib lemma.
* Namespace: `-`
* Minimal Import: `Mathlib.`
* Mathlib Doc: [#]()
" "
LemmaDoc add_pow_two as "add_pow_two" in "Nat" LemmaDoc add_pow_two as "add_pow_two" in "Nat"
@ -345,10 +325,7 @@ LemmaDoc add_pow_two as "add_pow_two" in "Nat"
## Eigenschaften ## Eigenschaften
* `simp`-Lemma: * Mathlib Doc: [#add_pow_two](https://leanprover-community.github.io/mathlib4_docs/Mathlib/Algebra/GroupPower/Ring.html#add_pow_two)
* Namespace: `-`
* Minimal Import: `Mathlib.`
* Mathlib Doc: [#]()
" "
LemmaDoc Finset.sum_comm as "Finset.sum_comm" in "Sum" LemmaDoc Finset.sum_comm as "Finset.sum_comm" in "Sum"
@ -356,10 +333,7 @@ LemmaDoc Finset.sum_comm as "Finset.sum_comm" in "Sum"
## Eigenschaften ## Eigenschaften
* `simp`-Lemma: * Mathlib Doc: [#sum_comm](https://leanprover-community.github.io/mathlib4_docs/Mathlib/Algebra/BigOperators/Basic.html#Finset.sum_comm)
* Namespace: `-`
* Minimal Import: `Mathlib.`
* Mathlib Doc: [#]()
" "
LemmaDoc Function.comp_apply as "Function.comp_apply" in "Function" LemmaDoc Function.comp_apply as "Function.comp_apply" in "Function"
@ -367,10 +341,7 @@ LemmaDoc Function.comp_apply as "Function.comp_apply" in "Function"
## Eigenschaften ## Eigenschaften
* `simp`-Lemma: * Mathlib Doc: [#comp_apply](https://leanprover-community.github.io/mathlib4_docs/Init/Core.html#Function.comp_apply)
* Namespace: `-`
* Minimal Import: `Mathlib.`
* Mathlib Doc: [#]()
" "
LemmaDoc not_le as "not_le" in "Logic" LemmaDoc not_le as "not_le" in "Logic"
@ -378,10 +349,7 @@ LemmaDoc not_le as "not_le" in "Logic"
## Eigenschaften ## Eigenschaften
* `simp`-Lemma: * Mathlib Doc: [#not_le](https://leanprover-community.github.io/mathlib4_docs/Mathlib/Init/Algebra/Order.html#not_le)
* Namespace: `-`
* Minimal Import: `Mathlib.`
* Mathlib Doc: [#]()
" "
LemmaDoc if_pos as "if_pos" in "Logic" LemmaDoc if_pos as "if_pos" in "Logic"
@ -389,10 +357,7 @@ LemmaDoc if_pos as "if_pos" in "Logic"
## Eigenschaften ## Eigenschaften
* `simp`-Lemma: * Mathlib Doc: [#if_pos](https://leanprover-community.github.io/mathlib4_docs/Init/Core.html#if_pos)
* Namespace: `-`
* Minimal Import: `Mathlib.`
* Mathlib Doc: [#]()
" "
LemmaDoc if_neg as "if_neg" in "Logic" LemmaDoc if_neg as "if_neg" in "Logic"
@ -400,10 +365,7 @@ LemmaDoc if_neg as "if_neg" in "Logic"
## Eigenschaften ## Eigenschaften
* `simp`-Lemma: * Mathlib Doc: [#if_neg](https://leanprover-community.github.io/mathlib4_docs/Init/Core.html#if_neg)
* Namespace: `-`
* Minimal Import: `Mathlib.`
* Mathlib Doc: [#]()
" "
LemmaDoc StrictMono.injective as "StrictMono.injective" in "Function" LemmaDoc StrictMono.injective as "StrictMono.injective" in "Function"
@ -411,10 +373,7 @@ LemmaDoc StrictMono.injective as "StrictMono.injective" in "Function"
## Eigenschaften ## Eigenschaften
* `simp`-Lemma: * Mathlib Doc: [#StrictMono.injective](https://leanprover-community.github.io/mathlib4_docs/Mathlib/Order/Monotone/Basic.html#StrictMono.injective)
* Namespace: `-`
* Minimal Import: `Mathlib.`
* Mathlib Doc: [#]()
" "
LemmaDoc StrictMono.add as "StrictMono.add" in "Function" LemmaDoc StrictMono.add as "StrictMono.add" in "Function"
@ -422,10 +381,7 @@ LemmaDoc StrictMono.add as "StrictMono.add" in "Function"
## Eigenschaften ## Eigenschaften
* `simp`-Lemma: * Mathlib Doc: [#StrictMono.add](https://leanprover-community.github.io/mathlib4_docs/Mathlib/Algebra/Order/Monoid/Lemmas.html#StrictMono.add)
* Namespace: `-`
* Minimal Import: `Mathlib.`
* Mathlib Doc: [#]()
" "
LemmaDoc Odd.strictMono_pow as "Odd.strictMono_pow" in "Function" LemmaDoc Odd.strictMono_pow as "Odd.strictMono_pow" in "Function"
@ -433,10 +389,7 @@ LemmaDoc Odd.strictMono_pow as "Odd.strictMono_pow" in "Function"
## Eigenschaften ## Eigenschaften
* `simp`-Lemma: * Mathlib Doc: [#Odd.strictMono_pow](https://leanprover-community.github.io/mathlib4_docs/Mathlib/Algebra/Parity.html#Odd.strictMono_pow)
* Namespace: `-`
* Minimal Import: `Mathlib.`
* Mathlib Doc: [#]()
" "
LemmaDoc Exists.choose as "Exists.choose" in "Function" LemmaDoc Exists.choose as "Exists.choose" in "Function"
@ -444,10 +397,7 @@ LemmaDoc Exists.choose as "Exists.choose" in "Function"
## Eigenschaften ## Eigenschaften
* `simp`-Lemma: * Mathlib Doc: [#Exists.choose](https://leanprover-community.github.io/mathlib4_docs/Std/Logic.html#Exists.choose)
* Namespace: `-`
* Minimal Import: `Mathlib.`
* Mathlib Doc: [#]()
" "
LemmaDoc Exists.choose_spec as "Exists.choose_spec" in "Function" LemmaDoc Exists.choose_spec as "Exists.choose_spec" in "Function"
@ -455,30 +405,21 @@ LemmaDoc Exists.choose_spec as "Exists.choose_spec" in "Function"
## Eigenschaften ## Eigenschaften
* `simp`-Lemma: * Mathlib Doc: [#Exists.choose_spec](https://leanprover-community.github.io/mathlib4_docs/Std/Logic.html#Exists.choose_spec)
* Namespace: `-`
* Minimal Import: `Mathlib.`
* Mathlib Doc: [#]()
" "
LemmaDoc congrArg as "congrArg" in "Function" LemmaDoc congrArg as "congrArg" in "Function"
" "
## Eigenschaften ## Eigenschaften
* `simp`-Lemma: * Mathlib Doc: [#congrArg](https://leanprover-community.github.io/mathlib4_docs/Init/Prelude.html#congrArg)
* Namespace: `-`
* Minimal Import: `Mathlib.`
* Mathlib Doc: [#]()
" "
LemmaDoc congrFun as "congrFun" in "Function" LemmaDoc congrFun as "congrFun" in "Function"
" "
## Eigenschaften ## Eigenschaften
* `simp`-Lemma: * Mathlib Doc: [#congrFun](https://leanprover-community.github.io/mathlib4_docs/Init/Prelude.html#congrFun)
* Namespace: `-`
* Minimal Import: `Mathlib.`
* Mathlib Doc: [#]()
" "
LemmaDoc Iff.symm as "Iff.symm" in "Logic" LemmaDoc Iff.symm as "Iff.symm" in "Logic"
@ -486,10 +427,7 @@ LemmaDoc Iff.symm as "Iff.symm" in "Logic"
## Eigenschaften ## Eigenschaften
* `simp`-Lemma: * Mathlib Doc: [#Iff.symm](https://leanprover-community.github.io/mathlib4_docs/Init/Core.html#Iff.symm)
* Namespace: `-`
* Minimal Import: `Mathlib.`
* Mathlib Doc: [#]()
" "
@ -502,16 +440,14 @@ DefinitionDoc Even as "Even"
Die Definition kann man mit `unfold even at *` einsetzen. Die Definition kann man mit `unfold even at *` einsetzen.
## Eigenschaften ## Eigenschaften
* `simp`-Lemma: * Mathlib Doc: [#Even](https://leanprover-community.github.io/mathlib4_docs/Mathlib/Algebra/Parity.html#Even)"
* Namespace: `-`
* Minimal Import: `Mathlib.`
* Mathlib Doc: [#]()"
DefinitionDoc Odd as "Odd" DefinitionDoc Odd as "Odd"
" "
`odd n` ist definiert als `∃ r, a = 2 * r + 1`. `odd n` ist definiert als `∃ r, a = 2 * r + 1`.
Die Definition kann man mit `unfold odd at *` einsetzen. Die Definition kann man mit `unfold odd at *` einsetzen.
"
* Mathlib Doc: [Odd](https://leanprover-community.github.io/mathlib4_docs/Mathlib/Algebra/Parity.html#Odd)"
DefinitionDoc Injective as "Injective" DefinitionDoc Injective as "Injective"
" "
@ -521,7 +457,8 @@ DefinitionDoc Injective as "Injective"
∀ a b, f a = f b → a = b ∀ a b, f a = f b → a = b
``` ```
definiert. definiert.
"
* Mathlib Doc: [Injective](https://leanprover-community.github.io/mathlib4_docs/Mathlib/Init/Function.html#Function.Injective)"
DefinitionDoc Surjective as "Surjective" DefinitionDoc Surjective as "Surjective"
" "
@ -530,17 +467,15 @@ DefinitionDoc Surjective as "Surjective"
``` ```
∀ a, (∃ b, f a = b) ∀ a, (∃ b, f a = b)
``` ```
"
* Mathlib Doc: [Surjective](https://leanprover-community.github.io/mathlib4_docs/Mathlib/Init/Function.html#Function.Surjective)"
DefinitionDoc Bijective as "Bijective" DefinitionDoc Bijective as "Bijective"
" "
## Eigenschaften ## Eigenschaften
* `simp`-Lemma: * Mathlib Doc: [#Bijective](https://leanprover-community.github.io/mathlib4_docs/Mathlib/Init/Function.html#Function.Bijective)
* Namespace: `-`
* Minimal Import: `Mathlib.`
* Mathlib Doc: [#]()
" "
DefinitionDoc LeftInverse as "LeftInverse" DefinitionDoc LeftInverse as "LeftInverse"
@ -548,10 +483,7 @@ DefinitionDoc LeftInverse as "LeftInverse"
## Eigenschaften ## Eigenschaften
* `simp`-Lemma: * Mathlib Doc: [#LeftInverse](https://leanprover-community.github.io/mathlib4_docs/Mathlib/Init/Function.html#Function.LeftInverse)
* Namespace: `-`
* Minimal Import: `Mathlib.`
* Mathlib Doc: [#]()
" "
DefinitionDoc RightInverse as "RightInverse" DefinitionDoc RightInverse as "RightInverse"
@ -559,10 +491,7 @@ DefinitionDoc RightInverse as "RightInverse"
## Eigenschaften ## Eigenschaften
* `simp`-Lemma: * Mathlib Doc: [#RightInverse](https://leanprover-community.github.io/mathlib4_docs/Mathlib/Init/Logic.html#RightInverse)
* Namespace: `-`
* Minimal Import: `Mathlib.`
* Mathlib Doc: [#]()
" "
DefinitionDoc StrictMono as "StrictMono" DefinitionDoc StrictMono as "StrictMono"
@ -573,7 +502,13 @@ DefinitionDoc StrictMono as "StrictMono"
∀ a b, a < b → f a < f b ∀ a b, a < b → f a < f b
``` ```
## Eigenschaften
* Mathlib Doc: [#StrictMono](https://leanprover-community.github.io/mathlib4_docs/Mathlib/Order/Monotone/Basic.html#StrictMono)
" "
DefinitionDoc Symbol.Subset as "⊆" "
DefinitionDoc Symbol.Subset as "⊆" "Test" Auf Mengen (`Set`) ist `A ⊆ B` als `∀x, x ∈ A → x ∈ B` implementiert.
"

@ -25,6 +25,13 @@ Game "TestGame"
World "Module" World "Module"
Title "Vektorraum" Title "Vektorraum"
Introduction "Hier lernst du die Grundlagen zur linearen Algebra.
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 dann auch \"Vektorraum\" genannt.
"
Game "TestGame" Game "TestGame"
World "Basis" World "Basis"
Title "Lineare Abbildungen" Title "Lineare Abbildungen"

@ -3,6 +3,7 @@ import TestGame.Metadata
import Mathlib.Data.Real.Basic -- definiert `` import Mathlib.Data.Real.Basic -- definiert ``
import Mathlib.Algebra.Module.Basic -- definiert `module` import Mathlib.Algebra.Module.Basic -- definiert `module`
import Mathlib.Tactic.LibrarySearch import Mathlib.Tactic.LibrarySearch
import TestGame.StructInstWithHoles
set_option tactic.hygienic false set_option tactic.hygienic false
@ -14,9 +15,6 @@ Title "Module"
Introduction 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: Konkret heisst das:
Sei `R` ein Ring. Ein `R`-Modul ist eine kommutative Gruppe `(V, +)` zusammen mit Sei `R` ein Ring. Ein `R`-Modul ist eine kommutative Gruppe `(V, +)` zusammen mit
@ -29,63 +27,75 @@ Eigenschaften beliebige `(r s : R)` und `(v w : V)`erfüllt:
- `0 • v = 0` - `0 • v = 0`
- `r • 0 = 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]`).
-- 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]`
Einen abstrakten Vektorraum definiert man wie folgt: -- Wenn man hingegen konkret zeigen will, dass ein existierendes Objekt ein Vektorraum ist,
`variables {R V : Type*} [field R] [add_comm_monoid V] [module R V]` -- kann man eine einsprechende Instanz wie folgt definieren:
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 := _
instance Q_module : Module := -- zero_smul := _
{ smul := λa r, ↑a * r -- one_smul := _
smul_zero := _ -- smul_add := _
zero_smul := _ -- add_smul := _
one_smul := _ -- mul_smul := _ }
smul_add := _ -- ```
add_smul := _ -- Man muss also angeben, welche Skalarmultiplikation man gerne hätte
mul_smul := _ } -- (`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.
Man muss also angeben, welche Skalarmultiplikation man gerne hätte -- Im nachfolgenden beweisen wir die Eigenschaften einzeln.
(`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 Statement
"Zeige, dass $\\mathbb{R}$ ein $\\mathbb{Q}$-Modul ist." "Zeige, dass $\\mathbb{R}$ ein $\\mathbb{Q}$-Modul ist."
: Module := by : Module := by
refine { Hint "**Robo**: Als erstes willst du die Stuktur `Modul` aufteilen in einzelne Beweise.
smul := fun a r => ↑a * r Der Syntax dafür ist:
smul_zero := ?smul_zero
zero_smul := ?zero_smul
one_smul := ?one_smul
smul_add := ?smul_add
add_smul := ?add_smul
mul_smul := ?mul_smul }
· intro b ```
refine \{ ?..! }
```
"
refine { ?..! }
· Hint "**Robo**: Hier musst du die Skalarmultiplikation angeben.
Benutze dafür `exact fun (a : ) (r : ) => ↑a * r`."
exact fun (a : ) (r : ) => ↑a * r
· Hint "**Robo**: Jetzt musst du alle eigenschaften eines $\\mathbb\{Q}$-Moduls zeigen,
das sind also 6 einzelne Goals."
intro b
Hint "**Robo**: Mit `change (1 : ) * b = b` kannst du das Goal umschreiben, damit
dann andere Taktiken besser damit arbeiten können."
change (1 : ) * b = b change (1 : ) * b = b
rw [Rat.cast_one, one_mul] Hint "**Robo**: Den Teil kannst du mit `simp` beweisen."
simp
· intro x y b · intro x y b
Hint "**Robo**: Benutze `change` um `•` durch `*` zu ersetzen."
change (x * y : ) * b = x * (y * b) change (x * y : ) * b = x * (y * b)
rw [Rat.cast_mul, mul_assoc] Hint "**Robo**: Mit `simp` und `ring` kannst du den Rest beweisen."
simp
ring
· intro a · intro a
rw [smul_zero] simp
· intro a x y · intro a x y
change a * (x + y) = a * x + a * y change a * (x + y) = a * x + a * y
rw [mul_add] ring
· intro r s x · intro r s x
change (r + s : ) * x = r * x + s * x change (r + s : ) * x = r * x + s * x
rw [Rat.cast_add, add_mul] simp
ring
· intro a · intro a
change (0 : ) * a = 0 change (0 : ) * a = 0
simp simp
NewTactic refine exact change

@ -3,7 +3,10 @@ import Mathlib
example : Module := by example : Module := by
refine { smul := fun a r => ↑a * r ?..! } refine { ?..! }
exact fun a r => a * r
intro b
sorry
sorry sorry
sorry sorry
sorry sorry

@ -90,6 +90,28 @@ widersprechen.
in ähnlichen Situationen nutzbar wie `by_contra` in ähnlichen Situationen nutzbar wie `by_contra`
" "
TacticDoc change
"
`change t` ändert das Goal zu `t`. Voraussetzung ist, dass `t` und das alte Goal defEq sind.
## Details
Dies ist insbesonder hilfreich wenn eine Taktik nicht merkt, dass das Goal defEq ist zu einem
Term, der eigentlich gebraucht würde.
## Beispiel
Aktuelles Goal:
```
b:
⊢ 1 • b = b
```
Wobei die Skalarmultiplikation als `fun (a : ) (r : ) => ↑a * r` definiert war. Dann
kann man mit `change (1 : ) * b = b` das Goal umschreiben und anschliessend mit Lemmas
über die Multiplikation beweisen.
"
TacticDoc constructor TacticDoc constructor
" "
`constructor` teilt ein Goal auf, wenn das Goal eine Struktur ist `constructor` teilt ein Goal auf, wenn das Goal eine Struktur ist
@ -157,6 +179,11 @@ eine Beweis durch Kontraposition.
`contrapose` verwendet. `contrapose` verwendet.
" "
TacticDoc exact
"
`exact h` schliesst das Goal wenn der Term `h` mit dem Goal übereinstimmt.
"
TacticDoc fin_cases TacticDoc fin_cases
" "
`fin_cases i` führt eine Fallunterscheidung wenn `i` ein endlicher Typ ist. `fin_cases i` führt eine Fallunterscheidung wenn `i` ein endlicher Typ ist.
@ -332,6 +359,16 @@ erzeugen, einmal unter Annahme der linken Seite, einmal unter Annahme der Rechte
freien Variablen freien Variablen
" "
TacticDoc refine
"
`refine { ?..! }` wird benötigt um eine Struktur (z.B. ein $R$-Modul) im Taktikmodus in einzelne
Goals aufzuteilen. Danach hat man ein Goal pro Strukturfeld.
(*Bemerkung*: Es gibt in Lean verschiedenste bessere Varianten dies zu erreichen,
z.B. \"Term Modus\" oder \"anonyme Konstruktoren\", aber für den Zweck des Spieles bleiben wir
bei diesem Syntax.)
"
TacticDoc revert TacticDoc revert
" "
`revert h` fügt die Annahme `h` als Implikationsprämisse vorne ans Goal an. `revert h` fügt die Annahme `h` als Implikationsprämisse vorne ans Goal an.

Loading…
Cancel
Save