Documentation

Lean.Elab.Term

Saved context for postponed terms and tactics to be executed.

Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.
Equations
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • Lean.Elab.Term.instInhabitedState = { default := { levelNames := default, syntheticMVars := default, mvarErrorInfos := default, letRecsToLift := default, infoState := default } }
Equations
Equations
structure Lean.Elab.Term.Context:
Type
  • declName? : Option Lean.Name
  • When mayPostpone == true, an elaboration function may interrupt its execution by throwing Exception.postpone. The function elabTerm catches this exception and creates fresh synthetic metavariable ?m, stores ?m in the list of pending synthetic metavariables, and returns ?m.

    mayPostpone : Bool
  • When errToSorry is set to true, the method elabTerm catches exceptions and converts them into synthetic sorrys. The implementation of choice nodes and overloaded symbols rely on the fact that when errToSorry is set to false for an elaboration function F, then errToSorry remains false for all elaboration functions invoked by F. That is, it is safe to transition errToSorry from true to false, but we must not set errToSorry to true when it is currently set to false.

    errToSorry : Bool
  • When autoBoundImplicit is set to true, instead of producing an "unknown identifier" error for unbound variables, we generate an internal exception. This exception is caught at elabBinders and elabTypeWithUnboldImplicit. Both methods add implicit declarations for the unbound variable and try again.

    autoBoundImplicit : Bool
  • autoBoundImplicits : Std.PArray Lean.Expr
  • A name n is only eligible to be an auto implicit name if autoBoundImplicitForbidden n = false. We use this predicate to disallow f to be considered an auto implicit name in a definition such as def f : f → Bool := fun _ => true

    autoBoundImplicitForbidden : Lean.NameBool
  • Map from user name to internal unique name

    sectionVars : Lean.NameMap Lean.Name
  • Map from internal name to fvar

    sectionFVars : Lean.NameMap Lean.Expr
  • Enable/disable implicit lambdas feature.

    implicitLambda : Bool
  • Noncomputable sections automatically add the noncomputable modifier to any declaration we cannot generate code for

    isNoncomputableSection : Bool
  • When true we skip TC failures. We use this option when processing patterns

    ignoreTCFailures : Bool
  • true when elaborating patterns. It affects how we elaborate named holes.

    inPattern : Bool
  • If true, we store in the Expr the Syntax for recursive applications (i.e., applications of free variables tagged with isAuxDecl). We store the Syntax using mkRecAppWithSyntax. We use the Syntax object to produce better error messages at Structural.lean and WF.lean.

    saveRecAppSyntax : Bool
Equations
  • Lean.Elab.Term.instInhabitedTermElabM = { default := throw default }
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • Lean.Elab.Term.instInhabitedTermElabResult = { default := EStateM.Result.ok default default }

Execute x, save resulting expression and new state. We remove any Info created by x. The info nodes are committed when we execute applyResult. We use observing to implement overloaded notation and decls. We want to save Info nodes for the chosen alternative.

Equations
  • One or more equations did not get rendered due to their size.

Apply the result/exception and state captured with observing. We use this method to implement overloaded notation and symbols.

Equations
  • One or more equations did not get rendered due to their size.

Execute x, but keep state modifications only if x did not postpone. This method is useful to implement elaboration functions that cannot decide whether they need to postpone or not without updating the state.

Equations
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.

Execute x but discard changes performed at Term.State and Meta.State. Recall that the environment is at Core.State. Thus, any updates to it will be preserved. This method is useful for performing computations where all metavariable must be resolved or discarded. The info trees are not discarded, however, and wrapped in InfoTree.Context to store their metavariable context.

Equations
  • One or more equations did not get rendered due to their size.

Execute x without storing Syntax for recursive applications. See saveRecAppSyntax field at Context.

Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.
@[implementedBy Lean.Elab.Term.mkTermElabAttributeUnsafe]
inductive Lean.Elab.Term.LVal:
Type

