import TestGame.Metadata import Mathlib set_option tactic.hygienic false Game "TestGame" World "LeanStuff" Level 1 Title "" Introduction " Dieses Kapitel führt ein paar Lean-spezifische Sachen ein, die du wissen solltest. Mathematisch haben diese Sachen keinen Inhalt, aber es ist wichtig, dass du etwas verstehst wie Lean manche Sachen macht. Als erstes geht es um implizite und explizite Argumente 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.) TODO Zudem gibt es noch Argumente in eckigen Klammern `[]`. Dies sind auch implizite Argumente, die aber von der **Instance Resolution** gefüllt werden sollen. Dies wird später kommen, aber ein typisches Beispiel ist `(S : Type _) [ring S]` was Lean sagt, es soll suchen gehen, ob es weiss, dass `S` ein Ring ist. " open Set Statement "TODO" : True := by trivial NewTactics rw #check not_not #check not_or_of_imp