Reserved names.
We use reserved names for automatically generated theorems (e.g., equational theorems).
Automation may register new reserved name predicates.
In this module, we just check the registered predicates, but do not trigger actions associated with them.
For example, give a definition foo
, we flag foo.def
as reserved symbol.
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
Global reference containing all reserved name predicates.
Registers a new reserved name predicate.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Returns true
if name
is a reserved name.
Equations
- Lean.isReservedName env name = (Lean.reservedNamePredicatesExt.getState env).any fun (x : Lean.Environment → Lake.Name → Bool) => x env name
Instances For
We use aliases to implement the export <id> (<id>+)
command.
An export A (x)
in the namespace B
produces an alias B.x ~> A.x
.
Instances For
Equations
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Add alias a
for e
Equations
- Lean.addAlias env a e = Lean.PersistentEnvExtension.addEntry Lean.aliasExtension env (a, e)
Instances For
Equations
- Lean.getAliasState env = Lean.aliasExtension.getState env
Instances For
Retrieve aliases for a
. If skipProtected
is true
, then the resulting list only includes
declarations that are not marked as protected
.
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
Global name resolution #
Primitive global name resolution procedure. It does not trigger actions associated with reserved names.
Recall that Lean has reserved names. For example, a definition foo
has a reserved name foo.def
for theorem
containing stating that foo
is equal to its definition. The action associated with foo.def
automatically proves the theorem. At the macro level, the name is resolved, but the action is not
executed.
Equations
- Lean.ResolveName.resolveGlobalName env ns openDecls id = Lean.ResolveName.resolveGlobalName.loop env ns openDecls (Lean.extractMacroScopes id) (Lean.extractMacroScopes id).name []
Instances For
Equations
- One or more equations did not get rendered due to their size.
- Lean.ResolveName.resolveGlobalName.loop env ns openDecls extractionResult id projs = []
Instances For
Namespace resolution #
Equations
- One or more equations did not get rendered due to their size.
- Lean.ResolveName.resolveNamespaceUsingScope? env n (p.str str) = if env.isNamespace (p.str str ++ n) = true then some (p.str str ++ n) else Lean.ResolveName.resolveNamespaceUsingScope? env n p
- Lean.ResolveName.resolveNamespaceUsingScope? env n ns = panicWithPosWithDecl "Lean.ResolveName" "Lean.ResolveName.resolveNamespaceUsingScope?" 200 9 "unreachable code has been reached"
Instances For
Equations
- One or more equations did not get rendered due to their size.
- Lean.ResolveName.resolveNamespaceUsingOpenDecls env n [] = []
- Lean.ResolveName.resolveNamespaceUsingOpenDecls env n (head :: ds) = Lean.ResolveName.resolveNamespaceUsingOpenDecls env n ds
Instances For
Given a name id
try to find namespaces it may refer to. The resolution procedure works as follows
1- If id
is in the scope of namespace
commands the namespace s_1. ... . s_n
,
then we include s_1 . ... . s_i ++ n
in the result if it is the name of an existing namespace.
We search "backwards", and include at most one of the in the list of resulting namespaces.
2- If id
is the exact name of an existing namespace, then include id
3- Finally, for each command open N
, include in the result N ++ n
if it is the name of an existing namespace.
We only consider simple open
commands.
Equations
- One or more equations did not get rendered due to their size.
Instances For
- getCurrNamespace : m Lake.Name
- getOpenDecls : m (List Lean.OpenDecl)
Instances
Equations
- Lean.instMonadResolveNameOfMonadLift m n = { getCurrNamespace := liftM Lean.getCurrNamespace, getOpenDecls := liftM Lean.getOpenDecls }
Given a name n
, return a list of possible interpretations.
Each interpretation is a pair (declName, fieldList)
, where declName
is the name of a declaration in the current environment, and fieldList
are
(potential) field names.
The pair is needed because in Lean .
may be part of a qualified name or
a field (aka dot-notation).
As an example, consider the following definitions
def Boo.x := 1
def Foo.x := 2
def Foo.x.y := 3
After open Foo
, we have
resolveGlobalName x
=>[(Foo.x, [])]
resolveGlobalName x.y
=>[(Foo.x.y, [])]
resolveGlobalName x.z.w
=>[(Foo.x, [z, w])]
After open Foo open Boo
, we have
resolveGlobalName x
=>[(Foo.x, []), (Boo.x, [])]
resolveGlobalName x.y
=>[(Foo.x.y, [])]
resolveGlobalName x.z.w
=>[(Foo.x, [z, w]), (Boo.x, [z, w])]
Equations
- One or more equations did not get rendered due to their size.
Instances For
Given a namespace name, return a list of possible interpretations.
Names extracted from syntax should be passed to resolveNamespace
instead.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Given a namespace identifier, return a list of possible interpretations.
Equations
- One or more equations did not get rendered due to their size.
- Lean.resolveNamespace x = Lean.throwErrorAt x.raw ((Lean.MessageData.ofFormat ∘ Lean.format) (toString "expected identifier"))
Instances For
Given a namespace identifier, return the unique interpretation or else fail.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Helper function for resolveGlobalConstNoOverloadCore
Equations
- One or more equations did not get rendered due to their size.
- Lean.ensureNoOverload n [ns] = pure ns
Instances For
For identifiers taken from syntax, use resolveGlobalConstNoOverload
instead, which respects preresolved names.
Equations
- Lean.resolveGlobalConstNoOverloadCore n = do let __do_lift ← Lean.resolveGlobalConstCore n Lean.ensureNoOverload n __do_lift
Instances For
Equations
- One or more equations did not get rendered due to their size.
- Lean.preprocessSyntaxAndResolve stx k = Lean.throwErrorAt stx ((Lean.MessageData.ofFormat ∘ Lean.format) (toString "expected identifier"))
Instances For
Interprets the syntax n
as an identifier for a global constant, and returns a list of resolved
constant names that it could be referring to based on the currently open namespaces.
This should be used instead of resolveGlobalConstCore
for identifiers taken from syntax
because Syntax
objects may have names that have already been resolved.
Consider using realizeGlobalConst
if you need to handle reserved names, and
realizeGlobalConstWithInfo
if you want the syntax to show the resulting name's info on hover.
Example: #
def Boo.x := 1
def Foo.x := 2
def Foo.x.y := 3
After open Foo
, we have
resolveGlobalConst x
=>[Foo.x]
resolveGlobalConst x.y
=>[Foo.x.y]
resolveGlobalConst x.z.w
=> error: unknown constant
After open Foo open Boo
, we have
resolveGlobalConst x
=>[Foo.x, Boo.x]
resolveGlobalConst x.y
=>[Foo.x.y]
resolveGlobalConst x.z.w
=> error: unknown constant
Equations
- Lean.resolveGlobalConst stx = Lean.preprocessSyntaxAndResolve stx Lean.resolveGlobalConstCore
Instances For
Given a list of names produced by resolveGlobalConst
, throws an error if the list does not contain
exactly one element.
Recall that resolveGlobalConst
does not return empty lists.
Equations
- One or more equations did not get rendered due to their size.
- Lean.ensureNonAmbiguous id [] = panicWithPosWithDecl "Lean.ResolveName" "Lean.ensureNonAmbiguous" 364 11 "unreachable code has been reached"
- Lean.ensureNonAmbiguous id [c] = pure c
Instances For
Interprets the syntax n
as an identifier for a global constant, and return a resolved
constant name. If there are multiple possible interpretations it will throw.
Consider using realizeGlobalConstNoOverload
if you need to handle reserved names, and
realizeGlobalConstNoOverloadWithInfo
if you
want the syntax to show the resulting name's info on hover.
Example: #
def Boo.x := 1
def Foo.x := 2
def Foo.x.y := 3
After open Foo
, we have
resolveGlobalConstNoOverload x
=>Foo.x
resolveGlobalConstNoOverload x.y
=>Foo.x.y
resolveGlobalConstNoOverload x.z.w
=> error: unknown constant
After open Foo open Boo
, we have
resolveGlobalConstNoOverload x
=> error: ambiguous identifierresolveGlobalConstNoOverload x.y
=>Foo.x.y
resolveGlobalConstNoOverload x.z.w
=> error: unknown constant
Equations
- Lean.resolveGlobalConstNoOverload id = do let __do_lift ← Lean.resolveGlobalConst id Lean.ensureNonAmbiguous id __do_lift
Instances For
Finds a name that unambiguously resolves to the given name n₀
.
Considers suffixes of n₀
and suffixes of aliases of n₀
when "unresolving".
Aliases are considered first.
When fullNames
is true, returns either n₀
or _root_.n₀
.
This function is meant to be used for pretty printing.
If n₀
is an accessible name, then the result will be an accessible name.
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.