Auxiliary datatatype for presenting a Lean lvalue modifier. We represent a unelaborated lvalue as a Syntax (or Expr) and List LVal. Example: a.foo[i].1 is represented as the Syntax a and the list [LVal.fieldName "foo", LVal.getOp i, LVal.fieldIdx 1]. Recall that the notation a[i] is not just for accessing arrays in Lean.

Equations
  • One or more equations did not get rendered due to their size.
Equations
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.

For testing TermElabM methods. The #eval command will sign the error.

Equations
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.
Equations
Equations
  • One or more equations did not get rendered due to their size.

Append mvarErrorInfo argument name (if available) to the message. Remark: if the argument name contains macro scopes we do not append it.

Equations
  • One or more equations did not get rendered due to their size.
Equations

Try to log errors for the unassigned metavariables pendingMVarIds.

Return true if there were "unfilled holes", and we should "abort" declaration. TODO: try to fill "all" holes using synthetic "sorry's"

Remark: We only log the "unfilled holes" as new errors if no error has been logged so far.

Equations
  • One or more equations did not get rendered due to their size.

Ensure metavariables registered using registerMVarErrorInfos (and used in the given declaration) have been assigned.

Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.

Creates syntax for ( : )

Equations
  • One or more equations did not get rendered due to their size.

Convert unassigned universe level metavariables into parameters. The new parameter names are of the form u_i where i >= nextParamIdx. The method returns the updated expression and new nextParamIdx.

Remark: we make sure the generated parameter names do not clash with the universe at ctx.levelNames.

Equations
  • One or more equations did not get rendered due to their size.

Variant of levelMVarToParam where nextParamIdx is stored in a state monad.

Equations
  • One or more equations did not get rendered due to their size.
def Lean.Elab.Term.mkFreshBinderName {m : TypeType} [inst : Monad m] [inst : Lean.MonadQuotation m] :

Auxiliary method for creating fresh binder names. Do not confuse with the method for creating fresh free/meta variable ids.

Equations
def Lean.Elab.Term.mkFreshIdent {m : TypeType} [inst : Monad m] [inst : Lean.MonadQuotation m] (ref : Lean.Syntax) :

Auxiliary method for creating a Syntax.ident containing a fresh name. This method is intended for creating fresh binder names. It is just a thin layer on top of mkFreshUserName.

Equations

Apply given attributes at a given application time

Equations
Equations
  • One or more equations did not get rendered due to their size.
def Lean.Elab.Term.throwTypeMismatchError {α : Type} (header? : Option String) (expectedType : Lean.Expr) (eType : Lean.Expr) (e : Lean.Expr) (f? : optParam (Option Lean.Expr) none) (extraMsg? : optParam (Option Lean.MessageData) none) :
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.

Return true if e contains a pending metavariable. Remark: it also visits let-declarations.

Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.
def Lean.Elab.Term.mkCoe (expectedType : Lean.Expr) (eType : Lean.Expr) (e : Lean.Expr) (f? : optParam (Option Lean.Expr) none) (errorMsgHeader? : optParam (Option String) none) :
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.
def Lean.Elab.Term.ensureHasTypeAux (expectedType? : Option Lean.Expr) (eType : Lean.Expr) (e : Lean.Expr) (f? : optParam (Option Lean.Expr) none) (errorMsgHeader? : optParam (Option String) none) :

If expectedType? is some t, then ensure t and eType are definitionally equal. If they are not, then try coercions.

Argument f? is used only for generating error messages.

Equations
  • One or more equations did not get rendered due to their size.

If expectedType? is some t, then ensure t and type of e are definitionally equal. If they are not, then try coercions.

Equations
  • One or more equations did not get rendered due to their size.

If mayPostpone == true, throw Expection.postpone.

Equations

If mayPostpone == true and e's head is a metavariable, throw Exception.postpone.

Equations
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.

Create an auxiliary annotation to make sure we create a Info even if e is a metavariable. See mkTermInfo.

We use this functions because some elaboration functions elaborate subterms that may not be immediately part of the resulting term. Example:

let_mvar% ?m := b; wait_if_type_mvar% ?m; body

If the type of b is not known, then wait_if_type_mvar% ?m; body is postponed and just return a fresh metavariable ?n. The elaborator for

