You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lean4game/server/leanserver/GameServer/EnvExtensions.lean

150 lines
4.4 KiB
Plaintext

import GameServer.HashMapExtension
import GameServer.SingleValPersistentEnvExtension
/-! # Environment extensions
The game framework stores almost all its game building data in environment extensions
defined in this file. MAyn of them are `SimplePersistentEnvExtension` but we also
use `HashMapExtension` and `SingleValPersistentEnvExtension`
-/
open Lean
/-! ## Messages -/
structure GoalMessageEntry where
ctx_size : Nat
normalized_goal : Expr
intro_nb : Nat
message : String
deriving Repr
/-! ## Tactic documentation -/
structure TacticDocEntry where
name : Name
content : String
deriving ToJson, Repr
/-- Environment extension for tactic documentation. -/
initialize tacticDocExt : SimplePersistentEnvExtension TacticDocEntry (Array TacticDocEntry) ←
registerSimplePersistentEnvExtension {
name := `tactic_doc
addEntryFn := Array.push
addImportedFn := Array.concatMap id
}
open Elab Command in
/-- Print a registered tactic doc for debugging purposes. -/
elab "#print_tactic_doc" : command => do
for entry in tacticDocExt.getState (← getEnv) do
dbg_trace "{entry.name} : {entry.content}"
structure TacticSetEntry where
name : Name
tactics : Array TacticDocEntry
deriving ToJson, Repr
/-- Environment extension for tactic sets. -/
initialize tacticSetExt : SimplePersistentEnvExtension TacticSetEntry (Array TacticSetEntry) ←
registerSimplePersistentEnvExtension {
name := `tactic_set
addEntryFn := Array.push
addImportedFn := Array.concatMap id
}
open Elab Command in
/-- Print all registered tactic sets for debugging purposes. -/
elab "#print_tactic_set" : command => do
for entry in tacticSetExt.getState (← getEnv) do
dbg_trace "{entry.name} : {entry.tactics.map TacticDocEntry.name}"
/-! ## Lemma documentation -/
structure LemmaDocEntry where
name : Name
userName : Name
category : String
content : String
deriving ToJson, Repr
/-- Environment extension for lemma documentation. -/
initialize lemmaDocExt : SimplePersistentEnvExtension LemmaDocEntry (Array LemmaDocEntry) ←
registerSimplePersistentEnvExtension {
name := `lemma_doc
addEntryFn := Array.push
addImportedFn := Array.concatMap id
}
open Elab Command in
/-- Print a lemma doc for debugging purposes. -/
elab "#print_lemma_doc" : command => do
for entry in lemmaDocExt.getState (← getEnv) do
dbg_trace "{entry.userName} ({entry.name}) in {entry.category}: {entry.content}"
structure LemmaSetEntry where
name : Name
title : String
lemmas : Array LemmaDocEntry
deriving ToJson, Repr
/-- Environment extension for lemma sets. -/
initialize lemmaSetExt : SimplePersistentEnvExtension LemmaSetEntry (Array LemmaSetEntry) ←
registerSimplePersistentEnvExtension {
name := `lemma_set
addEntryFn := Array.push
addImportedFn := Array.concatMap id
}
open Elab Command in
/-- Print all registered lemma sets for debugging purposes. -/
elab "#print_lemma_set" : command => do
for entry in lemmaSetExt.getState (← getEnv) do
dbg_trace "{entry.name} : {entry.lemmas.map LemmaDocEntry.name}"
/-! ## Game -/
structure Game where
name : Name
title : String := ""
introduction : String := ""
conclusion : String := ""
authors : List String := []
nb_levels : Nat := 0
deriving Repr, Inhabited, ToJson
initialize gameExt : SingleValPersistentEnvExtension Game ← registerSingleValPersistentEnvExtension `gameExt Game
/-! ## Levels -/
/- Register a (non-persistent) environment extension to hold the current level number. -/
initialize curLevelExt : EnvExtension Nat ← registerEnvExtension (pure 0)
variable {m: Type → Type} [Monad m] [MonadEnv m]
def setCurLevelIdx (lvl : Nat) : m Unit :=
modifyEnv (curLevelExt.setState · lvl)
def getCurLevelIdx : m Nat := do
return curLevelExt.getState (← getEnv)
structure GameLevel where
index: Nat
title: String := default
introduction: String := default
conclusion: String := default
tactics: Array TacticDocEntry := default
lemmas: Array LemmaDocEntry := default
messages: Array GoalMessageEntry := default
goal : TSyntax `Lean.Parser.Command.declSig := default
deriving Inhabited, Repr
initialize levelsExt : HashMapExtension Nat GameLevel ← mkHashMapExtension `levels Nat GameLevel
def getCurLevel [MonadError m] : m GameLevel := do
let idx ← getCurLevelIdx
match (← levelsExt.find? idx) with
| some level => return level
| none => throwError "Couldn't find level {idx}"