import Adam.Metadata import Mathlib Game "Adam" World "Function" Level 2 Title "let" Introduction " Ihr macht euch auf Richtung Bibliothek entlang kleiner Pfade zwischen verschiedenster Behausungen. **Du**: Sag mal, ich weiss jetzt dass ich eine Funktion als `fun x ↦ x - 1` definieren kann, aber wie kann ich der einen Namen geben? **Robo**: Wenn jemand hier eine Funktion definiert, werden die dir `def f (x : ℤ) : ℤ := x - 1` oder `def f : ℤ → ℤ := (fun x ↦ x - 1)` geben. **Du**: Und das bedeutet beides das gleiche? **Robo**: Praktisch, ja. Aber! Wenn du eine Funktion in einer Aufgabe benennen willst, schreibst du `let f := fun (x : ℤ) ↦ x - 1`! **Du**: Und was ist der Unterschied? **Robo**: Deines mit `let` ist für innerhalb von einem Beweis, das andere mit `def` ist für ausserhalb von einem Beweis. Hier, ich geb dir mal eine Aufgabe: ``` def f (x : ℤ) : ℤ := (x + 4) ``` und: " def f (x : ℤ) : ℤ := (x + 4) Statement "" (x : ℤ) : ∃ (g : ℤ → ℤ), (g ∘ f) x = x + 1 := by let g := fun (x : ℤ) ↦ x - 3 use g simp unfold f ring NewTactic «let» NewLemma Function.comp_apply Hint (x : ℤ) : ∃ g, (g ∘ f) x = x + 1 => "**Du**: Ist `g ∘ f` Komposition von Funktionen? **Robo**: Richtig! Das schreibt man mit `\\comp`. **Du** Und hier könnte ich also zuerst `let g := fun (x : ℤ) ↦ _` definieren, anstatt direkt `use fun (x : ℤ) ↦ _`? **Robo**: Genau! Das ist zwar praktisch das gleiche, aber kann manchmal nützlich sein. " -- TODO: Make some hints work here Hint (x : ℤ) : ((fun (x : ℤ) ↦ x - 3) ∘ f) x = x + 1 => "**Robo**: Manchmal must du nachhelfen und Funktionen mit `unfold f` öffnen, manchmal nicht. Um erlich zu sein, sagt mein Programm nicht genau wann man das machen muss…" -- TODO : Make this work Hint (x : ℤ) (g := (fun (x : ℤ) ↦ x - 3)) : (g ∘ f) x = x + 1 => "**Robo**: `(g ∘ f) x` ist per Definition `g (f x)`, aber mit `rw [Function.comp_apply]` kann man das explizit umschreiben, aber `simp` kennt das Lemma auch." Hint (x : ℤ) : f x - 3 = x + 1 => "**Robo**: Manchmal must du nachhelfen und Definitionen mit `unfold f` öffnen, mamchmal klappts ohne. Um erlich zu sein, sagt mein Programm nicht genau wann man das machen muss…" -- TODO: Block simp-Lemma Conclusion "**Du**: Dann verstehst du etwas Mathe? **Robo**: Ich hatte ja keine Ahnung ob die generierte Aufgabe beweisbar ist… Und damit erreicht ihr den Hügel mit der Bibliothek."