compute which tactics are available in which level

pull/43/head
Alexander Bentkamp 3 years ago
parent 03faa3ffed
commit 76d1a08948

@ -190,16 +190,8 @@ instance : Quote TacticDocEntry `term :=
/-- Declare the list of tactics that will be displayed in the current level. /-- Declare the list of tactics that will be displayed in the current level.
Expects a space separated list of identifiers that refer to either a tactic doc Expects a space separated list of identifiers that refer to either a tactic doc
entry or a tactic doc set. -/ entry or a tactic doc set. -/
elab "Tactics" args:ident* : command => do elab "NewTactics" args:ident* : command => do
let env ← getEnv modifyCurLevel fun level => pure {level with newTactics := args.map (·.getId)}
let docs := tacticDocExt.getState env
let mut tactics : Array TacticDocEntry := #[]
for arg in args do
let name := arg.getId
match docs.find? (·.name = name) with
| some entry => tactics := tactics.push entry
| none => throwError "Tactic doc {name} wasn't found."
modifyCurLevel fun level => pure {level with tactics := tactics}
/-! ## Lemmas -/ /-! ## Lemmas -/
@ -219,11 +211,11 @@ Expect an identifier used as the set name then `:=` and a
space separated list of identifiers. -/ space separated list of identifiers. -/
elab "LemmaSet" name:ident ":" title:str ":=" args:ident* : command => do elab "LemmaSet" name:ident ":" title:str ":=" args:ident* : command => do
let docs := lemmaDocExt.getState (← getEnv) let docs := lemmaDocExt.getState (← getEnv)
let mut entries : Array LemmaDocEntry := #[] let mut entries : Array Name := #[]
for arg in args do for arg in args do
let name := arg.getId let name := arg.getId
match docs.find? (·.userName = name) with match docs.find? (·.userName = name) with
| some doc => entries := entries.push doc | some doc => entries := entries.push name
| none => throwError "Lemma doc {name} wasn't found." | none => throwError "Lemma doc {name} wasn't found."
modifyEnv (lemmaSetExt.addEntry · { modifyEnv (lemmaSetExt.addEntry · {
name := name.getId, name := name.getId,
@ -236,16 +228,60 @@ instance : Quote LemmaDocEntry `term :=
/-- Declare the list of lemmas that will be displayed in the current level. /-- Declare the list of lemmas that will be displayed in the current level.
Expects a space separated list of identifiers that refer to either a lemma doc Expects a space separated list of identifiers that refer to either a lemma doc
entry or a lemma doc set. -/ entry or a lemma doc set. -/
elab "Lemmas" args:ident* : command => do elab "NewLemmas" args:ident* : command => do
let env ← getEnv let env ← getEnv
let docs := lemmaDocExt.getState env let docs := lemmaDocExt.getState env
let sets := lemmaSetExt.getState env let sets := lemmaSetExt.getState env
let mut lemmas : Array LemmaDocEntry := #[] let mut lemmas : Array Name := #[]
for arg in args do for arg in args do
let name := arg.getId let name := arg.getId
match docs.find? (·.userName = name) with match docs.find? (·.userName = name) with
| some entry => lemmas := lemmas.push entry | some entry => lemmas := lemmas.push name
| none => match sets.find? (·.name = name) with | none => match sets.find? (·.name = name) with
| some entry => lemmas := lemmas ++ entry.lemmas | some entry => lemmas := lemmas ++ entry.lemmas
| none => throwError "Lemma doc or lemma set {name} wasn't found." | none => throwError "Lemma doc or lemma set {name} wasn't found."
modifyCurLevel fun level => pure {level with lemmas := lemmas} modifyCurLevel fun level => pure {level with newLemmas := lemmas}
/-! ## Make Game -/
def getTacticDoc! (tac : Name) : CommandElabM TacticDocEntry := do
match (tacticDocExt.getState (← getEnv)).find? (·.name = tac) with
| some doc => return doc
| none => throwError "Tactic documentation not found: {tac}"
/-- Make the final Game. This command will precompute various things about the game, such as which
tactics are available in each level etc. -/
elab "MakeGame" : command => do
let game ← getCurGame
-- Check for loops in world graph
if game.worlds.hasLoops then
throwError "World graph has loops!"
-- Compute which tactics are available in which level:
let mut newTacticsInWorld : HashMap Name (HashSet Name) := {}
for (worldId, world) in game.worlds.nodes.toArray do
let mut newTactics : HashSet Name:= {}
for (_, level) in world.levels.toArray do
newTactics := newTactics.insertMany level.newTactics
newTacticsInWorld := newTacticsInWorld.insert worldId newTactics
let mut tacticsInWorld : HashMap Name (HashSet Name) := {}
for (worldId, _) in game.worlds.nodes.toArray do
let mut tactics : HashSet Name:= {}
let predecessors := game.worlds.predecessors worldId
for predWorldId in predecessors do
tactics := tactics.insertMany (newTacticsInWorld.find! predWorldId)
tacticsInWorld := tacticsInWorld.insert worldId tactics
for (worldId, world) in game.worlds.nodes.toArray do
let mut tactics := tacticsInWorld.find! worldId
logInfo m!"{tactics.toArray}"
let levels := world.levels.toArray.insertionSort fun a b => a.1 < b.1
for (levelId, level) in levels do
tactics := tactics.insertMany level.newTactics
modifyLevel ⟨← getCurGameId, worldId, levelId⟩ fun level => do
return {level with tactics := ← tactics.toArray.mapM getTacticDoc!}

