bump mathlib and use Even/Odd.

This commit is contained in:
Jon Eugster
2023-01-20 11:42:01 +01:00
parent 6e0469d3bf
commit d2be90a8a0
12 changed files with 84 additions and 102 deletions
@@ -4,7 +4,7 @@ import Mathlib.Tactic.Contrapose
import Mathlib.Tactic.Use
import Mathlib.Tactic.Ring
import TestGame.ToBePorted
import Mathlib.Algebra.Parity
Game "TestGame"
World "Predicate"
@@ -16,17 +16,17 @@ Introduction
"
Gerade/ungerade werden in Lean wie folgt definiert:
```
def even (n : ℕ) : Prop := ∃ r, n = 2 * r
def odd (n : ℕ) : Prop := ∃ r, n = 2 * r + 1
def Even (n : ℕ) : Prop := ∃ r, n = r + r
def Odd (n : ℕ) : Prop := ∃ r, n = r + r + 1
```
Also dadurch, dass ein `(r : ℕ)` existiert sodass `n = 2 * r (+1)`.
Also dadurch, dass ein `(r : ℕ)` existiert sodass `n = r + r (+1)`.
Beachte das Komma `,` welches die Variablen des `∃` (`\\exists`) von der Aussage trennen.
Hierzu gibt es 3 wichtige Taktiken:
1) Definitionen wie `even` kann man mit `unfold even at *` im Infoview einsetzen.
1) Definitionen wie `Even` kann man mit `unfold even at *` im Infoview einsetzen.
Das ändert Lean-intern nichts und ist nur für den Benutzer. Man kann auch einen
Term `(h : even x)` einfach so behandeln als wäre es ein Term `(h : ∃ r, x = 2 * r)`.
Term `(h : Even x)` einfach so behandeln als wäre es ein Term `(h : ∃ r, x = 2 * r)`.
2) Bei einer Annahme `(h : ∃ r, ...)` kann man mit `rcases h with ⟨y, hy⟩` ein solches `y`
Auswählen, dass die Annahme `h` erfüllt.
3) Bei einem `∃` im Goal muss man ein Element `y` angeben, welches diese Aussage erfüllen
@@ -35,14 +35,14 @@ Hierzu gibt es 3 wichtige Taktiken:
Statement even_square
"Wenn $n$ gerade ist, dann ist $n^2$ gerade."
(n : ℕ) (h : even n) : even (n ^ 2) := by
unfold even at *
(n : ℕ) (h : Even n) : Even (n ^ 2) := by
unfold Even at *
rcases h with ⟨x, hx⟩
use 2 * x ^ 2
rw [hx]
ring
Message (n : ℕ) (h : even n) : even (n ^ 2) =>
Message (n : ℕ) (h : Even n) : Even (n ^ 2) =>
"Wenn du die Definition von `even` nicht kennst, kannst du diese mit `unfold even` oder
`unfold even at *` ersetzen.
Note: Der Befehl macht erst mal nichts in Lean sondern nur in der Anzeige. Der Beweis funktioniert
@@ -68,4 +68,4 @@ Message (n : ℕ) (x : ℕ) (hx : n = x + x) : (x + x) ^ 2 = 2 * x ^ 2 + 2 * x ^
"Die Taktik `ring` löst solche Gleichungen."
Tactics unfold rcases use rw ring
Lemmas even odd
Lemmas Even Odd
@@ -4,7 +4,8 @@ import Mathlib.Tactic.Contrapose
import Mathlib.Tactic.Use
import Mathlib.Tactic.Ring
import TestGame.ToBePorted
import Mathlib.Algebra.Parity
import Mathlib
Game "TestGame"
World "Predicate"
@@ -33,16 +34,16 @@ TODO: 1-2 Aufgaben mehr.
Statement
" Für alle natürlichen Zahlen $x$ gilt, falls $x$ gerade ist, dann ist $x + 1$
ungerade." : ∀ (x : ℕ), (even x) → odd (1 + x) := by
ungerade." : ∀ (x : ℕ), (Even x) → Odd (1 + x) := by
intro x h
unfold even at h
unfold odd
unfold Even at h
unfold Odd
rcases h with ⟨y, hy⟩
use y
rw [hy]
ring
Message (n : ℕ) (hn : odd n) (h : ∀ (x : ℕ), (odd x) → even (x + 1)) : even (n + 1) =>
Message (n : ℕ) (hn : Odd n) (h : ∀ (x : ℕ), (Odd x) → Even (x + 1)) : Even (n + 1) =>
"`∀ (x : ℕ), (odd x) → even (x + 1)` ist eigentlich das gleiche wie
`(x : ℕ) → `"
@@ -2,6 +2,8 @@ import TestGame.Metadata
import Mathlib.Tactic.PushNeg
import Mathlib
import Mathlib.Algebra.Parity
import TestGame.ToBePorted
Game "TestGame"
@@ -25,31 +27,30 @@ Das braucht intern die Lemmas
Statement
"Es existiert keine natürliche Zahl $n$, sodass $n + k$ immer ungerade ist.":
¬ ∃ (n : ℕ), ∀ (k : ℕ) , odd (n + k) := by
¬ ∃ (n : ℕ), ∀ (k : ℕ) , Odd (n + k) := by
push_neg
intro n
use n
rw [not_odd]
unfold even
unfold Even
use n
ring
Message : ¬ ∃ (n : ℕ), ∀ (k : ℕ) , odd (n + k) =>
Message : ¬ ∃ (n : ℕ), ∀ (k : ℕ) , Odd (n + k) =>
"`push_neg` schiebt die Negierung an den Quantoren vorbei."
Message (n : ℕ) : (∃ k, ¬odd (n + k)) =>
Message (n : ℕ) : (∃ k, ¬Odd (n + k)) =>
"An dieser Stelle musst du nun ein `k` angeben, sodass `n + k` gerade ist... Benutze `use`
mit der richtigen Zahl."
Hint (n : ℕ) : ¬odd (n + n) =>
Hint (n : ℕ) : ¬Odd (n + n) =>
"Du kennst ein Lemma um mit `¬odd` umzugehen."
-- Hint (n : ℕ) (k : ℕ) : ¬odd (n + k) =>
-- "Du kennst ein Lemma um mit `¬odd` umzugehen."
Hint (n : ℕ) : even (n + n) =>
Hint (n : ℕ) : Even (n + n) =>
"`unfold even` hilft, anzuschauen, was hinter `even` steckt.
Danach musst du wieder mit `use r` ein `(r : ℕ)` angeben, dass du benützen möchtest."
@@ -63,4 +64,4 @@ Conclusion ""
Tactics push_neg intro use rw unfold ring
Lemmas even odd not_even not_odd not_exists not_forall
Lemmas Even Odd not_even not_odd not_exists not_forall
@@ -57,4 +57,4 @@ Conclusion ""
Tactics push_neg intro use rw unfold ring
Lemmas even odd not_even not_odd not_exists not_forall
Lemmas Even Odd not_even not_odd not_exists not_forall