import TestGame.Metadata import Mathlib Game "TestGame" World "Numbers" Level 1 Title "" Introduction " -- Level name : Positive natürliche Zahlen import data.pnat.basic /- In diesem Level lernst du neben `ℕ` weitere Arten von Zahlen kennen: `ℕ+`,`ℤ`, `ℚ`, `ℝ`, `ℂ`. Manchmal sieht man in der Literatur Diskussionen, ob die natürlichen Zahlen jetzt bei `0` oder `1` anfangen, wobei zumindest in der formalisierten Mathematik (z.B. ZFC-Mengenlehre) eigentlich immer `ℕ = {0, 1, 2, 3, …}` definiert wird. So ist auch in Lean `1` als `0.succ` und `2 = 1.succ = 0.succ.succ` definiert und Lean hat eine separate Notation `ℕ+` (oder `pnat`) für alle *positiven* natürlichen Zahlen. Dies ist als Sub-Typ von `ℕ` definiert: `def pnat := {n : ℕ // 0 < n}` ein Element `(p : ℕ+)` besteht also aus einer natürlichen Zahl `(p.val : ℕ)` (oder auch `p.1`, wobei `p.val` bevorzugt ist) sowie einem Beweis, dass diese positiv ist, `p.property` (oder `p.2`). Solche Strukturen mit mehr als einem Feld kann man in Lean mit dem anonymen Konstruktor `⟨_, _⟩` erstellen, wie du schon einmal beim `∃` gesehen hast: `(⟨n, h⟩ : ℕ+)` " Statement "" (a : ℕ+) : (a : ℕ) ≠ 0 := by apply ne_of_gt rcases a with ⟨a, ha⟩ assumption -- -/ -- /- Hint : a.property -- `have ha := a.property` speichert die `ℕ+`-Eigenschaft dass `0 < a.val` -- gilt als neue Variable. -- -/ -- /- Hint : ne_of_lt/ne_of_gt -- `a < b → a ≠ b` -- oder -- `a < b → b ≠ a` -- alternativ kannst du auch mit `symmetry` ein symmetrischen Goal drehen. -- -/ -- /- Lemma : no-side-bar -- Beweise. -- -/ -- example (a : ℕ+) : (a : ℕ) ≠ 0 := -- begin -- have ha := a.property, -- symmetry, -- apply ne_of_lt, -- exact ha, -- end -- /- Axiom : ne_of_lt -- `a < b → a ≠ b`. -- -/ -- /- Axiom : ne_of_gt -- `a < b → b ≠ a`. -- -/ -- /- Tactic : symmetry -- Dreht ein symmetrisches Goal wie `A = B`, `A ≠ B`, `A ↔ B`, ... -- -/