@ -1,4 +1,6 @@
import Lean import Lean
import GameServer.Graph
/-! # Environment extensions /-! # Environment extensions
The game framework stores almost all its game building data in environment extensions The game framework stores almost all its game building data in environment extensions
@ -71,7 +73,7 @@ elab "#print_lemma_doc" : command => do
structure LemmaSetEntry where structure LemmaSetEntry where
name : Name name : Name
title : String title : String
lemmas : Array LemmaDocEntry lemmas : Array Name
deriving ToJson, Repr deriving ToJson, Repr
/-- Environment extension for lemma sets. -/ /-- Environment extension for lemma sets. -/
@ -86,26 +88,8 @@ open Elab Command in
/-- Print all registered lemma sets for debugging purposes. -/ /-- Print all registered lemma sets for debugging purposes. -/
elab "#print_lemma_set" : command => do elab "#print_lemma_set" : command => do
for entry in lemmaSetExt.getState (← getEnv) do for entry in lemmaSetExt.getState (← getEnv) do
dbg_trace "{entry.name} : {entry.lemmas.map LemmaDocEntry.name}" dbg_trace "{entry.name} : {entry.lemmas}"
/-! ## Graph -/
structure Graph (α β : Type) [inst : BEq α] [inst : Hashable α] where
nodes: HashMap α β := {}
edges: Array (α × α) := {}
deriving Inhabited
instance [ToJson β] : ToJson (Graph Name β) := {
toJson := fun graph => Json.mkObj [
("nodes", Json.mkObj (graph.nodes.toList.map fun (a,b) => (a.toString, toJson b))),
("edges", toJson graph.edges)
]
}
instance [inst : BEq α] [inst : Hashable α] : EmptyCollection (Graph α β) := ⟨default⟩
def Graph.insertNode [inst : BEq α] [inst : Hashable α] (g : Graph α β) (a : α) (b : β) :=
{g with nodes := g.nodes.insert a b}
/-! ## Environment extensions for game specification-/ /-! ## Environment extensions for game specification-/
@ -179,7 +163,21 @@ structure GameLevel where
introduction: String := default introduction: String := default
description: String := default description: String := default
conclusion: String := default conclusion: String := default
-- new tactics introduces by this level:
newTactics: Array Name := default
-- tactics exceptionally forbidden in this level:
disabledTactics: Array Name := default
-- only these tactics are allowed in this level (ignore if empty):
onlyTactics: Array Name := default
-- tactics in this level (computed by `MakeGame`):
tactics: Array TacticDocEntry := default tactics: Array TacticDocEntry := default
-- new lemmas introduces by this level:
newLemmas: Array Name := default
-- lemmas exceptionally forbidden in this level:
disabledLemmas: Array Name := default
-- only these lemmas are allowed in this level (ignore if empty):
onlyLemmas: Array Name := default
-- lemmas in this level (computed by `MakeGame`):
lemmas: Array LemmaDocEntry := default lemmas: Array LemmaDocEntry := default
hints: Array GoalHintEntry := default hints: Array GoalHintEntry := default
goal : TSyntax `Lean.Parser.Command.declSig := default goal : TSyntax `Lean.Parser.Command.declSig := default
@ -310,3 +308,15 @@ def modifyCurLevel (fn : GameLevel → m GameLevel) [MonadError m] : m Unit := d
modifyCurWorld fun world => do modifyCurWorld fun world => do
let level ← getCurLevel let level ← getCurLevel
return {world with levels := world.levels.insert level.index (← fn level)} return {world with levels := world.levels.insert level.index (← fn level)}
def modifyLevel (levelId : LevelId) (fn : GameLevel → m GameLevel) [MonadError m] : m Unit := do
let some game ← getGame? levelId.game
| throwError m!"Game {levelId.game} does not exist"
let some world := (← getCurGame).worlds.nodes.find? levelId.world
| throwError m!"World {levelId.world} does not exist"
let some level := world.levels.find? levelId.level
| throwError m!"Level {levelId.level} does not exist"
let level' ← fn level
let world' := {world with levels := world.levels.insert levelId.level level'}
let game' := {game with worlds := game.worlds.insertNode levelId.world world'}
insertGame levelId.game game'