let_mvar% ?m := b; wait_if_type_mvar% ?m; body

returns mkSaveInfoAnnotation ?n to make sure the info nodes created when elaborating b are "saved". This is a bit hackish, but elaborators like let_mvar% are rare.

Equations

Return some mvarId if e corresponds to a hole that is going to be filled "later" by executing a tactic or resuming elaboration.

We do not save ofTermInfo for this kind of node in the InfoTree.

Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.
Equations
Equations
  • One or more equations did not get rendered due to their size.

Block usage of implicit lambdas if stx is @f or @f arg1 ... or fun with an implicit binder annotation.

Equations
  • One or more equations did not get rendered due to their size.

Store in the InfoTree that e is a "dot"-completion target.

Equations
  • One or more equations did not get rendered due to their size.
def Lean.Elab.Term.elabTerm (stx : Lean.Syntax) (expectedType? : Option Lean.Expr) (catchExPostpone : optParam Bool true) (implicitLambda : optParam Bool true) :

Main function for elaborating terms. It extracts the elaboration methods from the environment using the node kind. Recall that the environment has a mapping from SyntaxNodeKind to TermElab methods. It creates a fresh macro scope for executing the elaboration method. All unlogged trace messages produced by the elaboration method are logged using the position information at stx. If the elaboration method throws an Exception.error and errToSorry == true, the error is logged and a synthetic sorry expression is returned. If the elaboration throws Exception.postpone and catchExPostpone == true, a new synthetic metavariable of kind SyntheticMVarKind.postponed is created, registered, and returned. The option catchExPostpone == false is used to implement resumeElabTerm to prevent the creation of another synthetic metavariable when resuming the elaboration.

If implicitLambda == true, then disable implicit lambdas feature for the given syntax, but not for its subterms. We use this flag to implement, for example, the @ modifier. If Context.implicitLambda == false, then this parameter has no effect.

Equations
def Lean.Elab.Term.elabTermEnsuringType (stx : Lean.Syntax) (expectedType? : Option Lean.Expr) (catchExPostpone : optParam Bool true) (implicitLambda : optParam Bool true) (errorMsgHeader? : optParam (Option String) none) :
Equations
  • One or more equations did not get rendered due to their size.

Execute x and then restore syntheticMVars, levelNames, mvarErrorInfos, and letRecsToLift. We use this combinator when we don't want the pending problems created by x to persist after its execution.

Equations
  • One or more equations did not get rendered due to their size.

Execute x and return some if no new errors were recorded or exceptions was thrown. Otherwise, return none

Equations
  • One or more equations did not get rendered due to their size.

Adapt a syntax transformation to a regular, term-producing elaborator.

Equations
Equations
  • One or more equations did not get rendered due to their size.

Make sure e is a type by inferring its type and making sure it is a Expr.sort or is unifiable with Expr.sort, or can be coerced into one.

Equations
  • One or more equations did not get rendered due to their size.

Elaborate stx and ensure result is a type.

Equations
  • One or more equations did not get rendered due to their size.

Enable auto-bound implicits, and execute k while catching auto bound implicit exceptions. When an exception is caught, a new local declaration is created, registered, and k is tried to be executed again.

Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.

Collect unassigned metavariables in type that are not already in init and not satisfying except.

Equations
  • One or more equations did not get rendered due to their size.

Return autoBoundImplicits ++ xs This methoid throws an error if a variable in autoBoundImplicits depends on some x in xs. The autoBoundImplicits may contain free variables created by the auto-implicit feature, and unassigned free variables. It avoids the hack used at autoBoundImplicitsOld.

Remark: we cannot simply replace every occurrence of addAutoBoundImplicitsOld with this one because a particular use-case may not be able to handle the metavariables in the array being given to k.

Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.

Similar to autoBoundImplicits, but immediately if the resulting array of expressions contains metavariables, it immediately use mkForallFVars + forallBoundedTelescope to convert them into free variables. The type type is modified during the process if type depends on xs. We use this method to simplify the conversion of code using autoBoundImplicitsOld to autoBoundImplicits

Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.

