import TestGame.Metadata import Mathlib import TestGame.Options.BigOperators set_option tactic.hygienic false Game "TestGame" World "LeanStuff" Level 3 Title "Implizite Argumente" Introduction " Auch wichtiger Syntax ist der Unterschied zwischen impliziten und expliziten Argumenten von Lemmas. **Explizite Argumente** schreibt man mit runden Klammern `()`, **impliziete Argumente** mit geschweiften `{}`. Als implizit werden alle Argumente markiert, die Lean selbständig aus dem Kontext erschliessen und einfüllen kann. Als Beispiel schauen wir uns ein bekanntes Lemma an: ``` lemma Fin.sum_univ_castSucc {β : Type _} [AddCommMonoid β] {n : ℕ} (f : Fin (n + 1) → β) : ∑ i : Fin (n + 1), f i = ∑ i : Fin n, f (↑Fin.castSucc.toEmbedding i) + f (Fin.last n) := by sorry ``` Hier ist unter anderem `n` als implizites Argument angegeben, da Lean aus `f` herauslesen kann, was `n` sein muss. Falls man trotzdem einmal das implizites Argument angeben muss (z.B. um `rw` zu helfen, wenn es mehrere Möglichkeiten gibt), kann man dies mit `Fin.sum_univ_castSucc (n := m + 1)` machen. " open BigOperators Statement "Zeige $(\\sum_{i=0}^{m} i) + (m + 1) = \\sum_{i=0}^{m + 1} i$." (m : ℕ) : ∑ i : Fin (m + 1), (i : ℕ) + (m + 1) = ∑ i : Fin (Nat.succ m + 1), ↑i := by rw [Fin.sum_univ_castSucc (n := m + 1)] rfl OnlyTactic rw rfl NewLemma Fin.sum_univ_castSucc HiddenHint (m : ℕ) : ∑ i : Fin (m + 1), (i : ℕ) + (m + 1) = ∑ i : Fin (Nat.succ m + 1), ↑i => "Das Lemma `Fin.sum_univ_castSucc` hilft." Hint (m : ℕ) : ∑ i : Fin m, (Fin.castSucc.toEmbedding i : ℕ) + ↑(Fin.last m) + (m + 1) = ∑ i : Fin (Nat.succ m + 1), ↑i => "Hier hat `rw` die falsche der beiden Summen umgeschrieben. Hilf ihm mit `rw [Fin.sum_univ_castSucc (n := m + 1)]`." Hint (m : ℕ) : ∑ i : Fin (m + 1), (i : ℕ) + (m + 1) = ∑ i : Fin (m + 1), ↑i + (m + 1) => "Jetzt sind beide Seiten gleich und das Goal kann mit `rfl` geschlossen werden."