@ -45,3 +45,6 @@ Path Predicate → Induction → LeanStuff → Function → SetFunction
Path LeanStuff → SetTheory → SetFunction Path LeanStuff → SetTheory → SetFunction
Path SetTheory → SetTheory2 Path SetTheory → SetTheory2
MakeGame

@ -63,6 +63,6 @@ have k : ¬ B
Conclusion "" Conclusion ""
Tactics contradiction rcases haveₓ assumption apply NewTactics contradiction rcases haveₓ assumption apply
Lemmas Even Odd not_even not_odd NewLemmas Even Odd not_even not_odd

@ -60,6 +60,6 @@ Hint (A : Prop) (B : Prop) (h : A → ¬ B) (g : A) (f : B) : False =>
Conclusion "" Conclusion ""
Tactics contradiction apply assumption rcases sufficesₓ NewTactics contradiction apply assumption rcases sufficesₓ
Lemmas Even Odd not_even not_odd NewLemmas Even Odd not_even not_odd

@ -52,4 +52,4 @@ HiddenHint (A : Prop) (B : Prop) (h : A → B) (b : ¬ B) (a : A) : False =>
Conclusion "" Conclusion ""
Tactics by_contra sufficesₓ haveₓ contradiction apply assumption NewTactics by_contra sufficesₓ haveₓ contradiction apply assumption

@ -46,4 +46,4 @@ HiddenHint (A : Prop) (B : Prop) : A → B ↔ (¬ B → ¬ A) =>
Conclusion "" Conclusion ""
Tactics contradiction constructor intro by_contra sufficesₓ haveₓ apply assumption NewTactics contradiction constructor intro by_contra sufficesₓ haveₓ apply assumption

@ -61,5 +61,5 @@ Hint (n : ) : Even n → ¬Odd (n ^ 2) =>
Hint (n : ) : Even n → Even (n ^ 2) => Hint (n : ) : Even n → Even (n ^ 2) =>
"Diese Aussage hast du bereits als Lemma bewiesen, schau mal in der Bibliothek." "Diese Aussage hast du bereits als Lemma bewiesen, schau mal in der Bibliothek."
Tactics contrapose rw apply NewTactics contrapose rw apply
Lemmas Even Odd not_even not_odd even_square NewLemmas Even Odd not_even not_odd even_square

@ -71,6 +71,6 @@ HiddenHint (n: ) (h : Odd (n ^ 2)) (g : Even n) : Even (n ^ 2) =>
"Probiers mit `apply ...`" "Probiers mit `apply ...`"
Tactics contradiction by_contra rw apply assumption -- TODO: suffices, have NewTactics contradiction by_contra rw apply assumption -- TODO: suffices, have
Lemmas Odd Even not_odd not_even even_square NewLemmas Odd Even not_odd not_even even_square

@ -23,4 +23,4 @@ Statement
: True := by : True := by
trivial trivial
Tactics rw NewTactics rw

@ -37,4 +37,4 @@ HiddenHint (A : Prop) (B : Prop) (hb : B) : A → (A ∧ B) =>
Hint (A : Prop) (B : Prop) (ha : A) (hb : B) : (A ∧ B) => Hint (A : Prop) (B : Prop) (ha : A) (hb : B) : (A ∧ B) =>
"Jetzt kannst du die Taktiken aus dem letzten Kapitel verwenden." "Jetzt kannst du die Taktiken aus dem letzten Kapitel verwenden."
Tactics intro constructor assumption NewTactics intro constructor assumption

@ -39,4 +39,4 @@ dass $B$ wahr ist."
HiddenHint (A : Prop) (B : Prop) (ha : A) (h : A → B): B => HiddenHint (A : Prop) (B : Prop) (ha : A) (h : A → B): B =>
"Mit `revert ha` kann man die Annahme `ha` als Implikationsprämisse vorne ans Goal anhängen." "Mit `revert ha` kann man die Annahme `ha` als Implikationsprämisse vorne ans Goal anhängen."
Tactics revert assumption NewTactics revert assumption

@ -32,7 +32,7 @@ HiddenHint (A : Prop) (B : Prop) (hA : A) (g : A → B) : A =>
"Nachdem du die Implikation `A → B` angewendet hast, musst du nur noch $A$ zeigen, "Nachdem du die Implikation `A → B` angewendet hast, musst du nur noch $A$ zeigen,
dafür hast du bereits einen Beweis in den Annahmen." dafür hast du bereits einen Beweis in den Annahmen."
Tactics apply assumption NewTactics apply assumption
-- Katex notes -- Katex notes
-- `\\( \\)` or `$ $` for inline -- `\\( \\)` or `$ $` for inline

@ -32,4 +32,4 @@ HiddenHint (A : Prop) (B : Prop) (C : Prop) (hA : A) (f : A → B) (g : B → C)
"Du willst $C$ beweisen. Suche also nach einer Implikation $\\ldots \\Rightarrow C$ und wende "Du willst $C$ beweisen. Suche also nach einer Implikation $\\ldots \\Rightarrow C$ und wende
diese mit `apply` an." diese mit `apply` an."
Tactics intro apply assumption revert NewTactics intro apply assumption revert

