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
@@ -36,11 +36,11 @@ lemma not_even (n : ℕ): ¬ even n ↔ odd n := by
Statement
"Sei $n$ eine natürliche Zahl die sowohl gerade wie auch ungerade ist.
Zeige, dass daraus $n = 42$ folgt. (oder, tatsächlich $n = x$ für jedes beliebige $x$)."
(n : ℕ) (h_even : even n) (h_odd : odd n) : n = 42 := by
(n : ℕ) (h_even : Even n) (h_odd : Odd n) : n = 42 := by
rw [← not_even] at h_odd
contradiction
Message (n : ℕ) (h_even : even n) (h_odd : odd n) : n = 42 =>
Message (n : ℕ) (h_even : Even n) (h_odd : Odd n) : n = 42 =>
"Schreibe zuerst eine der Aussagen mit `rw [←not_even] at h_odd` um, damit diese genaue
Gegenteile werden."
@@ -48,4 +48,4 @@ Conclusion ""
Tactics contradiction rw
Lemmas even odd not_even not_odd
Lemmas Even Odd not_even not_odd
@@ -22,22 +22,22 @@ dass das Gegenteil des Goals wahr sei, und dann einen Widerspruch erzeugen.
**Bemerkung:** Besonders beim Beweis durch Widerspruch ist es hilfreich, wenn man
Zwischenresultate erstellen kann.
`suffices h₁ : ¬(odd (n ^ 2))` erstellt zwei neue Goals:
`suffices h₁ : ¬(Odd (n ^ 2))` erstellt zwei neue Goals:
1) Ein Beweis, wieso es genügt `¬(odd (n ^ 2))` zu zeigen (\"weil das einen Widerspruch zu
1) Ein Beweis, wieso es genügt `¬(Odd (n ^ 2))` zu zeigen (\"weil das einen Widerspruch zu
`h` bewirkt\").
2) Einen Beweis des Zwischenresultats `suffices h₁ : ¬(odd (n ^ 2))`
2) Einen Beweis des Zwischenresultats `suffices h₁ : ¬(Odd (n ^ 2))`
Alternativ macht `have h₁ : ¬(odd (n ^ 2))` genau das gleiche, vertauscht aber die
Alternativ macht `have h₁ : ¬(Odd (n ^ 2))` genau das gleiche, vertauscht aber die
Beweise (1) und (2), so dass man zuerst `h₁` beweist, und dann den eigentlichen Beweis
fortsetzt.
"
Statement
"Ist n² ungerade, so ist auch n ungerade. Beweise durch Widerspruch."
(n : ℕ) (h : odd (n ^ 2)) : odd n := by
(n : ℕ) (h : Odd (n ^ 2)) : Odd n := by
by_contra g
suffices d : ¬ odd (n ^ 2) -- TODO: I don't like this
suffices d : ¬ Odd (n ^ 2) -- TODO: I don't like this
contradiction
rw [not_odd] at g
@@ -45,37 +45,37 @@ Statement
apply even_square
assumption
Message (n : ℕ) (h : odd (n^2)) : odd n =>
Message (n : ℕ) (h : Odd (n^2)) : Odd n =>
"Schreibe `by_contra h₁` um einen Beweis durch Widerspruch zu starten."
Message (n : ℕ) (g : ¬ odd n) (h : odd (n^2)) : False =>
"Nun *genügt es zu zeigen, dass* `¬odd (n ^ 2)` wahr ist,
Message (n : ℕ) (g : ¬ Odd n) (h : Odd (n^2)) : False =>
"Nun *genügt es zu zeigen, dass* `¬Odd (n ^ 2)` wahr ist,
denn dann erhalten wir einen Widerspruch zu `h`.
Benütze dafür `suffices h₂ : ¬odd (n ^ 2)`.
Benütze dafür `suffices h₂ : ¬Odd (n ^ 2)`.
"
Message (n : ℕ) (g : ¬ odd (n^2)) (h : odd (n^2)) : False =>
Message (n : ℕ) (g : ¬ Odd (n^2)) (h : Odd (n^2)) : False =>
"Hier musst du rechtfertigen, wieso das genügt. In unserem Fall, weil
dadurch einen Widerspruch entsteht."
Hint (n : ℕ) (g : ¬ odd (n^2)) (h : odd (n^2)) : False =>
Hint (n : ℕ) (g : ¬ Odd (n^2)) (h : Odd (n^2)) : False =>
"Also `contradiction`..."
Message (n : ℕ) (g : ¬ odd n) (h : odd (n^2)) : ¬ odd (n^2) =>
"Das Zwischenresultat `¬odd (n^2)` muss auch bewiesen werden.
Hier ist wieder das Lemma `not_odd` hilfreich."
Message (n : ℕ) (g : ¬ Odd n) (h : Odd (n^2)) : ¬ Odd (n^2) =>
"Das Zwischenresultat `¬Odd (n^2)` muss auch bewiesen werden.
Hier ist wieder das Lemma `not_Odd` hilfreich."
Hint (n : ℕ) (g : ¬ odd n) (h : odd (n^2)) : even (n^2) =>
"Mit `rw [not_odd] at *` kannst du im Goal und allen Annahmen gleichzeitig umschreiben."
Hint (n : ℕ) (g : ¬ Odd n) (h : Odd (n^2)) : Even (n^2) =>
"Mit `rw [not_Odd] at *` kannst du im Goal und allen Annahmen gleichzeitig umschreiben."
Message (n: ℕ) (h : odd (n ^ 2)) (g : even n) : even (n ^ 2) =>
Message (n: ℕ) (h : Odd (n ^ 2)) (g : Even n) : Even (n ^ 2) =>
"Diese Aussage hast du bereits als Lemma bewiesen."
Hint (n: ℕ) (h : odd (n ^ 2)) (g : even n) : even (n ^ 2) =>
Hint (n: ℕ) (h : Odd (n ^ 2)) (g : Even n) : Even (n ^ 2) =>
"Probiers mit `apply ...`"
Tactics contradiction by_contra rw apply assumption -- TODO: suffices, have
Lemmas odd even not_odd not_even even_square
Lemmas Odd Even not_odd not_even even_square
@@ -23,28 +23,28 @@ Wenn das Goal eine Implikation ist, kann man `contrapose` anwenden.
Statement
"Ist n² ungerade, so ist auch n ungerade. Beweise durch Kontraposition."
(n : ℕ) : odd (n ^ 2) → odd n := by
(n : ℕ) : Odd (n ^ 2) → Odd n := by
contrapose
rw [not_odd]
rw [not_odd]
apply even_square
Message (n : ℕ) (h : odd (n ^ 2)) : odd n =>
Message (n : ℕ) (h : Odd (n ^ 2)) : Odd n =>
"`intro` wär generell ein guter Ansatz! Aber hier wollen wir `contrapose` benützen, was eine
Implikation benötigt, deshalb ist `intro` hier der falsche Weg!"
Message (n : ℕ) : odd (n ^ 2) → odd n =>
Message (n : ℕ) : Odd (n ^ 2) → Odd n =>
"Mit `contrapose` kann man die Implikation zu
`¬ (even n) → ¬ (even n^2)` umkehren."
Hint (n : ℕ) : ¬odd n → ¬odd (n ^ 2) => "Du kennst bereits ein Lemma um `¬ odd ...` mit `rw`
Hint (n : ℕ) : ¬Odd n → ¬Odd (n ^ 2) => "Du kennst bereits ein Lemma um `¬ odd ...` mit `rw`
umzuschreiben"
Message (n : ℕ) : even n → ¬odd (n ^ 2) => "rw [not_odd] muss hier zweimal angewendet werden,
Message (n : ℕ) : Even n → ¬Odd (n ^ 2) => "rw [not_odd] muss hier zweimal angewendet werden,
da rw das erste Mal `not_odd n` gebraucht hat und das zweite Mal `not_odd (n^2)` benützt."
Message (n : ℕ) : even n → even (n ^ 2) => "Diese Aussage hast du bereits als Lemma bewiesen."
Message (n : ℕ) : Even n → Even (n ^ 2) => "Diese Aussage hast du bereits als Lemma bewiesen."
Tactics contrapose rw apply
Lemmas even odd not_even not_odd even_square
Lemmas Even Odd not_even not_odd even_square