import TestGame.Metadata import Mathlib 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 hier zweimal das gleiche Lemma, einmal ohne impliziten Argumenten und einmal mit ``` lemma not_or_of_imp' (A B : Prop) (h : A → B) : ¬A ∨ B := sorry lemma not_or_of_imp {A B : Prop} (h : A → B) : ¬A ∨ B := sorry ``` Hat man nun `g : C → D` dann braucht man diese Lemmas mit `have := not_or_of_imp g` oder `have := not_or_of_imp' C D g`. Wie man sieht erschliesst Lean die impliziten Argumente automatisch und es wäre deshalb unnötig, diese jedes Mal explizit angeben zu müssen. TODO (Trick mit `@not_or_of_imp` kann man sagen, dass man **alle** Argumente angeben möchte und mir `not_or_of_imp g (B := D)` könnte man ein spezifisches implizites Argument spezifizieren. Wenn man diese Tricks braucht, heisst das aber meistens, das etwas nicht optimal definiert ist.) Nebenbemerkung: Es gibt auch noch implizite **Klassen-Elemente** mit eckigen Klammern `[]` wie zum Beispiel `[CommRing R]` im vorigen Beispiel. Diese werden später behandelt, und sagen Lean, dass es für dieses Argument eine **Instanz** suchen gehen soll. Diese Instanzen werden mehrheitlich dafür verwendet, mathematische Strukturen auf Typen zu definieren, aber das kommt alles später. " Statement "TODO" (R S : Type _) [CommRing R] (a b : R) : a + b = b + a := by ring Hint (R : Type _) (h : CommRing R) (a : R) (b : R) : a + b = b + a => "Die Taktik `ring` funktioniert in jedem Typen, der mindestens eine Instanz `[Ring R]` hat."