@ -48,6 +48,6 @@ Hint (A : Prop) (B : Prop) (C : Prop) (D : Prop) (E : Prop) (F : Prop)
(i : D → E) (k : E → F) (m : C → F) : D => (i : D → E) (k : E → F) (m : C → F) : D =>
"Sackgasse. Probier doch einen anderen Weg." "Sackgasse. Probier doch einen anderen Weg."
Tactics apply assumption revert intro NewTactics apply assumption revert intro
-- https://www.jmilne.org/not/Mamscd.pdf -- https://www.jmilne.org/not/Mamscd.pdf

@ -38,6 +38,6 @@ aus mehreren Einzelteilen besteht: `⟨A → B, B → A⟩`. Man sagt also Lean,
ob das Goal aus solchen Einzelteilen \"konstruiert\" werden kann. ob das Goal aus solchen Einzelteilen \"konstruiert\" werden kann.
" "
Tactics constructor assumption NewTactics constructor assumption
-- TODO : `case mpr =>` ist mathematisch noch sinnvoll. -- TODO : `case mpr =>` ist mathematisch noch sinnvoll.

@ -71,4 +71,4 @@ Hint (A : Prop) (B : Prop) (C : Prop) (D : Prop) (h₁ : C ↔ D) (h₂ : D ↔
"Das ist nicht der optimale Weg..." "Das ist nicht der optimale Weg..."
Tactics rw assumption NewTactics rw assumption

@ -41,4 +41,4 @@ Hint (A : Prop) (B : Prop) (C : Prop) (h : A ↔ B) (g : B → C) (hA : A) : B =
Conclusion "Im nächsten Level findest du die zweite Option." Conclusion "Im nächsten Level findest du die zweite Option."
Tactics apply assumption NewTactics apply assumption

@ -36,7 +36,7 @@ Conclusion
" "
" "
Tactics intro apply rcases assumption NewTactics intro apply rcases assumption
-- -- TODO: The new `cases` works differntly. There is also `cases'` -- -- TODO: The new `cases` works differntly. There is also `cases'`
-- example (A B : Prop) : (A ↔ B) → (A → B) := by -- example (A B : Prop) : (A ↔ B) → (A → B) := by

@ -50,6 +50,6 @@ Conclusion
" "
" "
Tactics apply left right assumption NewTactics apply left right assumption
Lemmas not_or_of_imp NewLemmas not_or_of_imp

@ -34,6 +34,6 @@ Conclusion
`rw` hat automatisch `rfl` ausgeführt und dadurch den Beweis beendet. `rw` hat automatisch `rfl` ausgeführt und dadurch den Beweis beendet.
" "
Tactics rw NewTactics rw
Lemmas not_not not_or_of_imp NewLemmas not_not not_or_of_imp

@ -76,6 +76,6 @@ HiddenHint (A : Prop) (B: Prop) (h : ¬ A B) (ha : A) : B =>
HiddenHint (A : Prop) (B: Prop) (ha : A) (ha' : ¬A) : B => HiddenHint (A : Prop) (B: Prop) (ha : A) (ha' : ¬A) : B =>
"Findest du einen Widerspruch?" "Findest du einen Widerspruch?"
Tactics rfl assumption trivial left right constructor rcases NewTactics rfl assumption trivial left right constructor rcases
Lemmas not_not not_or_of_imp NewLemmas not_not not_or_of_imp

@ -43,4 +43,4 @@ Statement
(n : ) : (∑ i : Fin n, (0 + 0)) = 0 := by (n : ) : (∑ i : Fin n, (0 + 0)) = 0 := by
simp simp
Tactics simp NewTactics simp

@ -34,4 +34,4 @@ Statement
simp simp
ring ring
Tactics rw simp ring NewTactics rw simp ring

@ -43,4 +43,4 @@ Statement
-- rw [mul_add, hn] -- rw [mul_add, hn]
-- ring -- ring
Tactics ring NewTactics ring

@ -30,4 +30,4 @@ $\\sum_{i = 0}^n (2n + 1) = n ^ 2$."
--rw [hn] --rw [hn]
--ring --ring
Tactics ring NewTactics ring

@ -44,4 +44,4 @@ Statement
-- rw [mul_add, hn] -- rw [mul_add, hn]
-- ring -- ring
Tactics ring NewTactics ring

@ -23,4 +23,4 @@ Statement
simp simp
sorry sorry
Tactics ring NewTactics ring

@ -21,4 +21,4 @@ Statement
(n : ) : True := by (n : ) : True := by
sorry sorry
Tactics rw simp ring NewTactics rw simp ring

@ -21,4 +21,4 @@ Statement
(n : ) : True := by (n : ) : True := by
sorry sorry
Tactics rw simp ring NewTactics rw simp ring

@ -21,7 +21,7 @@ Statement
(n : ) : True := by (n : ) : True := by
trivial trivial
Tactics simp NewTactics simp
-- Σ_i Σ_j ... = Σ_j Σ_i ... -- Σ_i Σ_j ... = Σ_j Σ_i ...

@ -29,4 +29,4 @@ Statement
"TODO" : True := by "TODO" : True := by
trivial trivial
Tactics rw NewTactics rw

@ -67,4 +67,4 @@ Hint (A : Prop) (B : Prop) (C : Prop) (h : A ∧ B) : C ∧ A =>
Hint (A : Prop) (B : Prop) (C : Prop) (h : A → C) : C ∧ A => Hint (A : Prop) (B : Prop) (C : Prop) (h : A → C) : C ∧ A =>
"Ein UND im Goal kann mit `constructor` aufgeteilt werden." "Ein UND im Goal kann mit `constructor` aufgeteilt werden."
Tactics left right assumption constructor rcases NewTactics left right assumption constructor rcases

@ -20,4 +20,4 @@ Conclusion
" "
" "
Tactics ring NewTactics ring

@ -20,4 +20,4 @@ Conclusion
" "
" "
Tactics ring NewTactics ring

@ -58,4 +58,4 @@ Hint (n : ) (hn : odd n) (h : ∀ (x : ), (odd x) → even (x + 1)) : even
"`∀ (x : ), (odd x) → even (x + 1)` ist eigentlich das gleiche wie "`∀ (x : ), (odd x) → even (x + 1)` ist eigentlich das gleiche wie
`(x : ) → `" `(x : ) → `"
Tactics ring intro unfold NewTactics ring intro unfold

@ -22,4 +22,4 @@ Statement : ∃ (f : ), ∀ (x : ), f x = 0 := by
Conclusion "" Conclusion ""
Tactics use simp NewTactics use simp

@ -39,6 +39,6 @@ Ring zu lösen, funktioniert aber auch auf ``, auch wenn dieses kein Ring ist
(erst `` ist ein Ring). (erst `` ist ein Ring).
" "
Tactics ring NewTactics ring
#eval 4 / 6 #eval 4 / 6

@ -67,4 +67,4 @@ Hint (a : ) (b : ) (c : ) (d : ) (h₁ : c = d) (h₂ : d = b) (h₃
Conclusion "Übrigens, mit `rw [h₁, ←h₂]` könnte man mehrere `rw` zusammenfassen." Conclusion "Übrigens, mit `rw [h₁, ←h₂]` könnte man mehrere `rw` zusammenfassen."
Tactics assumption rw NewTactics assumption rw

@ -37,4 +37,4 @@ Hint (a : ) (b : ) (h : a = b) (g : a + a ^ 2 = b + 1) : a + a ^ 2 = a + 1
Conclusion "Übrigens, mit `rw [h] at *` kann man im weiteren `h` in **allen** Annahmen und Conclusion "Übrigens, mit `rw [h] at *` kann man im weiteren `h` in **allen** Annahmen und
dem Goal umschreiben." dem Goal umschreiben."
Tactics assumption rw NewTactics assumption rw

@ -30,4 +30,4 @@ Hint (y : ) : (2 * y + 1) ^ 2 = 4 * y ^ 2 + 3 * y + 1 + y =>
Conclusion "" Conclusion ""
Tactics ring rw NewTactics ring rw

@ -28,4 +28,4 @@ Conclusion
aufzurufen, deshalb brauchst du das nur noch selten. aufzurufen, deshalb brauchst du das nur noch selten.
" "
Tactics rfl NewTactics rfl

@ -67,5 +67,5 @@ Hint (n : ) (x : ) (hx : n = x + x) : n ^ 2 = 2 * x ^ 2 + 2 * x ^ 2 =>
Hint (n : ) (x : ) (hx : n = x + x) : (x + x) ^ 2 = 2 * x ^ 2 + 2 * x ^ 2 => Hint (n : ) (x : ) (hx : n = x + x) : (x + x) ^ 2 = 2 * x ^ 2 + 2 * x ^ 2 =>
"Die Taktik `ring` löst solche Gleichungen." "Die Taktik `ring` löst solche Gleichungen."
Tactics unfold rcases use rw ring NewTactics unfold rcases use rw ring
Lemmas Even Odd NewLemmas Even Odd

@ -50,4 +50,4 @@ Hint (n : ) (hn : Odd n) (h : ∀ (x : ), (Odd x) → Even (x + 1)) : Even
Conclusion "Für-alle-Statements, Implikationen und Lemmas/Theoreme verhalten sich alle Conclusion "Für-alle-Statements, Implikationen und Lemmas/Theoreme verhalten sich alle
praktisch gleich. Mehr dazu später." praktisch gleich. Mehr dazu später."
Tactics ring intro unfold NewTactics ring intro unfold

@ -62,6 +62,6 @@ Hint (n : ) : n + n = 2 * n => "Recap: `ring` löst Gleichungen in ``."
Conclusion "" Conclusion ""
Tactics push_neg intro use rw unfold ring NewTactics push_neg intro use rw unfold ring
Lemmas Even Odd not_even not_odd not_exists not_forall NewLemmas Even Odd not_even not_odd not_exists not_forall

@ -50,6 +50,6 @@ Statement
Conclusion "" Conclusion ""
Tactics push_neg intro use rw unfold ring NewTactics push_neg intro use rw unfold ring
Lemmas Even Odd not_even not_odd not_exists not_forall NewLemmas Even Odd not_even not_odd not_exists not_forall

@ -34,6 +34,6 @@ Statement
Conclusion "" Conclusion ""
Tactics NewTactics
Lemmas NewLemmas

@ -48,4 +48,4 @@ HiddenHint (A : Prop) (B : Prop) (C : Prop): ¬((¬B ¬ C) (A → B))
Conclusion "" Conclusion ""
Tactics tauto NewTactics tauto

@ -27,4 +27,4 @@ HiddenHint : 42 = 42 =>
Conclusion "Bravo! PS: `rfl` steht für \"reflexivity\"." Conclusion "Bravo! PS: `rfl` steht für \"reflexivity\"."
Tactics rfl NewTactics rfl

@ -32,4 +32,4 @@ HiddenHint (n : ) (h : 1 < n) : 1 < n =>
Conclusion "" Conclusion ""
Tactics assumption NewTactics assumption

@ -27,4 +27,4 @@ HiddenHint (A : Prop) (hA : A) : A =>
Conclusion "" Conclusion ""
Tactics assumption NewTactics assumption

@ -33,4 +33,4 @@ True := by
Conclusion "" Conclusion ""
Tactics trivial NewTactics trivial

@ -21,4 +21,4 @@ Statement
Conclusion "" Conclusion ""
Tactics trivial NewTactics trivial

@ -27,4 +27,4 @@ HiddenHint (A : Prop) (h : False) : A =>
"Wenn man einen Beweis von `False` hat, kann man mit `contradiction` das Goal beweisen, "Wenn man einen Beweis von `False` hat, kann man mit `contradiction` das Goal beweisen,
unabhängig davon, was das Goal ist." unabhängig davon, was das Goal ist."
Tactics contradiction NewTactics contradiction

@ -26,4 +26,4 @@ Conclusion
" "
" "
Tactics contradiction NewTactics contradiction

@ -29,4 +29,4 @@ Conclusion
" "
" "
Tactics contradiction NewTactics contradiction

@ -32,7 +32,7 @@ HiddenHint (A : Prop) (B : Prop) (hA : A) (hB : B) : A ∧ B =>
HiddenHint (A : Prop) (hA : A) : A => HiddenHint (A : Prop) (hA : A) : A =>
"Du hast einen Beweis dafür in den *Annahmen*." "Du hast einen Beweis dafür in den *Annahmen*."
Tactics constructor assumption NewTactics constructor assumption
-- Statement -- Statement
-- "Zeige $(A \\land (A \\Rightarrow B)) \\iff (A \\land B)$." -- "Zeige $(A \\land (A \\Rightarrow B)) \\iff (A \\land B)$."

@ -33,7 +33,7 @@ HiddenHint (A : Prop) (B : Prop) (C : Prop) (h : A ∧ (B ∧ C)) : B =>
HiddenHint (A : Prop) (hA : A) : A => HiddenHint (A : Prop) (hA : A) : A =>
"Du hast einen Beweis dafür in den *Annahmen*." "Du hast einen Beweis dafür in den *Annahmen*."
Tactics constructor assumption NewTactics constructor assumption
-- Statement -- Statement
-- "Zeige $(A \\land (A \\Rightarrow B)) \\iff (A \\land B)$." -- "Zeige $(A \\land (A \\Rightarrow B)) \\iff (A \\land B)$."

@ -30,4 +30,4 @@ HiddenHint (A : Prop) (B : Prop) (hA : A) : A (¬ B) =>
Hint (A : Prop) (B : Prop) (hA : A) : ¬ B => Hint (A : Prop) (B : Prop) (hA : A) : ¬ B =>
"Sackgasse. Probier's nochmals." "Sackgasse. Probier's nochmals."
Tactics left right assumption NewTactics left right assumption

@ -44,4 +44,4 @@ HiddenHint (A : Prop) (B : Prop) (h : A (A ∧ B)) : A =>
Hint (A : Prop) (B : Prop) (h : A ∧ B) : A => Hint (A : Prop) (B : Prop) (h : A ∧ B) : A =>
"Jetzt noch das UND in den Annahmen mit `rcases h with ⟨h₁, h₂⟩` zerlegen." "Jetzt noch das UND in den Annahmen mit `rcases h with ⟨h₁, h₂⟩` zerlegen."
Tactics assumption rcases NewTactics assumption rcases

@ -122,4 +122,4 @@ HiddenHint (A : Prop) (B : Prop) (C : Prop) (h : B ∧ C) : (A C) =>
HiddenHint (A : Prop) (B : Prop) : A B => HiddenHint (A : Prop) (B : Prop) : A B =>
"`left` oder `right`?" "`left` oder `right`?"
Tactics left right assumption constructor rcases rfl contradiction trivial NewTactics left right assumption constructor rcases rfl contradiction trivial

@ -21,4 +21,4 @@ Statement
: True := by : True := by
trivial trivial
Tactics rw NewTactics rw

@ -39,4 +39,4 @@ Statement mem_univ
trivial trivial
-- tauto -- tauto
Tactics tauto trivial NewTactics tauto trivial

@ -39,7 +39,7 @@ Statement subset_empty_iff
intro h hA intro h hA
apply mem_univ -- or `trivial`. apply mem_univ -- or `trivial`.
Tactics intro trivial apply NewTactics intro trivial apply
-- blocked: tauto simp -- blocked: tauto simp
end MySet end MySet

@ -54,8 +54,8 @@ Statement subset_empty_iff
rcases a with ⟨h₁, h₂⟩ rcases a with ⟨h₁, h₂⟩
assumption assumption
Tactics constructor intro rw assumption rcases simp tauto trivial NewTactics constructor intro rw assumption rcases simp tauto trivial
Lemmas Subset.antisymm_iff empty_subset NewLemmas Subset.antisymm_iff empty_subset
end MySet end MySet

@ -45,8 +45,8 @@ Statement eq_empty_iff_forall_not_mem
rw [←subset_empty_iff] rw [←subset_empty_iff]
rfl -- This is quite a miracle :) rfl -- This is quite a miracle :)
Tactics constructor intro rw assumption rcases simp tauto trivial NewTactics constructor intro rw assumption rcases simp tauto trivial
Lemmas Subset.antisymm_iff empty_subset NewLemmas Subset.antisymm_iff empty_subset
end MySet end MySet

