merge addition of Lemma statements

This commit is contained in:
Jon Eugster
2022-12-12 20:54:31 +01:00
parent b2727eef89
commit 46848d8a93
43 changed files with 113 additions and 64 deletions
+40 -6
View File
@@ -46,13 +46,47 @@ elab "Introduction" t:str : command => do
| .World => modifyCurWorld fun world => pure {world with introduction := t.getString}
| .Game => modifyCurGame fun game => pure {game with introduction := t.getString}
/-- Define the statement of the current level. -/
elab "Statement" statementName:ident ? descr:str ? sig:declSig val:declVal : command => do
-- TODO: Instead of this, it would be nice to have a proper syntax parser that enables
-- us highlighting on the client side.
partial def reprintCore : Syntax → Option Format
| Syntax.missing => none
| Syntax.atom _ val => val.trim
| Syntax.ident _ rawVal _ _ => rawVal.toString
| Syntax.node _ kind args =>
match args.toList.filterMap reprintCore with
| [] => none
| [arg] => arg
| args => Format.group <| Format.nest 2 <| Format.joinSep args " "
def reprint (stx : Syntax) : Format :=
reprintCore stx |>.getD ""
-- macro mods:declModifiers "lemma" n:declId sig:declSig val:declVal : command => `($mods:declModifiers theorem $n $sig $val)
/-- Define the statement of the current level.
Arguments:
- ident: (Optional) The name of the statemtent.
- descr: The human-readable version of the lemma as string. Accepts Markdown and Mathjax.
-/
elab "Statement" statementName:ident ? descr:str sig:declSig val:declVal : command => do
let lvlIdx ← getCurLevelIdx
let declName : Name := (← getCurGame).name ++ (← getCurWorld).name ++ ("level" ++ toString lvlIdx : String)
elabCommand (← `(theorem $(mkIdent declName) $sig $val))
modifyCurLevel fun level => pure {level with goal := sig}
-- TODO: Do something with the lemma name.
let defaultDeclName : Name := (← getCurGame).name ++ (← getCurWorld).name ++
("level" ++ toString lvlIdx : String)
let thmStatement ← `(theorem $(mkIdent defaultDeclName) $sig $val)
-- let thmStatement' ← match statementName with
-- | none => `(lemma $(mkIdent "XX") $sig $val) -- TODO: Make it into an `example`
-- | some name => `(lemma $name $sig $val)
elabCommand thmStatement
modifyCurLevel fun level => pure {level with
goal := sig,
descrText := descr.getString,
descrFormat := match statementName with
| none => "example " ++ (toString <| reprint sig.raw) ++ " := by"
| some name => (Format.join ["lemma ", reprint name.raw, " ", reprint sig.raw, " := by"]).pretty 10 -- "lemma " ++ (toString <| reprint name.raw) ++ " " ++ (Format.pretty (reprint sig.raw) 40) ++ " := by"
} -- Format.pretty <| format thmStatement.raw }
/-- Define the conclusion of the current game or current level if some
building a level. -/
@@ -182,6 +182,16 @@ deriving Inhabited
def getCurLevelId [MonadError m] : m LevelId := do
return { game := ← getCurGameId, world := ← getCurWorldId, level := ← getCurLevelIdx}
/--
Fields:
- TODO
- introduction: Theory block shown all the time.
- description: The mathematical statemtent in mathematician-readable form.
- goal: The statement in Lean.
- conclusion: Displayed when level is completed.
-/
structure GameLevel where
index: Nat
title: String := default
@@ -191,6 +201,8 @@ structure GameLevel where
lemmas: Array LemmaDocEntry := default
messages: Array GoalMessageEntry := default
goal : TSyntax `Lean.Parser.Command.declSig := default
descrText: String := default
descrFormat : String := default
deriving Inhabited, Repr
/-! ## World -/
+4
View File
@@ -35,6 +35,8 @@ structure LevelInfo where
tactics: Array TacticDocEntry
lemmas: Array LemmaDocEntry
introduction : String
descrText : String := ""
descrFormat : String := ""
deriving ToJson
structure LoadLevelParams where
@@ -62,6 +64,8 @@ partial def handleServerEvent (ev : ServerEvent) : GameServerM Bool := do
title := lvl.title,
tactics := lvl.tactics,
lemmas := lvl.lemmas,
descrText := lvl.descrText,
descrFormat := lvl.descrFormat --toExpr <| format (lvl.goal.raw) --toString <| Syntax.formatStx (lvl.goal.raw) --Syntax.formatStx (lvl.goal.raw) , -- TODO
introduction := lvl.introduction }
c.hOut.writeLspResponse ⟨id, ToJson.toJson levelInfo⟩
return true
@@ -24,8 +24,8 @@ structure GameGoal where
deriving FromJson, ToJson
def Lean.MVarId.toGameGoal (goal : MVarId) (messages : Array String)
(hints : Array String) : MetaM GameGoal := do
def Lean.MVarId.toGameGoal (goal : MVarId)
(messages : Array String) (hints : Array String) : MetaM GameGoal := do
match (← getMCtx).findDecl? goal with
| none => throwError "unknown goal"
| some mvarDecl => do