|
|
|
@ -345,7 +345,7 @@ elab "LemmaTab" category:str : command => do
|
|
|
|
|
|
|
|
|
|
/-! # Exercise Statement -/
|
|
|
|
|
|
|
|
|
|
/-- You can write `Statement add_comm (preample := simp) .... := by` which
|
|
|
|
|
/-- You can write `Statement add_comm (preamble := simp) .... := by` which
|
|
|
|
|
will automatically execute the given tactic sequence before the exercise
|
|
|
|
|
is handed to the player.
|
|
|
|
|
|
|
|
|
@ -361,18 +361,18 @@ For example in "Show that all matrices with first column zero form a submodule",
|
|
|
|
|
you could provide the set of all these matrices as `carrier` and the player will receive
|
|
|
|
|
all the `Prop`-valued fields as goals.
|
|
|
|
|
-/
|
|
|
|
|
syntax preampleArg := atomic(" (preample := " withoutPosition(tacticSeq) ")")
|
|
|
|
|
syntax preambleArg := atomic(" (preamble := " withoutPosition(tacticSeq) ")")
|
|
|
|
|
|
|
|
|
|
/-- Define the statement of the current level. -/
|
|
|
|
|
elab doc:docComment ? attrs:Parser.Term.attributes ?
|
|
|
|
|
"Statement" statementName:ident ? preample:preampleArg ? sig:declSig val:declVal : command => do
|
|
|
|
|
"Statement" statementName:ident ? preamble:preambleArg ? sig:declSig val:declVal : command => do
|
|
|
|
|
let lvlIdx ← getCurLevelIdx
|
|
|
|
|
|
|
|
|
|
-- add an optional tactic sequence that the engine executes before the game starts
|
|
|
|
|
let preampleSeq : TSyntax `Lean.Parser.Tactic.tacticSeq ← match preample with
|
|
|
|
|
let preambleSeq : TSyntax `Lean.Parser.Tactic.tacticSeq ← match preamble with
|
|
|
|
|
| none => `(Parser.Tactic.tacticSeq|skip)
|
|
|
|
|
| some x => match x with
|
|
|
|
|
| `(preampleArg| (preample := $tac)) => pure tac
|
|
|
|
|
| `(preambleArg| (preamble := $tac)) => pure tac
|
|
|
|
|
| _ => `(Parser.Tactic.tacticSeq|skip)
|
|
|
|
|
|
|
|
|
|
let docContent ← parseDocComment doc
|
|
|
|
@ -414,17 +414,17 @@ elab doc:docComment ? attrs:Parser.Term.attributes ?
|
|
|
|
|
-- in that case.
|
|
|
|
|
logWarningAt name (m!"Environment already contains {fullName}! Only the existing " ++
|
|
|
|
|
m!"statement will be available in later levels:\n\n{origType}")
|
|
|
|
|
let thmStatement ← `(command| $[$doc]? $[$attrs:attributes]? theorem $defaultDeclName $sig := by {let_intros; $(⟨preampleSeq⟩); $(⟨tacticStx⟩)})
|
|
|
|
|
let thmStatement ← `(command| $[$doc]? $[$attrs:attributes]? theorem $defaultDeclName $sig := by {let_intros; $(⟨preambleSeq⟩); $(⟨tacticStx⟩)})
|
|
|
|
|
elabCommand thmStatement
|
|
|
|
|
-- Check that statement has a docs entry.
|
|
|
|
|
checkInventoryDoc .Lemma name (name := fullName) (template := docContent)
|
|
|
|
|
else
|
|
|
|
|
let thmStatement ← `(command| $[$doc]? $[$attrs:attributes]? theorem $name $sig := by {let_intros; $(⟨preampleSeq⟩); $(⟨tacticStx⟩)})
|
|
|
|
|
let thmStatement ← `(command| $[$doc]? $[$attrs:attributes]? theorem $name $sig := by {let_intros; $(⟨preambleSeq⟩); $(⟨tacticStx⟩)})
|
|
|
|
|
elabCommand thmStatement
|
|
|
|
|
-- Check that statement has a docs entry.
|
|
|
|
|
checkInventoryDoc .Lemma name (name := fullName) (template := docContent)
|
|
|
|
|
| none =>
|
|
|
|
|
let thmStatement ← `(command| $[$doc]? $[$attrs:attributes]? theorem $defaultDeclName $sig := by {let_intros; $(⟨preampleSeq⟩); $(⟨tacticStx⟩)})
|
|
|
|
|
let thmStatement ← `(command| $[$doc]? $[$attrs:attributes]? theorem $defaultDeclName $sig := by {let_intros; $(⟨preambleSeq⟩); $(⟨tacticStx⟩)})
|
|
|
|
|
elabCommand thmStatement
|
|
|
|
|
|
|
|
|
|
let msgs := (← get).messages
|
|
|
|
@ -499,7 +499,7 @@ elab doc:docComment ? attrs:Parser.Term.attributes ?
|
|
|
|
|
modifyCurLevel fun level => pure { level with
|
|
|
|
|
module := env.header.mainModule
|
|
|
|
|
goal := sig,
|
|
|
|
|
preample := preampleSeq
|
|
|
|
|
preamble := preambleSeq
|
|
|
|
|
scope := scope,
|
|
|
|
|
descrText := docContent
|
|
|
|
|
statementName := match statementName with
|
|
|
|
|