@ -30,6 +30,6 @@ Statement nonempty_iff_ne_empty
push_neg push_neg
rfl rfl
Tactics constructor intro rw assumption rcases simp tauto trivial NewTactics constructor intro rw assumption rcases simp tauto trivial
Lemmas Subset.antisymm_iff empty_subset NewLemmas Subset.antisymm_iff empty_subset

@ -26,6 +26,6 @@ Statement
"" (A B : Set ) : (A ∅) ∩ B = A ∩ (univ ∩ B) := by "" (A B : Set ) : (A ∅) ∩ B = A ∩ (univ ∩ B) := by
simp simp
Tactics constructor intro rw assumption rcases simp tauto trivial NewTactics constructor intro rw assumption rcases simp tauto trivial
Lemmas Subset.antisymm_iff empty_subset NewLemmas Subset.antisymm_iff empty_subset

@ -30,6 +30,6 @@ Statement
rw [←union_diff_distrib] rw [←union_diff_distrib]
rw [univ_union] rw [univ_union]
Tactics constructor intro rw assumption rcases simp tauto trivial NewTactics constructor intro rw assumption rcases simp tauto trivial
Lemmas Subset.antisymm_iff empty_subset NewLemmas Subset.antisymm_iff empty_subset

@ -30,6 +30,6 @@ Statement
rw [←not_mem_compl_iff] rw [←not_mem_compl_iff]
exact h4 exact h4
Tactics constructor intro rw assumption rcases simp tauto trivial NewTactics constructor intro rw assumption rcases simp tauto trivial
Lemmas Subset.antisymm_iff empty_subset NewLemmas Subset.antisymm_iff empty_subset

