Library MetaRocq.Template.TemplateMonad.Extractable
From MetaRocq.Utils Require Import utils.
From MetaRocq.Template Require Import Ast AstUtils TemplateMonad.Common.
Local Set Universe Polymorphism.
From MetaRocq.Template Require Import Ast AstUtils TemplateMonad.Common.
Local Set Universe Polymorphism.
The Extractable Template Monad
Cumulative Inductive TM@{t} : Type@{t} → Type :=
| tmReturn {A:Type@{t}}
: A → TM A
| tmBind {A B : Type@{t}}
: TM A → (A → TM B) → TM B
| tmPrint : Ast.term → TM unit
| tmMsg : string → TM unit
| tmFail : ∀ {A:Type@{t}}, string → TM A
| tmEval (red : reductionStrategy) (tm : Ast.term)
: TM Ast.term
| tmDefinition_ (opaque : bool)
(nm : ident)
(type : option Ast.term) (term : Ast.term)
: TM kername
| tmAxiom (nm : ident)
(type : Ast.term)
: TM kername
| tmLemma (nm : ident)
(type : Ast.term)
: TM kername
| tmFreshName : ident → TM ident
| tmLocate : qualid → TM (list global_reference)
| tmLocateModule : qualid → TM (list modpath)
| tmLocateModType : qualid → TM (list modpath)
| tmCurrentModPath : TM modpath
| tmQuoteInductive (nm : kername)
: TM mutual_inductive_body
| tmQuoteConstant (nm : kername) (bypass_opacity : bool)
: TM constant_body
| tmQuoteUniverses : TM ConstraintSet.t
| tmQuoteModule : qualid → TM (list global_reference)
| tmQuoteModFunctor : qualid → TM (list global_reference)
| tmQuoteModType : qualid → TM (list global_reference)
| tmInductive : bool → mutual_inductive_entry → TM unit
| tmExistingInstance : hint_locality → global_reference → TM unit
| tmInferInstance (type : Ast.term)
: TM (option Ast.term)
.
Definition TypeInstance : Common.TMInstance :=
{| Common.TemplateMonad := TM
; Common.tmReturn:=@tmReturn
; Common.tmBind:=@tmBind
; Common.tmFail:=@tmFail
; Common.tmFreshName:=@tmFreshName
; Common.tmLocate:=@tmLocate
; Common.tmLocateModule:=@tmLocateModule
; Common.tmLocateModType:=@tmLocateModType
; Common.tmCurrentModPath:=fun _ ⇒ @tmCurrentModPath
; Common.tmQuoteInductive:=@tmQuoteInductive
; Common.tmQuoteUniverses:=@tmQuoteUniverses
; Common.tmQuoteConstant:=@tmQuoteConstant
; Common.tmMkInductive:=@tmInductive
; Common.tmExistingInstance:=@tmExistingInstance
|}.
Definition tmOpaqueDefinition (nm : ident)
(type : option Ast.term) (term : Ast.term) :=
tmDefinition_ true nm type term.
Definition tmDefinition (nm : ident)
(type : option Ast.term) (term : Ast.term) :=
tmDefinition_ false nm type term.
Definition tmInductive' (mind : mutual_inductive_body) : TM unit
:= tmInductive false (mind_body_to_entry mind).
Definition tmLemmaRed (i : ident) (rd : reductionStrategy)
(ty : Ast.term) :=
tmBind (tmEval rd ty) (fun ty ⇒ tmLemma i ty).
Definition tmAxiomRed (i : ident) (rd : reductionStrategy) (ty : Ast.term)
:=
tmBind (tmEval rd ty) (fun ty ⇒ tmAxiom i ty).
Definition tmDefinitionRed (opaque : bool) (i : ident) (rd : reductionStrategy)
(ty : option Ast.term) (body : Ast.term) :=
match ty with
| None ⇒ tmDefinition_ opaque i None body
| Some ty ⇒
tmBind (tmEval rd ty) (fun ty ⇒ tmDefinition_ opaque i (Some ty) body)
end.
Definition tmInferInstanceRed (rd : reductionStrategy) (type : Ast.term)
: TM (option Ast.term) :=
tmBind (tmEval rd type) (fun type ⇒ tmInferInstance type).