Literal values for Expr.
- natVal: Nat → Lean.Literal
Natural number literal
- strVal: String → Lean.Literal
String literal
Instances For
Equations
- Lean.instInhabitedLiteral = { default := Lean.Literal.natVal default }
Equations
- Lean.instBEqLiteral = { beq := Lean.beqLiteral✝ }
Equations
- Lean.instReprLiteral = { reprPrec := Lean.reprLiteral✝ }
Equations
- x.hash = match x with | Lean.Literal.natVal v => hash v | Lean.Literal.strVal v => hash v
Instances For
Equations
- Lean.instHashableLiteral = { hash := Lean.Literal.hash }
Total order on Expr literal values.
Natural number values are smaller than string literal values.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- Lean.instLTLiteral = { lt := fun (a b : Lean.Literal) => a.lt b = true }
Equations
- Lean.instDecidableLtLiteral a b = inferInstanceAs (Decidable (a.lt b = true))
Arguments in forallE binders can be labelled as implicit or explicit.
Each lam or forallE binder comes with a binderInfo argument (stored in ExprData).
This can be set to
default--(x : α)implicit--{x : α}strict_implicit--⦃x : α⦄inst_implicit--[x : α].aux_decl-- Auxiliary definitions are helper methods that Lean generates.aux_declis used for_match,_fun_match,_let_matchand the self reference that appears in recursive pattern matching.
The difference between implicit {} and strict-implicit ⦃⦄ is how
implicit arguments are treated that are not followed by explicit arguments.
{} arguments are applied eagerly, while ⦃⦄ arguments are left partially applied:
def foo {x : Nat} : Nat := x
def bar ⦃x : Nat⦄ : Nat := x
#check foo -- foo : Nat
#check bar -- bar : ⦃x : Nat⦄ → Nat
See also the Lean manual.
- default: Lean.BinderInfo
Default binder annotation, e.g.
(x : α) - implicit: Lean.BinderInfo
Implicit binder annotation, e.g.,
{x : α} - strictImplicit: Lean.BinderInfo
Strict implicit binder annotation, e.g.,
{{ x : α }} - instImplicit: Lean.BinderInfo
Local instance binder annotataion, e.g.,
[Decidable α]
Instances For
Equations
- Lean.instInhabitedBinderInfo = { default := Lean.BinderInfo.default }
Equations
- Lean.instBEqBinderInfo = { beq := Lean.beqBinderInfo✝ }
Equations
- Lean.instReprBinderInfo = { reprPrec := Lean.reprBinderInfo✝ }
Equations
- x.hash = match x with | Lean.BinderInfo.default => 947 | Lean.BinderInfo.implicit => 1019 | Lean.BinderInfo.strictImplicit => 1087 | Lean.BinderInfo.instImplicit => 1153
Instances For
Return true if the given BinderInfo does not correspond to an implicit binder annotation
(i.e., implicit, strictImplicit, or instImplicit).
Equations
- x.isExplicit = match x with | Lean.BinderInfo.implicit => false | Lean.BinderInfo.strictImplicit => false | Lean.BinderInfo.instImplicit => false | x => true
Instances For
Equations
- Lean.instHashableBinderInfo = { hash := Lean.BinderInfo.hash }
Return true if the given BinderInfo is an instance implicit annotation (e.g., [Decidable α])
Equations
- x.isInstImplicit = match x with | Lean.BinderInfo.instImplicit => true | x => false
Instances For
Return true if the given BinderInfo is a regular implicit annotation (e.g., {α : Type u})
Equations
- x.isImplicit = match x with | Lean.BinderInfo.implicit => true | x => false
Instances For
Return true if the given BinderInfo is a strict implicit annotation (e.g., {{α : Type u}})
Equations
- x.isStrictImplicit = match x with | Lean.BinderInfo.strictImplicit => true | x => false
Instances For
Expression metadata. Used with the Expr.mdata constructor.
Equations
Instances For
Cached hash code, cached results, and other data for Expr.
- hash : 32-bits
- approxDepth : 8-bits -- the approximate depth is used to minimize the number of hash collisions
- hasFVar : 1-bit -- does it contain free variables?
- hasExprMVar : 1-bit -- does it contain metavariables?
- hasLevelMVar : 1-bit -- does it contain level metavariables?
- hasLevelParam : 1-bit -- does it contain level parameters?
- looseBVarRange : 20-bits
Remark: this is mostly an internal datastructure used to implement Expr,
most will never have to use it.
Equations
Instances For
Equations
Equations
- c.hash = (UInt64.toUInt32 c).toUInt64
Instances For
Equations
- Lean.instBEqData_1 = { beq := fun (a b : UInt64) => a == b }
Equations
- c.approxDepth = ((UInt64.shiftRight c 32).land 255).toUInt8
Instances For
Equations
- c.looseBVarRange = (UInt64.shiftRight c 44).toUInt32
Instances For
Equations
- c.hasFVar = ((UInt64.shiftRight c 40).land 1 == 1)
Instances For
Equations
- c.hasExprMVar = ((UInt64.shiftRight c 41).land 1 == 1)
Instances For
Equations
- c.hasLevelMVar = ((UInt64.shiftRight c 42).land 1 == 1)
Instances For
Equations
- c.hasLevelParam = ((UInt64.shiftRight c 43).land 1 == 1)
Instances For
Equations
- x.toUInt64 = match x with | Lean.BinderInfo.default => 0 | Lean.BinderInfo.implicit => 1 | Lean.BinderInfo.strictImplicit => 2 | Lean.BinderInfo.instImplicit => 3
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Optimized version of Expr.mkData for applications.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- Lean.Expr.mkDataForBinder h looseBVarRange approxDepth hasFVar hasExprMVar hasLevelMVar hasLevelParam = Lean.Expr.mkData h looseBVarRange approxDepth hasFVar hasExprMVar hasLevelMVar hasLevelParam
Instances For
Equations
- Lean.Expr.mkDataForLet h looseBVarRange approxDepth hasFVar hasExprMVar hasLevelMVar hasLevelParam = Lean.Expr.mkData h looseBVarRange approxDepth hasFVar hasExprMVar hasLevelMVar hasLevelParam
Instances For
Equations
- One or more equations did not get rendered due to their size.
The unique free variable identifier. It is just a hierarchical name,
but we wrap it in FVarId to make sure they don't get mixed up with MVarId.
This is not the user-facing name for a free variable. This information is stored
in the local context (LocalContext). The unique identifiers are generated using
a NameGenerator.
- name : Lake.Name
Instances For
Equations
- Lean.instInhabitedFVarId = { default := { name := default } }
Equations
- Lean.instBEqFVarId = { beq := Lean.beqFVarId✝ }
Equations
- Lean.instHashableFVarId = { hash := Lean.hashFVarId✝ }
Equations
- Lean.instReprFVarId = { reprPrec := fun (n : Lean.FVarId) (p : Nat) => reprPrec n.name p }
A set of unique free variable identifiers. This is a persistent data structure implemented using red-black trees.
Equations
- Lean.FVarIdSet = Lean.RBTree Lean.FVarId fun (x x_1 : Lean.FVarId) => x.name.quickCmp x_1.name
Instances For
Equations
- Lean.instForInFVarIdSetFVarId = inferInstanceAs (ForIn m (Lean.RBTree Lean.FVarId fun (x x_1 : Lean.FVarId) => x.name.quickCmp x_1.name) Lean.FVarId)
Equations
- s.insert fvarId = Lean.RBTree.insert s fvarId
Instances For
A set of unique free variable identifiers implemented using hashtables. Hashtables are faster than red-black trees if they are used linearly. They are not persistent data-structures.
Equations
Instances For
A mapping from free variable identifiers to values of type α.
This is a persistent data structure implemented using red-black trees.
Equations
- Lean.FVarIdMap α = Lean.RBMap Lean.FVarId α fun (x x_1 : Lean.FVarId) => x.name.quickCmp x_1.name
Instances For
Equations
- s.insert fvarId a = Lean.RBMap.insert s fvarId a
Instances For
Equations
- Lean.instEmptyCollectionFVarIdMap = inferInstanceAs (EmptyCollection (Lean.RBMap Lean.FVarId α fun (x x_1 : Lean.FVarId) => x.name.quickCmp x_1.name))
Equations
- Lean.instInhabitedMVarId = { default := { name := default } }
Equations
- Lean.instBEqMVarId = { beq := Lean.beqMVarId✝ }
Equations
- Lean.instHashableMVarId = { hash := Lean.hashMVarId✝ }
Equations
- Lean.instReprMVarId = { reprPrec := Lean.reprMVarId✝ }
Equations
- Lean.instReprMVarId_1 = { reprPrec := fun (n : Lean.MVarId) (p : Nat) => reprPrec n.name p }
Equations
- Lean.MVarIdSet = Lean.RBTree Lean.MVarId fun (x x_1 : Lean.MVarId) => x.name.quickCmp x_1.name
Instances For
Equations
- s.insert mvarId = Lean.RBTree.insert s mvarId
Instances For
Equations
- Lean.instForInMVarIdSetMVarId = inferInstanceAs (ForIn m (Lean.RBTree Lean.MVarId fun (x x_1 : Lean.MVarId) => x.name.quickCmp x_1.name) Lean.MVarId)
Equations
- Lean.MVarIdMap α = Lean.RBMap Lean.MVarId α fun (x x_1 : Lean.MVarId) => x.name.quickCmp x_1.name
Instances For
Equations
- s.insert mvarId a = Lean.RBMap.insert s mvarId a
Instances For
Equations
- Lean.instEmptyCollectionMVarIdMap = inferInstanceAs (EmptyCollection (Lean.RBMap Lean.MVarId α fun (x x_1 : Lean.MVarId) => x.name.quickCmp x_1.name))
Equations
- Lean.instForInMVarIdMapProdMVarId = inferInstanceAs (ForIn m (Lean.RBMap Lean.MVarId α fun (x x_1 : Lean.MVarId) => x.name.quickCmp x_1.name) (Lean.MVarId × α))
Equations
- One or more equations did not get rendered due to their size.
- (Lean.Expr.const n lvls).data = Lean.Expr.mkData (mixHash 5 (mixHash (hash n) (hash lvls))) 0 0 false false (lvls.any Lean.Level.hasMVar) (lvls.any Lean.Level.hasParam)
- (Lean.Expr.bvar idx).data = Lean.Expr.mkData (mixHash 7 (hash idx)) (idx + 1) 0 false false false
- (Lean.Expr.sort lvl).data = Lean.Expr.mkData (mixHash 11 (hash lvl)) 0 0 false false lvl.hasMVar lvl.hasParam
- (Lean.Expr.fvar fvarId).data = Lean.Expr.mkData (mixHash 13 (hash fvarId)) 0 0 true false false
- (Lean.Expr.mvar fvarId).data = Lean.Expr.mkData (mixHash 17 (hash fvarId)) 0 0 false true false
- (f.app a).data = Lean.Expr.mkAppData f.data a.data
- (Lean.Expr.lit l).data = Lean.Expr.mkData (mixHash 3 (hash l)) 0 0 false false false
Instances For
Lean expressions. This data structure is used in the kernel and elaborator. However, expressions sent to the kernel should not contain metavariables.
Remark: we use the E suffix (short for Expr) to avoid collision with keywords.
We considered using «...», but it is too inconvenient to use.
- bvar: Nat → Lean.Expr
The
bvarconstructor represents bound variables, i.e. occurrences of a variable in the expression where there is a variable binder above it (i.e. introduced by alam,forallE, orletE).The
deBruijnIndexparameter is the de-Bruijn index for the bound variable. See the Wikipedia page on de-Bruijn indices for additional information.For example, consider the expression
fun x : Nat => forall y : Nat, x = y. Thexandyvariables in the equality expression are constructed usingbvarand bound to the binders introduced by the earlierlamandforallEconstructors. Here is the correspondingExprrepresentation for the same expression:.lam `x (.const `Nat []) (.forallE `y (.const `Nat []) (.app (.app (.app (.const `Eq [.succ .zero]) (.const `Nat [])) (.bvar 1)) (.bvar 0)) .default) .default - fvar: Lean.FVarId → Lean.Expr
The
fvarconstructor represent free variables. These free variable occurrences are not bound by an earlierlam,forallE, orletEconstructor and its binder exists in a local context only.Note that Lean uses the locally nameless approach. See McBride and McKinna for additional details.
When "visiting" the body of a binding expression (i.e.
lam,forallE, orletE), bound variables are converted into free variables using a unique identifier, and their user-facing name, type, value (forLetE), and binder annotation are stored in theLocalContext. - mvar: Lean.MVarId → Lean.Expr
Metavariables are used to represent "holes" in expressions, and goals in the tactic framework. Metavariable declarations are stored in the
MetavarContext. Metavariables are used during elaboration, and are not allowed in the kernel, or in the code generator. - sort: Lean.Level → Lean.Expr
- const: Lake.Name → List Lean.Level → Lean.Expr
A (universe polymorphic) constant that has been defined earlier in the module or by another imported module. For example,
@Eq.{1}is represented asExpr.const `Eq [.succ .zero], and@Array.map.{0, 0}is represented asExpr.const `Array.map [.zero, .zero]. - app: Lean.Expr → Lean.Expr → Lean.Expr
A function application.
For example, the natural number one, i.e.
Nat.succ Nat.zerois represented asExpr.app (.const `Nat.succ []) (.const .zero []). Note that multiple arguments are represented using partial application.For example, the two argument application
f x yis represented asExpr.app (.app f x) y. - lam: Lake.Name → Lean.Expr → Lean.Expr → Lean.BinderInfo → Lean.Expr
- forallE: Lake.Name → Lean.Expr → Lean.Expr → Lean.BinderInfo → Lean.Expr
A dependent arrow
(a : α) → β)(aka forall-expression) whereβmay dependent ona. Note that this constructor is also used to represent non-dependent arrows whereβdoes not depend ona.For example:
- letE: Lake.Name → Lean.Expr → Lean.Expr → Lean.Expr → Bool → Lean.Expr
Let-expressions.
IMPORTANT: The
nonDepflag is for "local" use only. That is, a module should not "trust" its value for any purpose. In the intended use-case, the compiler will set this flag, and be responsible for maintaining it. Other modules may not preserve its value while applying transformations.Given an environment, a metavariable context, and a local context, we say a let-expression
let x : t := v; eis non-dependent when it is equivalent to(fun x : t => e) v. In contrast, the dependent let-expressionlet n : Nat := 2; fun (a : Array Nat n) (b : Array Nat 2) => a = bis type correct, but(fun (n : Nat) (a : Array Nat n) (b : Array Nat 2) => a = b) 2is not.The let-expression
let x : Nat := 2; Nat.succ xis represented asExpr.letE `x (.const `Nat []) (.lit (.natVal 2)) (.app (.const `Nat.succ []) (.bvar 0)) true - lit: Lean.Literal → Lean.Expr
Natural number and string literal values.
They are not really needed, but provide a more compact representation in memory for these two kinds of literals, and are used to implement efficient reduction in the elaborator and kernel. The "raw" natural number
2can be represented asExpr.lit (.natVal 2). Note that, it is definitionally equal to:Expr.app (.const `Nat.succ []) (.app (.const `Nat.succ []) (.const `Nat.zero [])) - mdata: Lean.MData → Lean.Expr → Lean.Expr
Metadata (aka annotations).
We use annotations to provide hints to the pretty-printer, store references to
Syntaxnodes, position information, and save information for elaboration procedures (e.g., we use theinaccessibleannotation during elaboration to markExprs that correspond to inaccessible patterns).Note that
Expr.mdata data eis definitionally equal toe. - proj: Lake.Name → Nat → Lean.Expr → Lean.Expr
Projection-expressions. They are redundant, but are used to create more compact terms, speedup reduction, and implement eta for structures. The type of
structmust be an structure-like inductive type. That is, it has only one constructor, is not recursive, and it is not an inductive predicate. The kernel and elaborators check whether thetypeNamematches the type ofstruct, and whether the (zero-based) index is valid (i.e., it is smaller than the number of constructor fields). When exporting Lean developments to other systems,projcan be replaced withtypeName.recapplications.Example, given
a : Nat × Bool,a.1is represented as.proj `Prod 0 a
Instances For
Equations
- Lean.instInhabitedExpr = { default := Lean.Expr.bvar default }
Equations
- Lean.instReprExpr = { reprPrec := Lean.reprExpr✝ }
The constructor name for the given expression. This is used for debugging purposes.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- Lean.Expr.instHashable = { hash := Lean.Expr.hash }
Return true if e contains free variables.
This is a constant time operation.
Equations
- e.hasFVar = e.data.hasFVar
Instances For
Return true if e contains expression metavariables.
This is a constant time operation.
Equations
- e.hasExprMVar = e.data.hasExprMVar
Instances For
Return true if e contains universe (aka Level) metavariables.
This is a constant time operation.
Equations
- e.hasLevelMVar = e.data.hasLevelMVar
Instances For
Return true if e contains universe level parameters.
This is a constant time operation.
Equations
- e.hasLevelParam = e.data.hasLevelParam
Instances For
Return the approximated depth of an expression. This information is used to compute
the expression hash code, and speedup comparisons.
This is a constant time operation. We say it is approximate because it maxes out at 255.
Equations
- e.approxDepth = e.data.approxDepth.toUInt32
Instances For
Return the binder information if e is a lambda or forall expression, and .default otherwise.
Equations
- e.binderInfo = match e with | Lean.Expr.forallE binderName binderType body bi => bi | Lean.Expr.lam binderName binderType body bi => bi | x => Lean.BinderInfo.default
Instances For
Export functions.
Equations
Instances For
Instances For
Instances For
Equations
Instances For
Instances For
Equations
- e.looseBVarRangeEx = e.data.looseBVarRange
Instances For
Equations
Instances For
mkConst declName us return .const declName us.
Equations
- Lean.mkConst declName us = Lean.Expr.const declName us
Instances For
Return the type of a literal value.
Equations
- x.type = match x with | Lean.Literal.natVal val => Lean.mkConst `Nat | Lean.Literal.strVal val => Lean.mkConst `String
Instances For
Equations
Instances For
.fvar fvarId is now the preferred form.
This function is seldom used, free variables are often automatically created using the
telescope functions (e.g., forallTelescope and lambdaTelescope) at MetaM.
Equations
- Lean.mkFVar fvarId = Lean.Expr.fvar fvarId
Instances For
.mvar mvarId is now the preferred form.
This function is seldom used, metavariables are often created using functions such
as mkFresheExprMVar at MetaM.
Equations
- Lean.mkMVar mvarId = Lean.Expr.mvar mvarId
Instances For
.proj structName idx struct is now the preferred form.
Equations
- Lean.mkProj structName idx struct = Lean.Expr.proj structName idx struct
Instances For
.lam x t b bi is now the preferred form.
Equations
- Lean.mkLambda x bi t b = Lean.Expr.lam x t b bi
Instances For
.forallE x t b bi is now the preferred form.
Equations
- Lean.mkForall x bi t b = Lean.Expr.forallE x t b bi
Instances For
Return Unit -> type. Do not confuse with Thunk type
Equations
- Lean.mkSimpleThunkType type = Lean.mkForall Lean.Name.anonymous Lean.BinderInfo.default (Lean.mkConst `Unit) type
Instances For
Return fun (_ : Unit), e
Equations
- Lean.mkSimpleThunk type = Lean.mkLambda `_ Lean.BinderInfo.default (Lean.mkConst `Unit) type
Instances For
.letE x t v b nonDep is now the preferred form.
Equations
- Lean.mkLet x t v b nonDep = Lean.Expr.letE x t v b nonDep
Instances For
Equations
- Lean.mkApp4 f a b c d = Lean.mkAppB (Lean.mkAppB f a b) c d
Instances For
Equations
- Lean.mkApp5 f a b c d e = Lean.mkApp (Lean.mkApp4 f a b c d) e
Instances For
Equations
- Lean.mkApp6 f a b c d e₁ e₂ = Lean.mkAppB (Lean.mkApp4 f a b c d) e₁ e₂
Instances For
Equations
- Lean.mkApp7 f a b c d e₁ e₂ e₃ = Lean.mkApp3 (Lean.mkApp4 f a b c d) e₁ e₂ e₃
Instances For
Equations
- Lean.mkApp8 f a b c d e₁ e₂ e₃ e₄ = Lean.mkApp4 (Lean.mkApp4 f a b c d) e₁ e₂ e₃ e₄
Instances For
Equations
- Lean.mkApp9 f a b c d e₁ e₂ e₃ e₄ e₅ = Lean.mkApp5 (Lean.mkApp4 f a b c d) e₁ e₂ e₃ e₄ e₅
Instances For
Equations
- Lean.mkApp10 f a b c d e₁ e₂ e₃ e₄ e₅ e₆ = Lean.mkApp6 (Lean.mkApp4 f a b c d) e₁ e₂ e₃ e₄ e₅ e₆
Instances For
Return a natural number literal used in the frontend. It is a OfNat.ofNat application.
Recall that all theorems and definitions containing numeric literals are encoded using
OfNat.ofNat applications in the frontend.
Equations
- Lean.mkNatLit n = let r := Lean.mkRawNatLit n; Lean.mkApp3 (Lean.mkConst `OfNat.ofNat [Lean.levelZero]) (Lean.mkConst `Nat) r (Lean.mkApp (Lean.mkConst `instOfNatNat) r)
Instances For
Equations
Instances For
Equations
Instances For
Equations
Instances For
Equations
Instances For
Equations
Instances For
Equations
- Lean.mkLambdaEx n d b bi = Lean.mkLambda n bi d b
Instances For
Equations
- Lean.mkForallEx n d b bi = Lean.mkForall n bi d b
Instances For
Equations
Instances For
Equations
Instances For
Equations
Instances For
mkAppN f #[a₀, ..., aₙ] constructs the application f a₀ a₁ ... aₙ.
Equations
- Lean.mkAppN f args = Array.foldl Lean.mkApp f args 0
Instances For
mkAppRange f i j #[a_1, ..., a_i, ..., a_j, ... ] ==> the expression f a_i ... a_{j-1}
Equations
- Lean.mkAppRange f i j args = Lean.mkAppRangeAux j args i f
Instances For
Same as mkApp f args but reversing args.
Equations
- Lean.mkAppRev fn revArgs = Array.foldr (fun (a r : Lean.Expr) => Lean.mkApp r a) fn revArgs revArgs.size
Instances For
A total order for expressions. We say it is quick because it first compares the hashcodes.
A total order for expressions that takes the structure into account (e.g., variable names).
Return true iff a and b are alpha equivalent.
Binder annotations are ignored.
Equations
- Lean.Expr.instBEq = { beq := Lean.Expr.eqv }
Return true iff a and b are equal.
Binder names and annotations are taken into account.
Return true if the given expression is a .sort ..
Equations
- x.isSort = match x with | Lean.Expr.sort u => true | x => false
Instances For
Return true if the given expression is of the form .sort (.succ ..).
Equations
- x.isType = match x with | Lean.Expr.sort a.succ => true | x => false
Instances For
Return true if the given expression is of the form .sort (.succ .zero).
Equations
- x.isType0 = match x with | Lean.Expr.sort Lean.Level.zero.succ => true | x => false
Instances For
Return true if the given expression is .sort .zero
Equations
- x.isProp = match x with | Lean.Expr.sort Lean.Level.zero => true | x => false
Instances For
Return true if the given expression is a bound variable.
Equations
- x.isBVar = match x with | Lean.Expr.bvar deBruijnIndex => true | x => false
Instances For
Return true if the given expression is a metavariable.
Equations
- x.isMVar = match x with | Lean.Expr.mvar mvarId => true | x => false
Instances For
Return true if the given expression is a free variable.
Equations
- x.isFVar = match x with | Lean.Expr.fvar fvarId => true | x => false
Instances For
Return true if the given expression is a projection .proj ..
Equations
- x.isProj = match x with | Lean.Expr.proj typeName idx struct => true | x => false
Instances For
Return true if the given expression is a constant.
Equations
- x.isConst = match x with | Lean.Expr.const declName us => true | x => false
Instances For
Return true if the given expression is a constant of the given name.
Examples:
Equations
- x✝.isConstOf x = match x✝, x with | Lean.Expr.const n us, m => n == m | x, x_1 => false
Instances For
Return true if the given expression is a free variable with the given id.
Examples:
isFVarOf (.fvar id) idistrueisFVarOf (.fvar id) id'isfalseisFVarOf (.sort levelZero) idisfalse
Equations
- x✝.isFVarOf x = match x✝, x with | Lean.Expr.fvar fvarId, fvarId' => fvarId == fvarId' | x, x_1 => false
Instances For
Return true if the given expression is a forall-expression aka (dependent) arrow.
Equations
- x.isForall = match x with | Lean.Expr.forallE binderName binderType body binderInfo => true | x => false
Instances For
Return true if the given expression is a lambda abstraction aka anonymous function.
Equations
- x.isLambda = match x with | Lean.Expr.lam binderName binderType body binderInfo => true | x => false
Instances For
Return true if the given expression is a forall or lambda expression.
Equations
- x.isBinding = match x with | Lean.Expr.lam binderName binderType body binderInfo => true | Lean.Expr.forallE binderName binderType body binderInfo => true | x => false
Instances For
Return true if the given expression is a let-expression.
Equations
- x.isLet = match x with | Lean.Expr.letE declName type value body nonDep => true | x => false
Instances For
Return true if the given expression is a metadata.
Equations
- x.isMData = match x with | Lean.Expr.mdata data expr => true | x => false
Instances For
Return true if the given expression is a literal value.
Equations
- x.isLit = match x with | Lean.Expr.lit a => true | x => false
Instances For
Equations
- x.appFn! = match x with | f.app arg => f | x => panicWithPosWithDecl "Lean.Expr" "Lean.Expr.appFn!" 892 15 "application expected"
Instances For
Equations
- x.appArg! = match x with | fn.app a => a | x => panicWithPosWithDecl "Lean.Expr" "Lean.Expr.appArg!" 896 15 "application expected"
Instances For
Equations
- (Lean.Expr.mdata data b).appFn!' = b.appFn!'
- (f.app arg).appFn!' = f
- x.appFn!' = panicWithPosWithDecl "Lean.Expr" "Lean.Expr.appFn!'" 901 17 "application expected"
Instances For
Equations
- (Lean.Expr.mdata data b).appArg!' = b.appArg!'
- (f.app arg).appArg!' = arg
- x.appArg!' = panicWithPosWithDecl "Lean.Expr" "Lean.Expr.appArg!'" 906 17 "application expected"
Instances For
Equations
- x.sortLevel! = match x with | Lean.Expr.sort u => u | x => panicWithPosWithDecl "Lean.Expr" "Lean.Expr.sortLevel!" 918 14 "sort expected"
Instances For
Equations
- x.litValue! = match x with | Lean.Expr.lit v => v | x => panicWithPosWithDecl "Lean.Expr" "Lean.Expr.litValue!" 922 13 "literal expected"
Instances For
Equations
- x.isRawNatLit = match x with | Lean.Expr.lit (Lean.Literal.natVal val) => true | x => false
Instances For
Equations
- x.rawNatLit? = match x with | Lean.Expr.lit (Lean.Literal.natVal v) => some v | x => none
Instances For
Equations
- x.isStringLit = match x with | Lean.Expr.lit (Lean.Literal.strVal val) => true | x => false
Instances For
Equations
- x.isCharLit = match x with | (Lean.Expr.const c us).app a => c == `Char.ofNat && a.isRawNatLit | x => false
Instances For
Equations
- x.constName! = match x with | Lean.Expr.const n us => n | x => panicWithPosWithDecl "Lean.Expr" "Lean.Expr.constName!" 942 17 "constant expected"
Instances For
Equations
- x.constName? = match x with | Lean.Expr.const n us => some n | x => none
Instances For
If the expression is a constant, return that name. Otherwise return Name.anonymous.
Equations
- e.constName = e.constName?.getD Lean.Name.anonymous
Instances For
Equations
- x.constLevels! = match x with | Lean.Expr.const declName ls => ls | x => panicWithPosWithDecl "Lean.Expr" "Lean.Expr.constLevels!" 954 18 "constant expected"
Instances For
Equations
- x.bvarIdx! = match x with | Lean.Expr.bvar idx => idx | x => panicWithPosWithDecl "Lean.Expr" "Lean.Expr.bvarIdx!" 958 16 "bvar expected"
Instances For
Equations
- x.fvarId! = match x with | Lean.Expr.fvar n => n | x => panicWithPosWithDecl "Lean.Expr" "Lean.Expr.fvarId!" 962 14 "fvar expected"
Instances For
Equations
- x.mvarId! = match x with | Lean.Expr.mvar n => n | x => panicWithPosWithDecl "Lean.Expr" "Lean.Expr.mvarId!" 966 14 "mvar expected"
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
- One or more equations did not get rendered due to their size.
Instances For
Equations
- x.letName! = match x with | Lean.Expr.letE n type value body nonDep => n | x => panicWithPosWithDecl "Lean.Expr" "Lean.Expr.letName!" 990 17 "let expression expected"
Instances For
Equations
- x.letType! = match x with | Lean.Expr.letE declName t value body nonDep => t | x => panicWithPosWithDecl "Lean.Expr" "Lean.Expr.letType!" 994 19 "let expression expected"
Instances For
Equations
- x.letValue! = match x with | Lean.Expr.letE declName type v body nonDep => v | x => panicWithPosWithDecl "Lean.Expr" "Lean.Expr.letValue!" 998 21 "let expression expected"
Instances For
Equations
- x.letBody! = match x with | Lean.Expr.letE declName type value b nonDep => b | x => panicWithPosWithDecl "Lean.Expr" "Lean.Expr.letBody!" 1002 23 "let expression expected"
Instances For
Equations
- (Lean.Expr.mdata data expr).consumeMData = expr.consumeMData
- x.consumeMData = x
Instances For
Equations
- x.mdataExpr! = match x with | Lean.Expr.mdata data e => e | x => panicWithPosWithDecl "Lean.Expr" "Lean.Expr.mdataExpr!" 1010 17 "mdata expression expected"
Instances For
Equations
- x.projExpr! = match x with | Lean.Expr.proj typeName idx e => e | x => panicWithPosWithDecl "Lean.Expr" "Lean.Expr.projExpr!" 1014 18 "proj expression expected"
Instances For
Equations
- x.projIdx! = match x with | Lean.Expr.proj typeName i struct => i | x => panicWithPosWithDecl "Lean.Expr" "Lean.Expr.projIdx!" 1018 18 "proj expression expected"
Instances For
Return the "body" of a forall expression.
Example: let e be the representation for forall (p : Prop) (q : Prop), p ∧ q, then
getForallBody e returns .app (.app (.const `And []) (.bvar 1)) (.bvar 0)
Equations
- (Lean.Expr.forallE binderName binderType body binderInfo).getForallBody = body.getForallBody
- x.getForallBody = x
Instances For
Equations
- Lean.Expr.getForallBodyMaxDepth n.succ (Lean.Expr.forallE binderName binderType b binderInfo) = Lean.Expr.getForallBodyMaxDepth n b
- Lean.Expr.getForallBodyMaxDepth 0 x = x
- Lean.Expr.getForallBodyMaxDepth x✝ x = x
Instances For
Given a sequence of nested foralls (a₁ : α₁) → ... → (aₙ : αₙ) → _,
returns the names [a₁, ... aₙ].
Equations
- (Lean.Expr.forallE binderName binderType body binderInfo).getForallBinderNames = binderName :: body.getForallBinderNames
- x.getForallBinderNames = []
Instances For
Given f a₀ a₁ ... aₙ, returns true if f is a constant with name n.
Equations
- e.isAppOf n = match e.getAppFn with | Lean.Expr.const c us => c == n | x => false
Instances For
Given f a₁ ... aᵢ, returns true if f is a constant
with name n and has the correct number of arguments.
Equations
Instances For
Similar to isAppOfArity but skips Expr.mdata.
Equations
- (Lean.Expr.mdata data b).isAppOfArity' x✝ x = b.isAppOfArity' x✝ x
- (Lean.Expr.const c us).isAppOfArity' x 0 = (c == x)
- (f.app arg).isAppOfArity' x a.succ = f.isAppOfArity' x a
- x✝¹.isAppOfArity' x✝ x = false
Instances For
Counts the number n of arguments for an expression f a₁ .. aₙ.
Equations
- e.getAppNumArgs = Lean.Expr.getAppNumArgsAux e 0
Instances For
Like Lean.Expr.getAppFn but assumes the application has up to maxArgs arguments.
If there are any more arguments than this, then they are returned by getAppFn as part of the function.
In particular, if the given expression is a sequence of function applications f a₁ .. aₙ,
returns f a₁ .. aₖ where k is minimal such that n - k ≤ maxArgs.
Equations
- Lean.Expr.getBoundedAppFn maxArgs'.succ (f.app arg) = Lean.Expr.getBoundedAppFn maxArgs' f
- Lean.Expr.getBoundedAppFn x✝ x = x
Instances For
Given f a₁ a₂ ... aₙ, returns #[a₁, ..., aₙ]
Equations
- e.getAppArgs = let dummy := Lean.mkSort Lean.levelZero; let nargs := e.getAppNumArgs; Lean.Expr.getAppArgsAux e (mkArray nargs dummy) (nargs - 1)
Instances For
Like Lean.Expr.getAppArgs but returns up to maxArgs arguments.
In particular, given f a₁ a₂ ... aₙ, returns #[aₖ₊₁, ..., aₙ]
where k is minimal such that the size of this array is at most maxArgs.
Equations
- Lean.Expr.getBoundedAppArgs maxArgs e = let dummy := Lean.mkSort Lean.levelZero; let nargs := min maxArgs e.getAppNumArgs; Lean.Expr.getBoundedAppArgsAux e (mkArray nargs dummy) nargs
Instances For
Same as getAppArgs but reverse the output array.
Equations
- e.getAppRevArgs = Lean.Expr.getAppRevArgsAux e (Array.mkEmpty e.getAppNumArgs)
Instances For
Equations
- Lean.Expr.withAppAux k (f.app a) x✝ x = Lean.Expr.withAppAux k f (x✝.set! x a) (x - 1)
- Lean.Expr.withAppAux k x✝¹ x✝ x = k x✝¹ x✝
Instances For
Given e = f a₁ a₂ ... aₙ, returns k f #[a₁, ..., aₙ].
Equations
- e.withApp k = let dummy := Lean.mkSort Lean.levelZero; let nargs := e.getAppNumArgs; Lean.Expr.withAppAux k e (mkArray nargs dummy) (nargs - 1)
Instances For
Given f a_1 ... a_n, returns #[a_1, ..., a_n].
Note that f may be an application.
The resulting array has size n even if f.getAppNumArgs < n.
Equations
- e.getAppArgsN n = let dummy := Lean.mkSort Lean.levelZero; Lean.Expr.getAppArgsN.loop n e (mkArray n dummy)
Instances For
Equations
- Lean.Expr.getAppArgsN.loop 0 x✝ x = x
- Lean.Expr.getAppArgsN.loop i.succ (f.app a) x = Lean.Expr.getAppArgsN.loop i f (x.set! i a)
- Lean.Expr.getAppArgsN.loop x✝¹ x✝ x = panicWithPosWithDecl "Lean.Expr" "Lean.Expr.getAppArgsN.loop" 1157 27 "too few arguments at"
Instances For
Given e = fn a₁ ... aₙ, runs f on fn and each of the arguments aᵢ and
makes a new function application with the results.
Equations
- Lean.Expr.traverseApp f e = e.withApp fun (fn : Lean.Expr) (args : Array Lean.Expr) => Seq.seq (Lean.mkAppN <$> f fn) fun (x : Unit) => Array.mapM f args
Instances For
Same as withApp but with arguments reversed.
Equations
- e.withAppRev k = Lean.Expr.withAppRevAux k e (Array.mkEmpty e.getAppNumArgs)
Instances For
Equations
- (fn.app a).getRevArg! 0 = a
- (f.app arg).getRevArg! i.succ = f.getRevArg! i
- x✝.getRevArg! x = panicWithPosWithDecl "Lean.Expr" "Lean.Expr.getRevArg!" 1198 20 "invalid index"
Instances For
Similar to getRevArg! but skips mdata
Equations
- (Lean.Expr.mdata data a).getRevArg!' x = a.getRevArg!' x
- (fn.app a).getRevArg!' 0 = a
- (f.app arg).getRevArg!' i.succ = f.getRevArg!' i
- x✝.getRevArg!' x = panicWithPosWithDecl "Lean.Expr" "Lean.Expr.getRevArg!'" 1205 20 "invalid index"
Instances For
Return true if e is a non-dependent arrow.
Remark: the following function assumes e does not have loose bound variables.
Equations
- e.isArrow = match e with | Lean.Expr.forallE binderName binderType b binderInfo => !b.hasLooseBVars | x => false
Instances For
Return true if e contains the loose bound variable bvarIdx in an explicit parameter, or in the range if tryRange == true.
Equations
Instances For
inferImplicit e numParams considerRange updates the first numParams parameter binder annotations of the e forall type.
It marks any parameter with an explicit binder annotation if there is another explicit arguments that depends on it or
the resulting type if considerRange == true.
Remark: we use this function to infer the bind annotations of inductive datatype constructors, and structure projections.
When the {} annotation is used in these commands, we set considerRange == false.
Instances For
Instantiates the loose bound variables in e using the subst array,
where a loose Expr.bvar i at "binding depth" d is instantiated with subst[i - d] if 0 <= i - d < subst.size,
and otherwise it is replaced with Expr.bvar (i - subst.size); non-loose bound variables are not touched.
If we imagine all expressions as being able to refer to the infinite list of loose bound variables ..., 3, 2, 1, 0 in that order,
then conceptually instantiate is instantiating the last n of these and reindexing the remaining ones.
Warning: instantiate uses the de Bruijn indexing to index the subst array, which might be the reverse order from what you might expect.
See also Lean.Expr.instantiateRev.
Terminology. The "binding depth" of a subexpression is the number of bound variables available to that subexpression
by virtue of being in the bodies of Expr.forallE, Expr.lam, and Expr.letE expressions.
A bound variable Expr.bvar i is "loose" if its de Bruijn index i is not less than its binding depth.)
About instantiation. Instantiation isn't mere substitution.
When an expression from subst is being instantiated, its internal loose bound variables have their de Bruijn indices incremented
by the binding depth of the replaced loose bound variable.
This is necessary for the substituted expression to still refer to the correct binders after instantiation.
Similarly, the reason loose bound variables not instantiated using subst have their de Bruijn indices decremented like Expr.bvar (i - subst.size)
is that instantiate can be used to eliminate binding expressions internal to a larger expression,
and this adjustment keeps these bound variables referring to the same binders.
Instantiates loose bound variable 0 in e using the expression subst,
where in particular a loose Expr.bvar i at binding depth d is instantiated with subst if i = d,
and otherwise it is replaced with Expr.bvar (i - 1); non-loose bound variables are not touched.
If we imagine all expressions as being able to refer to the infinite list of loose bound variables ..., 3, 2, 1, 0 in that order,
then conceptually instantiate1 is instantiating the last one of these and reindexing the remaining ones.
This function is equivalent to instantiate e #[subst], but it avoids allocating an array.
See the documentation for Lean.Expr.instantiate for a description of instantiation.
In short, during instantiation the loose bound variables in subst have their own de Bruijn indices updated to account
for the binding depth of the replaced loose bound variable.
Instantiates the loose bound variables in e using the subst array.
This is equivalent to Lean.Expr.instantiate e subst.reverse, but it avoids reversing the array.
In particular, rather than instantiating Expr.bvar i with subst[i - d] it instantiates with subst[subst.size - 1 - (i - d)],
where d is the binding depth.
This function instantiates with the "forwards" indexing scheme.
For example, if e represents the expression fun x y => x + y,
then instantiateRev e.bindingBody!.bindingBody! #[a, b] yields a + b.
The instantiate function on the other hand would yield b + a, since de Bruijn indices count outwards.
Similar to Lean.Expr.instantiate, but considers only the substitutions subst in the range [beginIdx, endIdx).
Function panics if beginIdx <= endIdx <= subst.size does not hold.
This function is equivalent to instantiate e (subst.extract beginIdx endIdx), but it does not allocate a new array.
This instantiates with the "backwards" indexing scheme.
See also Lean.Expr.instantiateRevRange, which instantiates with the "forwards" indexing scheme.
Similar to Lean.Expr.instantiateRev, but considers only the substitutions subst in the range [beginIdx, endIdx).
Function panics if beginIdx <= endIdx <= subst.size does not hold.
This function is equivalent to instantiateRev e (subst.extract beginIdx endIdx), but it does not allocate a new array.
This instantiates with the "forwards" indexing scheme (see the docstring for Lean.Expr.instantiateRev for an example).
See also Lean.Expr.instantiateRange, which instantiates with the "backwards" indexing scheme.
Replace occurrences of the free variable fvarId in e with v
Equations
- e.replaceFVarId fvarId v = e.replaceFVar (Lean.mkFVar fvarId) v
Instances For
Equations
- Lean.Expr.instToString = { toString := Lean.Expr.dbgToString }
Returns true when the expression does not have any sub-expressions.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- Lean.mkDecIsTrue pred proof = Lean.mkAppB (Lean.mkConst `Decidable.isTrue) pred proof
Instances For
Equations
- Lean.mkDecIsFalse pred proof = Lean.mkAppB (Lean.mkConst `Decidable.isFalse) pred proof
Instances For
Equations
Instances For
Equations
Instances For
Equations
Instances For
Equations
Instances For
Equations
Instances For
Equations
Instances For
Equations
- Lean.instInhabitedExprStructEq = { default := { val := default } }
Equations
- Lean.instCoeExprExprStructEq = { coe := Lean.ExprStructEq.mk }
Equations
- x✝.beq x = match x✝, x with | { val := e₁ }, { val := e₂ } => e₁.equal e₂
Instances For
Equations
- x.hash = match x with | { val := e } => e.hash
Instances For
Equations
- Lean.ExprStructEq.instBEq = { beq := Lean.ExprStructEq.beq }
Equations
- Lean.ExprStructEq.instHashable = { hash := Lean.ExprStructEq.hash }
Equations
- Lean.ExprStructEq.instToString = { toString := fun (e : Lean.ExprStructEq) => toString e.val }
Equations
Instances For
Equations
Instances For
mkAppRevRange f b e args == mkAppRev f (revArgs.extract b e)
Equations
- f.mkAppRevRange beginIdx endIdx revArgs = Lean.Expr.mkAppRevRangeAux revArgs beginIdx f endIdx
Instances For
If f is a lambda expression, than "beta-reduce" it using revArgs.
This function is often used with getAppRev or withAppRev.
Examples:
betaRev (fun x y => t x y) #[]==>fun x y => t x ybetaRev (fun x y => t x y) #[a]==>fun y => t a ybetaRev (fun x y => t x y) #[a, b]==>t b abetaRev (fun x y => t x y) #[a, b, c, d]==>t d c b aSupposetis(fun x y => t x y) a b c d, thenargs := t.getAppRevis#[d, c, b, a], andbetaRev (fun x y => t x y) #[d, c, b, a]ist a b c d.
If useZeta is true, the function also performs zeta-reduction (reduction of let binders) to create further
opportunities for beta reduction.
Equations
- f.betaRev revArgs useZeta preserveMData = if (revArgs.size == 0) = true then f else let sz := revArgs.size; Lean.Expr.betaRev.go revArgs useZeta preserveMData sz f 0
Instances For
Count the number of lambdas at the head of the given expression.
Equations
- (Lean.Expr.lam binderName binderType b binderInfo).getNumHeadLambdas = b.getNumHeadLambdas + 1
- (Lean.Expr.mdata data b).getNumHeadLambdas = b.getNumHeadLambdas
- x.getNumHeadLambdas = 0
Instances For
Return true if the given expression is the function of an expression that is target for (head) beta reduction.
If useZeta = true, then let-expressions are visited. That is, it assumes
that zeta-reduction (aka let-expansion) is going to be used.
See isHeadBetaTarget.
Equations
- Lean.Expr.isHeadBetaTargetFn useZeta (Lean.Expr.lam binderName binderType b binderInfo) = true
- Lean.Expr.isHeadBetaTargetFn useZeta (Lean.Expr.letE declName type v b nonDep) = (useZeta && Lean.Expr.isHeadBetaTargetFn useZeta b)
- Lean.Expr.isHeadBetaTargetFn useZeta (Lean.Expr.mdata k b) = Lean.Expr.isHeadBetaTargetFn useZeta b
- Lean.Expr.isHeadBetaTargetFn useZeta x✝ = false
Instances For
(fun x => e) a ==> e[x/a].
Equations
Instances For
Return true if the given expression is a target for (head) beta reduction.
If useZeta = true, then let-expressions are visited. That is, it assumes
that zeta-reduction (aka let-expansion) is going to be used.
Equations
- e.isHeadBetaTarget useZeta = (e.isApp && Lean.Expr.isHeadBetaTargetFn useZeta e.getAppFn)
Instances For
If e is of the form (fun x₁ ... xₙ => f x₁ ... xₙ) and f does not contain x₁, ..., xₙ,
then return some f. Otherwise, return none.
It assumes e does not have loose bound variables.
Remark: ₙ may be 0
Equations
- e.etaExpanded? = Lean.Expr.etaExpandedAux e 0
Instances For
Similar to etaExpanded?, but only succeeds if ₙ ≥ 1.
Equations
- x.etaExpandedStrict? = match x with | Lean.Expr.lam binderName binderType b binderInfo => Lean.Expr.etaExpandedAux b 1 | x => none
Instances For
Return true if e is of the form semiOutParam _
Equations
- e.isSemiOutParam = e.isAppOfArity `semiOutParam 1
Instances For
Remove outParam, optParam, and autoParam applications/annotations from e.
Note that it does not remove nested annotations.
Examples:
- Given
eof the formoutParam (optParam Nat b),consumeTypeAnnotations e = b. - Given
eof the formNat → outParam (optParam Nat b),consumeTypeAnnotations e = e.
Remove metadata annotations and outParam, optParam, and autoParam applications/annotations from e.
Note that it does not remove nested annotations.
Examples:
- Given
eof the formoutParam (optParam Nat b),cleanupAnnotations e = b. - Given
eof the formNat → outParam (optParam Nat b),cleanupAnnotations e = e.
Similar to appFn, but also applies cleanupAnnotations to resulting function.
This function is used compile the match_expr term.
Equations
- e.appFnCleanup h = match e, h with | f.app arg, x => f.cleanupAnnotations
Instances For
Equations
- e.isFalse = e.cleanupAnnotations.isConstOf `False
Instances For
Equations
- e.isTrue = e.cleanupAnnotations.isConstOf `True
Instances For
Checks if an expression is a "natural number numeral in normal form",
i.e. of type Nat, and explicitly of the form OfNat.ofNat n
where n matches .lit (.natVal n) for some literal natural number n.
and if so returns n.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Checks if an expression is an "integer numeral in normal form",
i.e. of type Nat or Int, and either a natural number numeral in normal form (as specified by nat?),
or the negation of a positive natural number numberal in normal form,
and if so returns the integer.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Return true iff e contains a free variable which satisfies p.
Equations
- e.hasAnyFVar p = Lean.Expr.hasAnyFVar.visit p e
Instances For
Instances For
Return true if e contains the given free variable.
Equations
- e.containsFVar fvarId = e.hasAnyFVar fun (x : Lean.FVarId) => x == fvarId
Instances For
The update functions try to avoid allocating new values using pointer equality.
Note that if the update*! functions are used under a match-expression,
the compiler will eliminate the double-match.
Equations
- e.updateApp! newFn newArg = match e with | fn.app arg => Lean.mkApp newFn newArg | x => panicWithPosWithDecl "Lean.Expr" "Lean.Expr.updateApp!" 1675 15 "application expected"
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- e.updateConst! newLevels = match e with | Lean.Expr.const n us => Lean.mkConst n newLevels | x => panicWithPosWithDecl "Lean.Expr" "Lean.Expr.updateConst!" 1691 17 "constant expected"
Instances For
Equations
- e.updateSort! newLevel = match e with | Lean.Expr.sort u => Lean.mkSort newLevel | x => panicWithPosWithDecl "Lean.Expr" "Lean.Expr.updateSort!" 1702 14 "level expected"
Instances For
Equations
- e.updateMData! newExpr = match e with | Lean.Expr.mdata d expr => Lean.mkMData d newExpr | x => panicWithPosWithDecl "Lean.Expr" "Lean.Expr.updateMData!" 1713 17 "mdata expected"
Instances For
Equations
- e.updateProj! newExpr = match e with | Lean.Expr.proj s i struct => Lean.mkProj s i newExpr | x => panicWithPosWithDecl "Lean.Expr" "Lean.Expr.updateProj!" 1724 18 "proj expected"
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
Eta reduction. If e is of the form (fun x => f x), then return f.
Annotate e with the given option.
The information is stored using metadata around e.
Equations
- e.setOption optionName val = Lean.mkMData (Lean.KVMap.set Lean.MData.empty optionName val) e
Instances For
If e is an application f a_1 ... a_n annotate f, a_1 ... a_n with pp.explicit := false,
and annotate e with pp.explicit := true.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Similar for setAppPPExplicit, but only annotate children with pp.explicit := false if
e does not contain metavariables.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Returns true if e is a let_fun expression, which is an expression of the form letFun v f.
Ideally f is a lambda, but we do not require that here.
Warning: if the let_fun is applied to additional arguments (such as in (let_fun f := id; id) 1), this function returns false.
Equations
- e.isLetFun = e.isAppOfArity `letFun 4
Instances For
Recognizes a let_fun expression.
For let_fun n : t := v; b, returns some (n, t, v, b), which are the first four arguments to Lean.Expr.letE.
Warning: if the let_fun is applied to additional arguments (such as in (let_fun f := id; id) 1), this function returns none.
let_fun expressions are encoded as letFun v (fun (n : t) => b).
They can be created using Lean.Meta.mkLetFun.
If in the encoding of let_fun the last argument to letFun is eta reduced, this returns Name.anonymous for the binder name.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Like Lean.Expr.letFun?, but handles the case when the let_fun expression is possibly applied to additional arguments.
Returns those arguments in addition to the values returned by letFun?.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Maps f on each immediate child of the given expression.
Equations
- One or more equations did not get rendered due to their size.
Instances For
e.foldlM f a folds the monadic function f over the subterms of the expression e,
with initial value a.
Equations
- Lean.Expr.foldlM f init e = Prod.snd <$> (Lean.Expr.traverseChildren (fun (e' : Lean.Expr) (a : α) => Prod.mk e' <$> f a e') e).run init
Instances For
Annotate e with the given annotation name kind.
It uses metadata to store the annotation.
Equations
- Lean.mkAnnotation kind e = Lean.mkMData (Lean.KVMap.empty.insert kind (Lean.DataValue.ofBool true)) e
Instances For
Return some e' if e = mkAnnotation kind e'
Equations
- Lean.annotation? kind e = match e with | Lean.Expr.mdata d b => if (Lean.KVMap.size d == 1 && Lean.KVMap.getBool d kind) = true then some b else none | x => none
Instances For
Auxiliary annotation used to mark terms marked with the "inaccessible" annotation .(t) and
_ in patterns.
Equations
- Lean.mkInaccessible e = Lean.mkAnnotation `_inaccessible e
Instances For
Return some e' if e = mkInaccessible e'.
Equations
- Lean.inaccessible? e = Lean.annotation? `_inaccessible e
Instances For
During elaboration expressions corresponding to pattern matching terms
are annotated with Syntax objects. This function returns some (stx, p') if
p is the pattern p' annotated with stx
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- Lean.isPatternWithRef p = (Lean.patternWithRef? p).isSome
Instances For
Annotate the pattern p with stx. This is an auxiliary annotation
for producing better hover information.
Equations
- Lean.mkPatternWithRef p stx = if (Lean.patternWithRef? p).isSome = true then p else Lean.mkMData (Lean.KVMap.empty.insert Lean.patternRefAnnotationKey (Lean.DataValue.ofSyntax stx)) p
Instances For
Return some p if e is an annotated pattern (inaccessible? or patternWithRef?)
Equations
- Lean.patternAnnotation? e = match Lean.inaccessible? e with | some e => some e | x => match Lean.patternWithRef? e with | some (fst, e) => some e | x => none
Instances For
Annotate e with the LHS annotation. The delaborator displays
expressions of the form lhs = rhs as lhs when they have this annotation.
This is used to implement the infoview for the conv mode.
This version of mkLHSGoal does not check that the argument is an equality.
Equations
- Lean.mkLHSGoalRaw e = Lean.mkAnnotation `_lhsGoal e
Instances For
Return some lhs if e = mkLHSGoal e', where e' is of the form lhs = rhs.
Equations
- Lean.isLHSGoal? e = match Lean.annotation? `_lhsGoal e with | none => none | some e => if e.isAppOfArity `Eq 3 = true then some e.appFn!.appArg! else none
Instances For
Polymorphic operation for generating unique/fresh free variable identifiers.
It is available in any monad m that implements the interface MonadNameGenerator.
Instances For
Polymorphic operation for generating unique/fresh metavariable identifiers.
It is available in any monad m that implements the interface MonadNameGenerator.
Instances For
Polymorphic operation for generating unique/fresh universe metavariable identifiers.
It is available in any monad m that implements the interface MonadNameGenerator.
Instances For
Make an n-ary And application. mkAndN [] returns True.
Equations
- Lean.mkAndN [] = Lean.mkConst `True
- Lean.mkAndN [p] = p
- Lean.mkAndN (p :: ps) = Lean.mkAnd p (Lean.mkAndN ps)
Instances For
Constants for Nat typeclasses.
Equations
- Lean.Nat.mkInstAdd = Lean.mkConst `instAddNat
Instances For
Equations
Instances For
Equations
- Lean.Nat.mkInstSub = Lean.mkConst `instSubNat
Instances For
Equations
Instances For
Equations
- Lean.Nat.mkInstMul = Lean.mkConst `instMulNat
Instances For
Equations
Instances For
Equations
- Lean.Nat.mkInstDiv = Lean.mkConst `Nat.instDiv
Instances For
Equations
Instances For
Equations
- Lean.Nat.mkInstMod = Lean.mkConst `Nat.instMod
Instances For
Equations
Instances For
Equations
- Lean.Nat.mkInstNatPow = Lean.mkConst `instNatPowNat
Instances For
Equations
Instances For
Equations
Instances For
Equations
- Lean.Nat.mkInstLT = Lean.mkConst `instLTNat
Instances For
Equations
- Lean.Nat.mkInstLE = Lean.mkConst `instLENat
Instances For
Given a : Nat, returns Nat.succ a
Equations
- Lean.mkNatSucc a = Lean.mkApp (Lean.mkConst `Nat.succ) a
Instances For
Given a b : Nat, returns a + b
Equations
- Lean.mkNatAdd a b = Lean.mkApp2 Lean.natAddFn a b
Instances For
Given a b : Nat, returns a - b
Equations
- Lean.mkNatSub a b = Lean.mkApp2 Lean.natSubFn a b
Instances For
Given a b : Nat, returns a * b
Equations
- Lean.mkNatMul a b = Lean.mkApp2 Lean.natMulFn a b
Instances For
Given a b : Nat, return a ≤ b
Equations
- Lean.mkNatLE a b = Lean.mkApp2 Lean.natLEPred a b
Instances For
Given a b : Nat, return a = b
Equations
- Lean.mkNatEq a b = Lean.mkApp2 Lean.natEqPred a b