@ -22,7 +22,7 @@ man die de-Morganschen Regeln einfach selber beweisen könnten.
Die meisten Aufgaben über Mengen sind eine Kombination von `rw` und `simp_rw` verschiedenster Die meisten Aufgaben über Mengen sind eine Kombination von `rw` und `simp_rw` verschiedenster
Lemmas in `import Mathlib.Data.Set`. NewLemmas in `import Mathlib.Data.Set`.
Die Taktik `simp_rw` funktioniert ähnlich wie `rw`, aber sie versucht jedes Lemma so oft Die Taktik `simp_rw` funktioniert ähnlich wie `rw`, aber sie versucht jedes Lemma so oft
wie möglich anzuwenden. Wir kennen also 4 etwas verwandte Optionen um Lemmas und Theoreme zu wie möglich anzuwenden. Wir kennen also 4 etwas verwandte Optionen um Lemmas und Theoreme zu
@ -52,7 +52,7 @@ Statement
rw [diff_eq_compl_inter] rw [diff_eq_compl_inter]
rw [inter_comm] rw [inter_comm]
Tactics constructor intro rw assumption rcases simp tauto trivial NewTactics constructor intro rw assumption rcases simp tauto trivial
-- TODOs -- TODOs
-- Lemmas compl_union compl_inter mem_compl_iff -- Lemmas compl_union compl_inter mem_compl_iff

