Note [Environment Branches] #
The kernel environment type Lean.Kernel.Environment
enforces a linear order on the addition of
declarations: addDeclCore
takes an environment and returns a new one, assuming type checking
succeeded. On the other hand, the metaprogramming-level Lean.Environment
wrapper must allow for
branching environment transformations so that multiple declarations can be elaborated
concurrently while still being able to access information about preceding declarations that have
also been branched out as soon as they are available.
The basic function to introduce such branches is addConstAsync
, which takes an environment and
returns a structure containing two environments: one for the "main" branch that can be used in
further branching and eventually contains all the declarations of the file and one for the "async"
branch that can be used concurrently to the main branch to elaborate and add the declaration for
which the branch was introduced. Branches are "joined" back together implicitly via the kernel
environment, which as mentioned cannot be changed concurrently: when the main branch first tries to
access it, evaluation is blocked until the kernel environment on the async branch is complete.
Thus adding two declarations A and B concurrently can be visualized like this:
o addConstAsync A
|\
| \
| \
o addConstAsync B
|\ \
| \ o elaborate A
| \ |
| o elaborate B
| | |
| | o addDeclCore A
| |/
| o addDeclCore B
| /
| /
|/
o .olean serialization calls Environment.toKernelEnv
While each edge represents a Lean.Environment
that has its own view of the state of the module,
the kernel environment really lives only in the right-most path, with all other paths merely holding
an unfulfilled Task
representing it and where forcing that task leads to the back-edges joining
paths back together.
Opaque environment extension state.
Instances For
Equations
Equations
Equations
- Lean.instInhabitedModuleIdx = { default := 0 }
Equations
Instances For
Equations
- Lean.instReprImport = { reprPrec := Lean.reprImport✝ }
Equations
- Lean.instInhabitedImport = { default := { module := default, runtimeOnly := default } }
Equations
- Lean.instCoeNameImport = { coe := fun (x : Lean.Name) => { module := x, runtimeOnly := false } }
Equations
- Lean.instToStringImport = { toString := fun (imp : Lean.Import) => toString imp.module ++ if imp.runtimeOnly = true then " (runtime)" else "" }
A compacted region holds multiple Lean objects in a contiguous memory region, which can be read/written to/from disk. Objects inside the region do not have reference counters and cannot be freed individually. The contents of .olean files are compacted regions.
Equations
Instances For
Free a compacted region and its contents. No live references to the contents may exist at the time of invocation.
Instances For
Content of a .olean file.
We use compact.cpp
to generate the image of this object in disk.
constNames
contains all constant names inconstants
. This information is redundant. It is equal toconstants.map fun c => c.name
, but it improves the performance ofimportModules
.perf
reports that 12% of the runtime was being spent onConstantInfo.name
when importing a file containing onlyimport Lean
- constants : Array ConstantInfo
Extra entries for the
const2ModIdx
map in theEnvironment
object. The code generator creates auxiliary declarations that are not in the mappingconstants
, but we want to know in which module they were generated.- entries : Array (Name × Array EnvExtensionEntry)
Instances For
Environment fields that are not used often.
- trustLevel : UInt32
The trust level used by the kernel. For example, the kernel assumes imported constants are type correct when the trust level is greater than zero.
- mainModule : Name
Name of the module being compiled.
Direct imports
- regions : Array CompactedRegion
Compacted regions for all imported modules. Objects in compacted memory regions do no require any memory management.
Name of all imported modules (directly and indirectly). The index of a module name in the array equals the
ModuleIdx
for the same module.- moduleData : Array ModuleData
Module data for all imported modules.
Instances For
Equations
- Lean.Kernel.instInhabitedDiagnostics = { default := { unfoldCounter := default, enabled := default } }
An environment stores declarations provided by the user. The kernel
currently supports different kinds of declarations such as definitions, theorems,
and inductive families. Each has a unique identifier (i.e., Name
), and can be
parameterized by a sequence of universe parameters.
A constant in Lean is just a reference to a ConstantInfo
object. The main task of
the kernel is to type check these declarations and refuse type incorrect ones. The
kernel does not allow declarations containing metavariables and/or free variables
to be added to an environment. Environments are never destructively updated.
The environment also contains a collection of extensions. For example, the simp
theorems
declared by users are stored in an environment extension. Users can declare new extensions
using meta-programming.
- constants : ConstMap
Mapping from constant name to
ConstantInfo
. It contains all constants (definitions, theorems, axioms, etc) that have been already type checked by the kernel. - quotInit : Bool
- diagnostics : Diagnostics
Diagnostic information collected during kernel execution.
Remark: We store kernel diagnostic information in an environment field to simplify the interface with the kernel implemented in C/C++. Thus, we can only track declarations in methods, such as
addDecl
, which return a new environment.Kernel.isDefEq
andKernel.whnf
do not update the statistics. We claim this is ok since these methods are mainly used for debugging. - const2ModIdx : Std.HashMap Name ModuleIdx
Mapping from constant name to module (index) where constant has been declared. Recall that a Lean file has a header where previously compiled modules can be imported. Each imported module has a unique
ModuleIdx
. Many extensions use theModuleIdx
to efficiently retrieve information stored in imported modules.Remark: this mapping also contains auxiliary constants, created by the code generator, that are not in the field
constants
. These auxiliary constants are invisible to the Lean kernel and elaborator. Only the code generator uses them. - extensions : Array Lean.EnvExtensionState
Environment extensions. It also includes user-defined extensions.
- extraConstNames : Lean.NameSet
Constant names to be saved in the field
extraConstNames
atModuleData
. It contains auxiliary declaration names created by the code generator which are not inconstants
. When importing modules, we want to insert them atconst2ModIdx
. - header : EnvironmentHeader
The header contains additional information that is set at import time.
Instances For
Exceptions that can be raised by the kernel when type checking new declarations.
- unknownConstant (env : Environment) (name : Name) : Exception
- alreadyDeclared (env : Environment) (name : Name) : Exception
- declTypeMismatch (env : Environment) (decl : Declaration) (givenType : Expr) : Exception
- declHasMVars (env : Environment) (name : Name) (expr : Expr) : Exception
- declHasFVars (env : Environment) (name : Name) (expr : Expr) : Exception
- funExpected (env : Environment) (lctx : LocalContext) (expr : Expr) : Exception
- typeExpected (env : Environment) (lctx : LocalContext) (expr : Expr) : Exception
- letTypeMismatch (env : Environment) (lctx : LocalContext) (name : Name) (givenType expectedType : Expr) : Exception
- exprTypeMismatch (env : Environment) (lctx : LocalContext) (expr expectedType : Expr) : Exception
- appTypeMismatch (env : Environment) (lctx : LocalContext) (app funType argType : Expr) : Exception
- invalidProj (env : Environment) (lctx : LocalContext) (proj : Expr) : Exception
- thmTypeIsNotProp (env : Environment) (name : Name) (type : Expr) : Exception
- other (msg : String) : Exception
- deterministicTimeout : Exception
- excessiveMemory : Exception
- deepRecursion : Exception
- interrupted : Exception
Instances For
Equations
- env.find? n = Lean.SMap.find?' env.constants n
Instances For
Type check given declaration and add it to the environment
Add declaration to kernel without type checking it.
WARNING This function is meant for temporarily working around kernel performance issues. It compromises soundness because, for example, a buggy tactic may produce an invalid proof, and the kernel will not catch it if the new option is set to true.
Equations
Instances For
Enables/disables kernel diagnostics.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- env.isDiagnosticsEnabled = env.diagnostics.enabled
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
Instances For
- defn : ConstantKind
- thm : ConstantKind
- axiom : ConstantKind
- opaque : ConstantKind
- quot : ConstantKind
- induct : ConstantKind
- ctor : ConstantKind
- recursor : ConstantKind
Instances For
Equations
- Lean.instInhabitedConstantKind = { default := Lean.ConstantKind.defn }
Equations
- Lean.instBEqConstantKind = { beq := Lean.beqConstantKind✝ }
Equations
- Lean.instReprConstantKind = { reprPrec := Lean.reprConstantKind✝ }
Equations
- Lean.ConstantKind.ofConstantInfo (Lean.ConstantInfo.defnInfo val) = Lean.ConstantKind.defn
- Lean.ConstantKind.ofConstantInfo (Lean.ConstantInfo.thmInfo val) = Lean.ConstantKind.thm
- Lean.ConstantKind.ofConstantInfo (Lean.ConstantInfo.axiomInfo val) = Lean.ConstantKind.axiom
- Lean.ConstantKind.ofConstantInfo (Lean.ConstantInfo.opaqueInfo val) = Lean.ConstantKind.opaque
- Lean.ConstantKind.ofConstantInfo (Lean.ConstantInfo.quotInfo val) = Lean.ConstantKind.quot
- Lean.ConstantKind.ofConstantInfo (Lean.ConstantInfo.inductInfo val) = Lean.ConstantKind.induct
- Lean.ConstantKind.ofConstantInfo (Lean.ConstantInfo.ctorInfo val) = Lean.ConstantKind.ctor
- Lean.ConstantKind.ofConstantInfo (Lean.ConstantInfo.recInfo val) = Lean.ConstantKind.recursor
Instances For
ConstantInfo
variant that allows for asynchronous filling of components via tasks.
- name : Name
The declaration name, known immediately.
- kind : ConstantKind
The kind of the constant, known immediately.
- sig : Task ConstantVal
The "signature" including level params and type, potentially filled asynchronously.
- constInfo : Task ConstantInfo
The final, complete constant info, potentially filled asynchronously.
Instances For
Equations
- c.toConstantVal = c.sig.get
Instances For
Equations
- c.toConstantInfo = c.constInfo.get
Instances For
Equations
- Lean.AsyncConstantInfo.ofConstantInfo c = { name := c.name, kind := Lean.ConstantKind.ofConstantInfo c, sig := { get := c.toConstantVal }, constInfo := { get := c } }
Instances For
Information about the current branch of the environment representing asynchronous elaboration.
- declPrefix : Name
Name of the declaration asynchronous elaboration was started for. All constants added to this environment branch must have the name as a prefix, after erasing macro scopes and private name prefixes.
Instances For
Checks whether a declaration named n
may be added to the environment in the given context. See
also AsyncContext.declPrefix
.
Equations
- ctx.mayContain n = ctx.declPrefix.isPrefixOf (Lean.privateToUserName n.eraseMacroScopes)
Instances For
Constant info and environment extension states eventually resulting from async elaboration.
- constInfo : AsyncConstantInfo
- exts? : Option (Task (Array EnvExtensionState))
Reported extension state eventually fulfilled by promise; may be missing for tasks (e.g. kernel checking) that can eagerly guarantee they will not report any state.
Instances For
Data structure holding a sequence of AsyncConst
s optimized for efficient access.
- toArray : Array AsyncConst
- map : Lean.NameMap Lean.AsyncConst
Map from declaration name to const for fast direct access.
- normalizedTrie : Lean.NameTrie Lean.AsyncConst
Trie of declaration names without private name prefixes for fast longest-prefix access.
Instances For
Equations
- Lean.instInhabitedAsyncConsts = { default := { toArray := default, map := default, normalizedTrie := default } }
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- aconsts.find? declName = (Lean.AsyncConsts.map✝ aconsts).find? declName
Instances For
Finds the constant in the collection that is a prefix of declName
, if any.
Equations
- aconsts.findPrefix? declName = (Lean.AsyncConsts.normalizedTrie✝ aconsts).findLongestPrefix? (Lean.privateToUserName declName.eraseMacroScopes)
Instances For
Elaboration-specific extension of Kernel.Environment
that adds tracking of asynchronously
elaborated declarations.
- checkedWithoutAsync : Kernel.Environment
Kernel environment not containing any asynchronously elaborated declarations. Also stores environment extension state for the current branch of the environment.
Ignoring extension state, this is guaranteed to be some prior version of
checked
that is eagerly available. Thus we prefer taking information from it instead ofchecked
whenever possible. - checked : Task Kernel.Environment
Kernel environment task that is fulfilled when all asynchronously elaborated declarations are finished, containing the resulting environment. Also collects the environment extension state of all environment branches that contributed contained declarations.
- asyncConsts : Lean.AsyncConsts
Container of asynchronously elaborated declarations, i.e.
checked = checkedWithoutAsync ⨃ asyncConsts
. - asyncCtx? : Option Lean.AsyncContext
Information about this asynchronous branch of the environment, if any.
Instances For
Equations
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Checks whether the given declaration name may potentially added, or have been added, to the current environment branch, which is the case either if this is the main branch or if the declaration name is a suffix (modulo privacy and hygiene information) of the top-level declaration name for which this branch was created.
This function should always be checked before modifying an AsyncMode.async
environment extension
to ensure findStateAsync
will be able to find the modification from other branches.
Equations
- env.asyncMayContain declName = Option.all (fun (x : Lean.AsyncContext) => x.mayContain declName) (Lean.Environment.asyncCtx?✝ env)
Instances For
Adds given declaration to the environment, type checking it unless doCheck
is false.
This is a plumbing function for the implementation of Lean.addDecl
, most users should use it
instead.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Mapping from constant name to ConstantInfo
. It contains all constants (definitions, theorems,
axioms, etc) that have been already type checked by the kernel.
Equations
- env.constants = env.toKernelEnv.constants
Instances For
Mapping from constant name to module (index) where constant has been declared.
Recall that a Lean file has a header where previously compiled modules can be imported.
Each imported module has a unique ModuleIdx
.
Many extensions use the ModuleIdx
to efficiently retrieve information stored in imported modules.
Remark: this mapping also contains auxiliary constants, created by the code generator, that are not in
the field constants
. These auxiliary constants are invisible to the Lean kernel and elaborator.
Only the code generator uses them.
Equations
- env.const2ModIdx = env.toKernelEnv.const2ModIdx
Instances For
Save an extra constant name that is used to populate const2ModIdx
when we import
.olean files. We use this feature to save in which module an auxiliary declaration
created by the code generator has been created.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Looks up the given declaration name in the environment, avoiding forcing any in-progress elaboration tasks.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Looks up the given declaration name in the environment, avoiding forcing any in-progress elaboration
tasks for declaration bodies (which are not accessible from ConstantVal
).
Equations
- One or more equations did not get rendered due to their size.
Instances For
Looks up the given declaration name in the environment, blocking on the corresponding elaboration task if not yet complete.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Returns debug output about the asynchronous state of the environment.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Returns debug output about the synchronous state of the environment.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Result of Lean.Environment.addConstAsync
which is necessary to complete the asynchronous addition.
- mainEnv : Environment
Resulting "main branch" environment which contains the declaration name as an asynchronous constant. Accessing the constant or kernel environment will block until the corresponding
AddConstAsyncResult.commit*
function has been called. - asyncEnv : Environment
Resulting "async branch" environment which should be used to add the desired declaration in a new task and then call
AddConstAsyncResult.commit*
to commit results back to the main environment. One ofcommitCheckEnv
orcommitFailure
must be called eventually to prevent deadlocks on main branch accesses. - constName : Lean.Name
- kind : Lean.ConstantKind
- sigPromise : IO.Promise Lean.ConstantVal
- infoPromise : IO.Promise Lean.ConstantInfo
- extensionsPromise : IO.Promise (Array Lean.EnvExtensionState)
- checkedEnvPromise : IO.Promise Lean.Kernel.Environment
Instances For
Starts the asynchronous addition of a constant to the environment. The environment is split into a
"main" branch that holds a reference to the constant to be added but will block on access until the
corresponding information has been added on the "async" environment branch and committed there; see
the respective fields of AddConstAsyncResult
as well as the [Environment Branches] note for more
information.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Commits the signature of the constant to the main environment branch. The declaration name must
match the name originally given to addConstAsync
. It is optional to call this function but can
help in unblocking corresponding accesses to the constant on the main branch.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Commits the full constant info to the main environment branch. If info?
is none
, it is taken
from the given environment. The declaration name and kind must match the original values given to
addConstAsync
. The signature must match the previous commitSignature
call, if any.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Aborts async addition, filling in missing information with default values/sorries and leaving the kernel environment unchanged.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Assuming Lean.addDecl
has been run for the constant to be added on the async environment branch,
commits the full constant info from that call to the main environment, waits for the final kernel
environment resulting from the addDecl
call, and commits it to the main branch as well, unblocking
kernel additions there. All commitConst
preconditions apply.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- env.contains n = (env.findAsync? n).isSome
Instances For
Equations
- env.header = env.checkedWithoutAsync.header
Instances For
Instances For
Equations
- env.allImportedModuleNames = env.header.moduleNames
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- env.mainModule = env.header.mainModule
Instances For
Equations
- env.getModuleIdxFor? declName = env.checkedWithoutAsync.const2ModIdx[declName]?
Instances For
Equations
- env.isConstructor declName = match env.find? declName with | some (Lean.ConstantInfo.ctorInfo val) => true | x => false
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- env.getModuleIdx? moduleName = Array.findIdx? (fun (x : Lean.Name) => x == moduleName) env.header.moduleNames
Instances For
Equations
- c.instantiateTypeLevelParams ls = c.type.instantiateLevelParams c.levelParams ls
Instances For
Equations
Instances For
Async access mode for environment extensions used in EnvironmentExtension.get/set/modifyState
.
Depending on their specific uses, extensions may opt out of the strict sync
access mode in order
to avoid blocking parallel elaboration and/or to optimize accesses. The access mode is set at
environment extension registration time but can be overriden at EnvironmentExtension.getState
in
order to weaken it for specific accesses.
In all modes, the state stored into the .olean
file for persistent environment extensions is the
result of getState
called on the main environment branch at the end of the file, i.e. it
encompasses all modifications for all modes but local
.
- sync : AsyncMode
Default access mode, writing and reading the extension state to/from the full
checked
environment. This mode ensures the observed state is identical independently of whether or how parallel elaboration is used butgetState
will block on all prior environment branches by waiting forchecked
.setState
andmodifyState
do not block.While a safe default, any extension that reasonably could be used in parallel elaboration contexts should opt for a weaker mode to avoid blocking unless there is no way to access the correct state without waiting for all prior environment branches, in which case its data management should be restructured if at all possible.
- local : AsyncMode
Accesses only the state of the current environment branch. Modifications on other branches are not visible and are ultimately discarded except for the main branch. Provides the fastest accessors, will never block.
This mode is particularly suitable for extensions where state does not escape from lexical scopes even without parallelism, e.g.
ScopedEnvExtension
s when setting local entries. - mainOnly : AsyncMode
Like
local
but panics when trying to modify the state on anything but the main environment branch. For extensions that fulfill this requirement, all modes functionally coincide but this is the safest and most efficient choice in that case, preventing accidental misuse.This mode is suitable for extensions that are modified only at the command elaboration level before any environment forks in the command, and in particular for extensions that are modified only at the very beginning of the file.
- async : AsyncMode
Accumulates modifications in the
checked
environment likesync
, butgetState
will panic instead of blocking. InsteadfindStateAsync
should be used, which will access the state of the environment branch corresponding to the passed declaration name, if any, or otherwise the state of the current branch. In other words, at most one environment branch will be blocked on instead of all prior branches. The local state can still be accessed by callinggetState
with modelocal
explicitly.This mode is suitable for extensions with map-like state where the key uniquely identifies the top-level declaration where it could have been set, e.g. because the key on modification is always the surrounding declaration's name. Any calls to
modifyState
/setState
should assertasyncMayContain
with that key to ensure state is never accidentally stored in a branch where it cannot be found byfindStateAsync
. In particular, this mode is closest to how the environment's own constant map works which asserts the same predicate on modification and providesfindAsync?
for block-avoiding access.
Instances For
Equations
Environment extension, can only be generated by registerEnvExtension
that allocates a unique index
for this extension into each environment's extension state's array.
Instances For
Equations
- Lean.instInhabitedEnvExtension = { default := { idx := default, mkInitial := default, asyncMode := default } }
User-defined environment extensions are declared using the initialize
command.
This command is just syntax sugar for the init
attribute.
When we import
lean modules, the vector stored at envExtensionsRef
may increase in size because of
user-defined environment extensions. When this happens, we must adjust the size of the env.extensions
.
This method is invoked when processing import
s.
Equations
Instances For
Equations
- Lean.EnvExtension.mkInitialExtStates = do let exts ← ST.Ref.get Lean.EnvExtension.envExtensionsRef✝ Array.mapM (fun (ext : Lean.EnvExtension Lean.EnvExtensionState) => ext.mkInitial) exts
Instances For
Applies the given function to the extension state. See AsyncMode
for details on how modifications
from different environment branches are reconciled.
Note that in modes sync
and async
, f
will be called twice, on the local and on the checked
state.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Sets the extension state to the given value. See AsyncMode
for details on how modifications from
different environment branches are reconciled.
Equations
- ext.setState env s = inline (ext.modifyState env fun (x : σ) => s)
Instances For
Returns the current extension state. See AsyncMode
for details on how modifications from
different environment branches are reconciled. Panics if the extension is marked as async
; see its
documentation for more details. Overriding the extension's default AsyncMode
is usually not
recommended and should be considered only for important optimizations.
Environment extensions can only be registered during initialization.
Reasons:
1- Our implementation assumes the number of extensions does not change after an environment object is created.
2- We do not use any synchronization primitive to access envExtensionsRef
.
Note that by default, extension state is not stored in .olean files and will not propagate across import
s.
For that, you need to register a persistent environment extension.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
Instances For
An environment extension with support for storing/retrieving entries from a .olean file.
- α is the type of the entries that are stored in .olean files.
- β is the type of values used to update the state.
- σ is the actual state.
For most extensions, α and β coincide. α
and ‵β` do not coincide for extensions where the data
used to update the state contains elements which cannot be stored in files (for example, closures).
During elaboration of a module, state of type σ
can be both read and written. When elaboration is
complete, the state of type σ
is converted to serialized state of type Array α
by
exportEntriesFn
. To read the current module's state, use PersistentEnvExtension.getState
. To
modify it, use PersistentEnvExtension.addEntry
, with an addEntryFn
that performs the appropriate
modification.
When a module is loaded, the values saved by all of its dependencies for this
PersistentEnvExtension
are available as an Array (Array α)
via the environment extension,
with one array per transitively imported module. The state of type σ
used in the current module
can be initialized from these imports by specifying a suitable addImportedFn
. The addImportedFn
runs at the beginning of elaboration for every module, so it's usually better for performance to
query the array of imported modules directly, because only a fraction of imported entries is usually
queried during elaboration of a module.
The most typical pattern for using PersistentEnvExtension
is to set σ
to a datatype such as
NameMap
that efficiently tracks data for the current module. Then, in exportEntriesFn
, this type
is converted to an array of pairs, sorted by the key. Given ext : PersistentEnvExtension α β σ
and
env : Environment
, the complete array of imported entries sorted by module index can be obtained
using (ext.toEnvExtension.getState env).importedEntries
. To query the extension for some constant
name n
, first use env.getModuleIdxFor? n
. If it returns none
, look up n
in the current
module's state (the NameMap
). If it returns some idx
, use ext.getModuleEntries env idx
to get
the array of entries for n
's defining module, and query it using Array.binSearch
. This pattern
imposes a constraint that the extension can only track metadata that is declared in the same module
as the definition to which it applies; relaxing this restriction can make queries slower due to
needing to search all modules. If it is necessary to search all modules, it is usually better to
initialize the state of type σ
once from all imported entries and choose a more efficient search
datastructure for it.
Note that addEntryFn
is not in IO
. This is intentional, and allows us to write simple functions
such as
def addAlias (env : Environment) (a : Name) (e : Name) : Environment :=
aliasExtension.addEntry env (a, e)
without using IO
. We have many functions like addAlias
.
- toEnvExtension : EnvExtension (PersistentEnvExtensionState α σ)
- name : Name
- addEntryFn : σ → β → σ
- exportEntriesFn : σ → Array α
- statsFn : σ → Format
Instances For
Equations
- Lean.instInhabitedPersistentEnvExtensionState = { default := { importedEntries := #[], state := default } }
Equations
- One or more equations did not get rendered due to their size.
Equations
- ext.getModuleEntries env m = (ext.toEnvExtension.getState env Lean.EnvExtension.AsyncMode.local).importedEntries.get! m
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Get the current state of the given extension in the given environment.
Equations
- ext.getState env = (ext.toEnvExtension.getState env).state
Instances For
Set the current state of the given extension in the given environment.
Equations
- ext.setState env s = ext.toEnvExtension.modifyState env fun (ps : Lean.PersistentEnvExtensionState α σ) => { importedEntries := ps.importedEntries, state := s }
Instances For
Modify the state of the given extension in the given environment by applying the given function.
Equations
- ext.modifyState env f = ext.toEnvExtension.modifyState env fun (ps : Lean.PersistentEnvExtensionState α σ) => { importedEntries := ps.importedEntries, state := f ps.state }
Instances For
Returns the final extension state on the environment branch corresponding to the passed declaration name, if any, or otherwise the state on the current branch. In other words, at most one environment branch will be blocked on.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Simple PersistentEnvExtension
that implements exportEntriesFn
using a list of entries.
Equations
- Lean.SimplePersistentEnvExtension α σ = Lean.PersistentEnvExtension α α (List α × σ)
Instances For
Equations
- Lean.mkStateFromImportedEntries addEntryFn initState as = Array.foldl (fun (r : σ) (es : Array α) => Array.foldl (fun (r : σ) (e : α) => addEntryFn r e) r es) initState as
Instances For
- name : Name
- addEntryFn : σ → α → σ
- asyncMode : EnvExtension.AsyncMode
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
Get the list of values used to update the state of the given
SimplePersistentEnvExtension
in the current file.
Equations
- ext.getEntries env = (Lean.PersistentEnvExtension.getState ext env).fst
Instances For
Get the current state of the given SimplePersistentEnvExtension
.
Equations
- ext.getState env = (Lean.PersistentEnvExtension.getState ext env).snd
Instances For
Set the current state of the given SimplePersistentEnvExtension
. This change is not persisted across files.
Equations
Instances For
Modify the state of the given extension in the given environment by applying the given function. This change is not persisted across files.
Equations
Instances For
Environment extension for tagging declarations. Declarations must only be tagged in the module where they were declared.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Environment extension for mapping declarations to values. Declarations must only be inserted into the mapping in the module where they were declared.
Equations
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Free compacted regions of imports. No live references to imported objects may exist at the time of invocation; in
particular, env
should be the last reference to any Environment
derived from these imports.
Equations
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- Lean.writeModule env fname = do let __do_lift ← Lean.mkModuleData env Lean.saveModuleData fname env.mainModule __do_lift
Instances For
Construct a mapping from persistent extension name to extension index at the array of persistent extensions.
We only consider extensions starting with index >= startingAt
.
Equations
- One or more equations did not get rendered due to their size.
Instances For
"Forward declaration" needed for updating the attribute table with user-defined attributes.
User-defined attributes are declared using the initialize
command. The initialize
command is just syntax sugar for the init
attribute.
The init
attribute is initialized after the attributeExtension
is initialized. We cannot change the order since the init
attribute is an attribute,
and requires this extension.
The attributeExtension
initializer uses attributeMapRef
to initialize the attribute mapping.
When we a new user-defined attribute declaration is imported, attributeMapRef
is updated.
Later, we set this method with code that adds the user-defined attributes that were imported after we initialized attributeExtension
.
"Forward declaration" for retrieving the number of builtin attributes.
- moduleNameSet : NameHashSet
- moduleData : Array ModuleData
- regions : Array CompactedRegion
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Instances For
Equations
- x.run s = StateRefT'.run x s
Instances For
Construct environment from importModulesCore
results.
If leakEnv
is true, we mark the environment as persistent, which means it
will not be freed. We set this when the object would survive until the end of
the process anyway. In exchange, RC updates are avoided, which is especially
important when they would be atomic because the environment is shared across
threads (potentially, storing it in an IO.Ref
is sufficient for marking it
as such).
Equations
- One or more equations did not get rendered due to their size.
Instances For
Create environment object from imports and free compacted regions after calling act
. No live references to the
environment object or imported objects may exist after act
finishes.
Equations
- Lean.withImportModules imports opts trustLevel act = do let env ← Lean.importModules imports opts trustLevel tryFinally (act env) env.freeRegions
Instances For
Environment extension for tracking all namespace
declared by users.
Enables/disables kernel diagnostics.
Equations
- Lean.Kernel.enableDiag env flag = Lean.Environment.modifyCheckedAsync✝ env fun (x : Lean.Kernel.Environment) => x.enableDiag flag
Instances For
Equations
Instances For
Equations
- Lean.Kernel.resetDiag env = Lean.Environment.modifyCheckedAsync✝ env fun (x : Lean.Kernel.Environment) => x.resetDiag
Instances For
Equations
- Lean.Kernel.getDiagnostics env = env.checked.get.diagnostics
Instances For
Equations
- Lean.Kernel.setDiagnostics env diag = Lean.Environment.modifyCheckedAsync✝ env fun (x : Lean.Kernel.Environment) => x.setDiagnostics diag
Instances For
Register a new namespace in the environment.
Equations
- env.registerNamespace n = if (Lean.namespacesExt.getState env).contains n = true then env else Lean.PersistentEnvExtension.addEntry Lean.namespacesExt env n
Instances For
Return true
if n
is the name of a namespace in env
.
Equations
- env.isNamespace n = (Lean.namespacesExt.getState env).contains n
Instances For
Return a set containing all namespaces in env
.
Equations
- env.getNamespaceSet = Lean.namespacesExt.getState env
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Evaluate the given declaration under the given environment to a value of the given type.
This function is only safe to use if the type matches the declaration's type in the environment
and if enableInitializersExecution
has been used before importing any modules.
Like evalConst
, but first check that constName
indeed is a declaration of type typeName
.
Note that this function cannot guarantee that typeName
is in fact the name of the type α
.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Kernel API #
Kernel isDefEq predicate. We use it mainly for debugging purposes.
Recall that the kernel type checker does not support metavariables.
When implementing automation, consider using the MetaM
methods.
Equations
- Lean.Kernel.isDefEqGuarded env lctx a b = match Lean.Kernel.isDefEq env lctx a b with | Except.ok result => result | x => false
Instances For
Kernel WHNF function. We use it mainly for debugging purposes.
Recall that the kernel type checker does not support metavariables.
When implementing automation, consider using the MetaM
methods.
Kernel typecheck function. We use it mainly for debugging purposes.
Recall that the Kernel type checker does not support metavariables.
When implementing automation, consider using the MetaM
methods.
- getEnv : m Environment
- modifyEnv : (Environment → Environment) → m Unit
Instances
Equations
- Lean.instMonadEnvOfMonadLift m n = { getEnv := liftM Lean.getEnv, modifyEnv := fun (f : Lean.Environment → Lean.Environment) => liftM (Lean.modifyEnv f) }
Constructs a DefinitionVal, inferring the unsafe
field
Equations
- One or more equations did not get rendered due to their size.