Create an Expr.const using the given name and explicit levels. Remark: fresh universe metavariables are created if the constant has more universe parameters than explicitLevels.

Equations
  • One or more equations did not get rendered due to their size.
def Lean.Elab.Term.resolveName (stx : Lean.Syntax) (n : Lean.Name) (preresolved : List (Lean.Name × List String)) (explicitLevels : List Lean.Level) (expectedType? : optParam (Option Lean.Expr) none) :
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.

Similar to resolveName, but creates identifiers for the main part and each projection with position information derived from ident. Example: Assume resolveName v.head.bla.boo produces (v.head, ["bla", "boo"]), then this method produces (v.head, id, [f₁, f₂]) where id is an identifier for v.head, and f₁ and f₂ are identifiers for fields "bla" and "boo".

Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.
def Lean.Elab.Term.TermElabM.run {α : Type} (x : Lean.Elab.TermElabM α) (ctx : optParam Lean.Elab.Term.Context { declName? := none, macroStack := [], mayPostpone := true, errToSorry := true, autoBoundImplicit := false, autoBoundImplicits := { root := Std.PersistentArrayNode.node (Array.mkEmpty (USize.toNat Std.PersistentArray.branching)), tail := Array.mkEmpty (USize.toNat Std.PersistentArray.branching), size := 0, shift := Std.PersistentArray.initShift, tailOff := 0 }, autoBoundImplicitForbidden := fun x => false, sectionVars := , sectionFVars := , implicitLambda := true, isNoncomputableSection := false, ignoreTCFailures := false, inPattern := false, tacticCache? := none, saveRecAppSyntax := true }) (s : optParam Lean.Elab.Term.State { levelNames := [], syntheticMVars := [], mvarErrorInfos := , letRecsToLift := [], infoState := { enabled := true, assignment := { root := Std.PersistentHashMap.Node.entries Std.PersistentHashMap.mkEmptyEntriesArray, size := 0 }, trees := { root := Std.PersistentArrayNode.node (Array.mkEmpty (USize.toNat Std.PersistentArray.branching)), tail := Array.mkEmpty (USize.toNat Std.PersistentArray.branching), size := 0, shift := Std.PersistentArray.initShift, tailOff := 0 } } }) :
Equations
@[inline]
def Lean.Elab.Term.TermElabM.run' {α : Type} (x : Lean.Elab.TermElabM α) (ctx : optParam Lean.Elab.Term.Context { declName? := none, macroStack := [], mayPostpone := true, errToSorry := true, autoBoundImplicit := false, autoBoundImplicits := { root := Std.PersistentArrayNode.node (Array.mkEmpty (USize.toNat Std.PersistentArray.branching)), tail := Array.mkEmpty (USize.toNat Std.PersistentArray.branching), size := 0, shift := Std.PersistentArray.initShift, tailOff := 0 }, autoBoundImplicitForbidden := fun x => false, sectionVars := , sectionFVars := , implicitLambda := true, isNoncomputableSection := false, ignoreTCFailures := false, inPattern := false, tacticCache? := none, saveRecAppSyntax := true }) (s : optParam Lean.Elab.Term.State { levelNames := [], syntheticMVars := [], mvarErrorInfos := , letRecsToLift := [], infoState := { enabled := true, assignment := { root := Std.PersistentHashMap.Node.entries Std.PersistentHashMap.mkEmptyEntriesArray, size := 0 }, trees := { root := Std.PersistentArrayNode.node (Array.mkEmpty (USize.toNat Std.PersistentArray.branching)), tail := Array.mkEmpty (USize.toNat Std.PersistentArray.branching), size := 0, shift := Std.PersistentArray.initShift, tailOff := 0 } } }) :
Equations
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.

Execute x and then tries to solve pending universe constraints. Note that, stuck constraints will not be discarded.

Equations
Equations
  • One or more equations did not get rendered due to their size.

Helper function for "embedding" an Expr in Syntax. It creates a named hole ?m and immediately assigns e to it. Examples:

let e := mkConst ``Nat.zero
`(Nat.succ $(← exprToSyntax e))
Equations
  • One or more equations did not get rendered due to their size.