@ -33,6 +33,6 @@ Statement
rw [Set.mem_diff] rw [Set.mem_diff]
exact hx exact hx
Tactics constructor intro rw assumption rcases simp tauto trivial NewTactics constructor intro rw assumption rcases simp tauto trivial
Lemmas Subset.antisymm_iff empty_subset NewLemmas Subset.antisymm_iff empty_subset

@ -32,6 +32,6 @@ Statement
({4, 9} : Set ) = Set.insert 4 {9} := by ({4, 9} : Set ) = Set.insert 4 {9} := by
rfl rfl
Tactics constructor intro rw assumption rcases simp tauto trivial NewTactics constructor intro rw assumption rcases simp tauto trivial
Lemmas Subset.antisymm_iff empty_subset NewLemmas Subset.antisymm_iff empty_subset

@ -35,5 +35,5 @@ Statement
simp_rw [mem_insert_iff, mem_singleton_iff] at * simp_rw [mem_insert_iff, mem_singleton_iff] at *
tauto tauto
Tactics simp_rw intro tauto rw NewTactics simp_rw intro tauto rw
--Lemmas Subset.antisymm_iff empty_subset --Lemmas Subset.antisymm_iff empty_subset

@ -32,6 +32,6 @@ Statement
use 1 use 1
ring ring
Tactics constructor intro rw assumption rcases simp tauto trivial NewTactics constructor intro rw assumption rcases simp tauto trivial
Lemmas Subset.antisymm_iff empty_subset NewLemmas Subset.antisymm_iff empty_subset

@ -37,6 +37,6 @@ Statement
assumption assumption
Tactics constructor intro rw assumption rcases simp tauto trivial NewTactics constructor intro rw assumption rcases simp tauto trivial
Lemmas Subset.antisymm_iff empty_subset NewLemmas Subset.antisymm_iff empty_subset

@ -36,6 +36,6 @@ Statement
ring ring
Tactics constructor intro rw assumption rcases simp tauto trivial NewTactics constructor intro rw assumption rcases simp tauto trivial
Lemmas Subset.antisymm_iff empty_subset NewLemmas Subset.antisymm_iff empty_subset

@ -34,6 +34,6 @@ Statement
ring ring
Tactics constructor intro rw assumption rcases simp tauto trivial NewTactics constructor intro rw assumption rcases simp tauto trivial
Lemmas Subset.antisymm_iff empty_subset NewLemmas Subset.antisymm_iff empty_subset

@ -28,6 +28,6 @@ Statement
{ x ∈ (S : Set ) | 0 ≤ x} ⊆ S := by { x ∈ (S : Set ) | 0 ≤ x} ⊆ S := by
library_search library_search
Tactics constructor intro rw assumption rcases simp tauto trivial NewTactics constructor intro rw assumption rcases simp tauto trivial
Lemmas Subset.antisymm_iff empty_subset NewLemmas Subset.antisymm_iff empty_subset

@ -23,6 +23,6 @@ Statement
use 1 use 1
ring ring
Tactics constructor intro rw assumption rcases simp tauto trivial NewTactics constructor intro rw assumption rcases simp tauto trivial
Lemmas Subset.antisymm_iff empty_subset NewLemmas Subset.antisymm_iff empty_subset

@ -22,6 +22,6 @@ open Set
Statement Statement
"" : True := sorry "" : True := sorry
Tactics constructor intro rw assumption rcases simp tauto trivial NewTactics constructor intro rw assumption rcases simp tauto trivial
Lemmas Subset.antisymm_iff empty_subset NewLemmas Subset.antisymm_iff empty_subset

@ -23,6 +23,6 @@ Statement
use 1 use 1
ring ring
Tactics constructor intro rw assumption rcases simp tauto trivial NewTactics constructor intro rw assumption rcases simp tauto trivial
Lemmas Subset.antisymm_iff empty_subset NewLemmas Subset.antisymm_iff empty_subset

@ -54,8 +54,7 @@ Statement
rw [←Set.union_diff_distrib] rw [←Set.union_diff_distrib]
rw [Set.univ_union] rw [Set.univ_union]
Tactics rw NewTactics rw
example : 4 ∈ (univ : Set ) := by example : 4 ∈ (univ : Set ) := by
trivial trivial

@ -35,4 +35,4 @@ lemma asdf (a b c d : ) (h₁ : c = d) (h₂ : a = b) (h₃ : a = d) : b = c
Conclusion "" Conclusion ""
Tactics assumption NewTactics assumption

Loading…
Cancel
Save