Documentation

Lean.Expr

inductive Lean.Literal :

Literal values for Expr.

Instances For

    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.

    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 -- Auxillary definitions are helper methods that Lean generates. aux_decl is used for _match, _fun_match, _let_match and 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: https://leanprover.github.io/lean4/doc/expressions.html#implicit-arguments

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

      Return true if the given BinderInfo does not correspond to an implicit binder annotation (i.e., implicit, strictImplicit, or instImplicit).

      Equations

      Return true if the given BinderInfo is an instance implicit annotation (e.g., [Decidable α])

      Equations

      Return true if the given BinderInfo is a regular implicit annotation (e.g., {α : Type u})

      Equations

      Return true if the given BinderInfo is a strict implicit annotation (e.g., {{α : Type u}})

      Equations
      @[inline]

      Expression metadata. Used with the Expr.mdata constructor.

      Equations
      @[inline]
      Equations

      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
      Equations
      def Lean.Expr.mkData (h : UInt64) (looseBVarRange : optParam Nat 0) (approxDepth : optParam UInt32 0) (hasFVar : optParam Bool false) (hasExprMVar : optParam Bool false) (hasLevelMVar : optParam Bool false) (hasLevelParam : optParam Bool false) :
      Equations
      • One or more equations did not get rendered due to their size.
      @[inline]

      Optimized version of Expr.mkData for applications.

      Equations
      • One or more equations did not get rendered due to their size.
      @[inline]
      def Lean.Expr.mkDataForBinder (h : UInt64) (looseBVarRange : Nat) (approxDepth : UInt32) (hasFVar : Bool) (hasExprMVar : Bool) (hasLevelMVar : Bool) (hasLevelParam : Bool) :
      Equations
      @[inline]
      def Lean.Expr.mkDataForLet (h : UInt64) (looseBVarRange : Nat) (approxDepth : UInt32) (hasFVar : Bool) (hasExprMVar : Bool) (hasLevelMVar : Bool) (hasLevelParam : Bool) :
      Equations
      Equations
      • One or more equations did not get rendered due to their size.
      structure Lean.FVarId :

      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.

      Instances For
        Equations
        Equations

        A set of unique free variable identifiers. This is a persistent data structure implemented using red-black trees.

        Equations
        Equations

        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

        A mapping from free variable identifiers to values of type α. This is a persistent data structure implemented using red-black trees.

        Equations
        def Lean.FVarIdMap.insert {α : Type} (s : Lean.FVarIdMap α) (fvarId : Lean.FVarId) (a : α) :
        Equations
        Equations
        Equations
        • Lean.instInhabitedFVarIdMap = { default := }
        structure Lean.MVarId :

        Universe metavariable Id

        Instances For
          Equations
          Equations
          Equations
          Equations
          def Lean.MVarIdMap.insert {α : Type} (s : Lean.MVarIdMap α) (mvarId : Lean.MVarId) (a : α) :
          Equations
          Equations
          instance Lean.instForInMVarIdMapProdMVarId {m : Type u_1 → Type u_2} {α : Type} :
          Equations
          Equations
          • Lean.instInhabitedMVarIdMap = { default := }
          @[extern c inline "lean_ctor_get_uint64(#1, lean_ctor_num_objs(#1)*sizeof(void*))"]
          noncomputable def Lean.Expr.data :
          inductive Lean.Expr :
          • The bvar constructor represents bound variables, i.e. occurrences of a variable in the expression where there is a variable binder above it (i.e. introduced by a lam, forallE, or letE).

            The deBruijnIndex parameter is the de-Bruijn index for the bound variable. See here for additional information on de-Bruijn indexes.

            For example, consider the expression fun x : Nat => forall y : Nat, x = y. The x and y variables in the equality expression are constructed using bvar and bound to the binders introduced by the earlier lam and forallE constructors. Here is the corresponding Expr representation 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
            
            bvar: NatLean.Expr
          • The fvar constructor represent free variables. These /free/ variable occurrences are not bound by an earlier lam, forallE, or letE contructor and its binder exists in a local context only.

            Note that Lean uses the /locally nameless approach/. See here for additional details.

            When "visiting" the body of a binding expression (i.e. lam, forallE, or letE), bound variables are converted into free variables using a unique identifier, and their user-facing name, type, value (for LetE), and binder annotation are stored in the LocalContext.

            fvar: Lean.FVarIdLean.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.

            mvar: Lean.MVarIdLean.Expr
          • Used for Type u, Sort u, and Prop:

            • Prop is represented as .sort .zero,
            • Sort u as .sort (.param `u), and
            • Type u as .sort (.succ (.param `u))
            sort: Lean.LevelLean.Expr
          • A (universe polymorphic) constant that has been defined earlier in the module or by another imported module. For example, @Eq.{1} is represented as Expr.const `Eq [.succ .zero], and @Array.map.{0, 0} is represented as Expr.const `Array.map [.zero, .zero].

            const: Lean.NameList Lean.LevelLean.Expr
          • A function application.

            For example, the natural number one, i.e. Nat.succ Nat.zero is represented as Expr.app (.const Nat.succ []) (.const .zero [])` Note that multiple arguments are represented using partial application.

            For example, the two argument application f x y is represented as Expr.app (.app f x) y.

            app: Lean.ExprLean.ExprLean.Expr
          • A lambda abstraction (aka anonymous functions). It introduces a new binder for variable x in scope for the lambda body.

            For example, the expression fun x : Nat => x is represented as

            Expr.lam `x (.const `Nat []) (.bvar 0) .default
            
            lam: Lean.NameLean.ExprLean.ExprLean.BinderInfoLean.Expr
          • A dependent arrow (a : α) → β) (aka forall-expression) where β may dependent on a. Note that this constructor is also used to represent non-dependent arrows where β does not depend on a.

            For example:

            • forall x : Prop, x ∧ x:
            Expr.forallE `x (.sort .zero)
              (.app (.app (.const `And []) (.bvar 0)) (.bvar 0)) .default
            
            Expr.forallE `a (.const `Nat [])
              (.const `Bool []) .default
            
            forallE: Lean.NameLean.ExprLean.ExprLean.BinderInfoLean.Expr
          • Let-expressions.

            IMPORTANT: The nonDep flag 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; e is non-dependent when it is equivalent to (fun x : t => e) v. Here is an example of a dependent let-expression let n : Nat := 2; fun (a : Array Nat n) (b : Array Nat 2) => a = b is type correct, but (fun (n : Nat) (a : Array Nat n) (b : Array Nat 2) => a = b) 2 is not.

            The let-expression let x : Nat := 2; Nat.succ x is represented as

            Expr.letE `x (.const `Nat []) (.lit (.natVal 2)) (.bvar 0) true
            
            letE: Lean.NameLean.ExprLean.ExprLean.ExprBoolLean.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 2 can be represented as Expr.lit (.natVal 2). Note that, it is definitionally equal to:

            Expr.app (.const `Nat.succ []) (.app (.const `Nat.succ []) (.const `Nat.zero []))
            
            lit: Lean.LiteralLean.Expr
          • Metadata (aka annotations).

            We use annotations to provide hints to the pretty-printer, store references to Syntax nodes, position information, and save information for elaboration procedures (e.g., we use the inaccessible annotation during elaboration to mark Exprs that correspond to inaccessible patterns).

            Note that Expr.mdata data e is definitionally equal to e.

            mdata: Lean.MDataLean.ExprLean.Expr
          • Projection-expressions. They are redundant, but are used to create more compact terms, speedup reduction, and implement eta for structures. The type of struct must 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 the typeName matches the type of struct, and whether the (zero-based) index is valid (i.e., it is smaller than the numbef of constructor fields). When exporting Lean developments to other systems, proj can be replaced with typeName.rec applications.

            Example, given a : Nat x Bool, a.1 is represented as

            .proj `Prod 0 a
            
            proj: Lean.NameNatLean.ExprLean.Expr

          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.

          Instances For

            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.

            Return true if e contains free variables. This is a constant time operation.

            Equations

            Return true if e contains expression metavariables. This is a constant time operation.

            Equations

            Return true if e contains universe (aka Level) metavariables. This is a constant time operation.

            Equations

            Does the expression contain level (aka universe) or expression metavariables? This is a constant time operation.

            Equations

            Return true if e contains universe level parameters. This is a constant time operation.

            Equations

            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

            The range of de-Bruijn variables that are loose. That is, bvars that are not bound by a binder. For example, bvar i has range i + 1 and an expression with no loose bvars has range 0.

            Equations

            Return the binder information if e is a lambda or forall expression, and .default otherwise.

            Equations

            Export functions.

            @[export lean_expr_hash]
            Equations
            @[export lean_expr_has_fvar]
            Equations
            @[export lean_expr_has_mvar]
            Equations
            def Lean.mkConst (declName : Lean.Name) (us : optParam (List Lean.Level) []) :

            mkConst declName us return .const declName us.

            Equations

            Return the type of a literal value.

            Equations

            .bvar idx is now the preferred form.

            Equations

            .sort u is now the preferred form.

            Equations

            .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

            .mvar mvarId is now the preferred form. This function is seldom used, metavariables are often created using functions such as mkFresheExprMVar at MetaM.

            Equations

            .mdata m e is now the preferred form.

            Equations
            def Lean.mkProj (structName : Lean.Name) (idx : Nat) (struct : Lean.Expr) :

            .proj structName idx struct is now the preferred form.

            Equations

            .app f a is now the preferred form.

            Equations

            .lam x t b bi is now the preferred form.

            Equations

            .forallE x t b bi is now the preferred form.

            Equations

            Return fun (_ : Unit), e

            Equations
            def Lean.mkLet (x : Lean.Name) (t : Lean.Expr) (v : Lean.Expr) (b : Lean.Expr) (nonDep : optParam Bool false) :

            .letE x t v b nonDep is now the preferred form.

            Equations
            Equations
            Equations
            Equations
            def Lean.mkApp6 (f : Lean.Expr) (a : Lean.Expr) (b : Lean.Expr) (c : Lean.Expr) (d : Lean.Expr) (e₁ : Lean.Expr) (e₂ : Lean.Expr) :
            Equations
            def Lean.mkApp7 (f : Lean.Expr) (a : Lean.Expr) (b : Lean.Expr) (c : Lean.Expr) (d : Lean.Expr) (e₁ : Lean.Expr) (e₂ : Lean.Expr) (e₃ : Lean.Expr) :
            Equations
            def Lean.mkApp8 (f : Lean.Expr) (a : Lean.Expr) (b : Lean.Expr) (c : Lean.Expr) (d : Lean.Expr) (e₁ : Lean.Expr) (e₂ : Lean.Expr) (e₃ : Lean.Expr) (e₄ : Lean.Expr) :
            Equations
            def Lean.mkApp9 (f : Lean.Expr) (a : Lean.Expr) (b : Lean.Expr) (c : Lean.Expr) (d : Lean.Expr) (e₁ : Lean.Expr) (e₂ : Lean.Expr) (e₃ : Lean.Expr) (e₄ : Lean.Expr) (e₅ : Lean.Expr) :
            Equations
            def Lean.mkApp10 (f : Lean.Expr) (a : Lean.Expr) (b : Lean.Expr) (c : Lean.Expr) (d : Lean.Expr) (e₁ : Lean.Expr) (e₂ : Lean.Expr) (e₃ : Lean.Expr) (e₄ : Lean.Expr) (e₅ : Lean.Expr) (e₆ : Lean.Expr) :
            Equations

            .lit l is now the preferred form.

            Equations

            Return the "raw" natural number .lit (.natVal n). This is not the default representation used by the Lean frontend. See mkNatLit.

            Equations

            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

            Return the string literal .lit (.strVal s)

            Equations
            @[export lean_expr_mk_bvar]
            Equations
            @[export lean_expr_mk_fvar]
            Equations
            @[export lean_expr_mk_mvar]
            Equations
            @[export lean_expr_mk_sort]
            Equations
            @[export lean_expr_mk_const]
            Equations
            @[export lean_expr_mk_app]
            Equations
            @[export lean_expr_mk_lambda]
            Equations
            @[export lean_expr_mk_forall]
            Equations
            @[export lean_expr_mk_let]
            Equations
            @[export lean_expr_mk_lit]
            Equations
            @[export lean_expr_mk_mdata]
            Equations
            @[export lean_expr_mk_proj]
            Equations

            mkAppN f #[a₀, ..., aₙ] ==> f a₀ a₁ .. aₙ

            Equations
            def Lean.mkAppRange (f : Lean.Expr) (i : Nat) (j : Nat) (args : Array Lean.Expr) :

            mkAppRange f i j #[a_1, ..., a_i, ..., a_j, ... ] ==> the expression f a_i ... a_{j-1}

            Equations

            Same as mkApp f args but reversing args.

            Equations
            @[extern lean_expr_dbg_to_string]
            @[extern lean_expr_quick_lt]

            A total order for expressions. We say it is quick because it first compares the hashcodes.

            @[extern lean_expr_lt]
            opaque Lean.Expr.lt (a : Lean.Expr) (b : Lean.Expr) :

            A total order for expressions that takes the structure into account (e.g., variable names).

            @[extern lean_expr_eqv]

            Return true iff a and b are alpha equivalent. Binder annotations are ignored.

            @[extern lean_expr_equal]

            Return true iff a and b are equal. Binder names and annotations are taking into account.

            Return true if the given expression is a .sort ..

            Equations

            Return true if the given expression is of the form .sort (.succ ..).

            Equations

            Return true if the given expression is of the form .sort (.succ .zero).

            Equations

            Return true if the given expression is a .sort .zero

            Equations

            Return true if the given expression is a bound variable.

            Equations

            Return true if the given expression is a metavariable.

            Equations

            Return true if the given expression is a free variable.

            Equations

            Return true if the given expression is an application.

            Equations

            Return true if the given expression is a projection .proj ..

            Equations

            Return true if the given expression is a constant.

            Equations

            Return true if the given expression is a constant of the give name. Examples:

            Equations

            Return true if the given expression is a free variable with the given id. Examples:

            Equations

            Return true if the given expression is a forall-expression aka (dependent) arrow.

            Equations

            Return true if the given expression is a lambda abstraction aka anonymous function.

            Equations

            Return true if the given expression is a forall or lambda expression.

            Equations

            Return true if the given expression is a let-expression.

            Equations

            Return true if the given expression is a metadata.

            Equations

            Return true if the given expression is a literal value.

            Equations

            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

            Given a sequence of nested foralls (a₁ : α₁) → ... → (aₙ : αₙ) → _, returns the names [a₁, ... aₙ].

            Equations

            If the given expression is a sequence of function applications f a₁ .. aₙ, return f. Otherwise return the input expression.

            Equations

            Counts the number n of arguments for an expression f a₁ .. aₙ.

            Equations
            @[inline]

            Given f a₁ a₂ ... aₙ, returns #[a₁, ..., aₙ]

            Equations
            @[specialize #[]]
            def Lean.Expr.withAppAux {α : Sort u_1} (k : Lean.ExprArray Lean.Exprα) :
            Lean.ExprArray Lean.ExprNatα
            Equations
            @[inline]
            def Lean.Expr.withApp {α : Sort u_1} (e : Lean.Expr) (k : Lean.ExprArray Lean.Exprα) :
            α

            Given e = f a₁ a₂ ... aₙ, returns k f #[a₁, ..., aₙ].

            Equations
            def Lean.Expr.traverseApp {M : TypeType u_1} [inst : Monad M] (f : Lean.ExprM Lean.Expr) (e : Lean.Expr) :

            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
            @[inline]
            def Lean.Expr.withAppRev {α : Sort u_1} (e : Lean.Expr) (k : Lean.ExprArray Lean.Exprα) :
            α

            Same as withApp but with arguments reversed.

            Equations
            @[inline]

            Given f a₀ a₁ ... aₙ, returns the ith argument or panics if out of bounds.

            Equations
            @[inline]

            Given f a₀ a₁ ... aₙ, returns the ith argument or returns v₀ if out of bounds.

            Equations

            Given f a₀ a₁ ... aₙ, returns true if f is a constant with name n.

            Equations

            Given f a₁ ... aᵢ, returns true if f is a constant with name n and has the correct number of arguments.

            Equations
            Equations
            Equations
            Equations
            Equations
            Equations
            Equations
            Equations
            Equations
            Equations
            Equations
            • One or more equations did not get rendered due to their size.
            Equations
            Equations
            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
            • 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.

            Return true if e is a non-dependent arrow. Remark: the following function assumes e does not have loose bound variables.

            Equations
            @[extern lean_expr_has_loose_bvar]
            opaque Lean.Expr.hasLooseBVar (e : Lean.Expr) (bvarIdx : Nat) :

            Return true if e contains the loose bound variable bvarIdx in an explicit parameter, or in the range if tryRange == true.

            Equations
            @[extern lean_expr_lower_loose_bvars]

            Lower the loose bound variables >= s in e by d. That is, a loose bound variable bvar i. i >= s is mapped into bvar (i-d).

            Remark: if s < d, then result is e

            @[extern lean_expr_lift_loose_bvars]

            Lift loose bound variables >= s in e by d.

            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.

            @[extern lean_expr_instantiate]

            Instantiate the loose bound variables in e using subst. That is, a loose Expr.bvar i is replaced with subst[i].

            @[extern lean_expr_instantiate1]
            @[extern lean_expr_instantiate_rev]

            Similar to instantiate, but Expr.bvar i is replaced with subst[subst.size - i - 1]

            @[extern lean_expr_instantiate_range]
            opaque Lean.Expr.instantiateRange (e : Lean.Expr) (beginIdx : Nat) (endIdx : Nat) (xs : Array Lean.Expr) :

            Similar to instantiate, but consider only the variables xs in the range [beginIdx, endIdx). Function panics if beginIdx <= endIdx <= xs.size does not hold.

            @[extern lean_expr_instantiate_rev_range]
            opaque Lean.Expr.instantiateRevRange (e : Lean.Expr) (beginIdx : Nat) (endIdx : Nat) (xs : Array Lean.Expr) :

            Similar to instantiateRev, but consider only the variables xs in the range [beginIdx, endIdx). Function panics if beginIdx <= endIdx <= xs.size does not hold.

            @[extern lean_expr_abstract]

            Replace free (or meta) variables xs with loose bound variables.

            @[extern lean_expr_abstract_range]

            Similar to abstract, but consider only the first min n xs.size entries in xs.

            Replace occurrences of the free variable fvar in e with v

            Equations

            Replace occurrences of the free variable fvarId in e with v

            Equations

            Replace occurrences of the free variables fvars in e with vs

            Equations

            Returns true when the expression does not have any sub-expressions.

            Equations
            • One or more equations did not get rendered due to their size.
            Equations
            Equations
            @[inline]
            abbrev Lean.ExprMap (α : Type) :
            Equations

            Auxiliary type for forcing == to be structural equality for Expr

            Instances For
              Equations
              def Lean.Expr.mkAppRevRange (f : Lean.Expr) (beginIdx : Nat) (endIdx : Nat) (revArgs : Array Lean.Expr) :

              mkAppRevRange f b e args == mkAppRev f (revArgs.extract b e)

              Equations
              def Lean.Expr.betaRev (f : Lean.Expr) (revArgs : Array Lean.Expr) (useZeta : optParam Bool false) (preserveMData : optParam Bool false) :

              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 y
              • betaRev (fun x y => t x y) #[a] ==> fun y => t a y
              • betaRev (fun x y => t x y) #[a, b] ==> t b a
              • betaRev (fun x y => t x y) #[a, b, c, d] ==> t d c b a Suppose t is (fun x y => t x y) a b c d, then args := t.getAppRev is #[d, c, b, a], and betaRev (fun x y => t x y) #[d, c, b, a] is t 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
              partial def Lean.Expr.betaRev.go (revArgs : Array Lean.Expr) (useZeta : optParam Bool false) (preserveMData : optParam Bool false) (sz : Nat) (e : Lean.Expr) (i : Nat) :

              Apply the given arguments to f, beta-reducing if f is a lambda expression. See docstring for betaRev for examples.

              Equations

              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

              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

              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

              Similar to etaExpanded?, but only succeeds if ₙ ≥ 1.

              Equations

              Return some e' if e is of the form optParam _ e'

              Equations

              Return some e' if e is of the form autoParam _ e'

              Equations
              @[export lean_is_out_param]

              Return true if e is of the form outParam _

              Equations

              Return true if e is of the form optParam _ _

              Equations

              Return true if e is of the form autoParam _ _

              Equations
              @[export lean_expr_consume_type_annotations]

              Remove outParam, optParam, and autoParam applications/annotations from e. Note that it does not remove nested annotations. Examples:

              Remove metadata annotations and outParam, optParam, and autoParam applications/annotations from e. Note that it does not remove nested annotations. Examples:

              @[inline]

              Return true iff e contains a free variable which statisfies p.

              Equations
              @[specialize #[]]

              Return true if e contains the given free variable.

              Equations

              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.

              @[implemented_by _private.Lean.Expr.0.Lean.Expr.updateApp!Impl]
              Equations
              • One or more equations did not get rendered due to their size.
              @[inline]
              Equations
              • One or more equations did not get rendered due to their size.
              @[implemented_by _private.Lean.Expr.0.Lean.Expr.updateConst!Impl]
              Equations
              • One or more equations did not get rendered due to their size.
              @[implemented_by _private.Lean.Expr.0.Lean.Expr.updateSort!Impl]
              Equations
              • One or more equations did not get rendered due to their size.
              @[implemented_by _private.Lean.Expr.0.Lean.Expr.updateMData!Impl]
              Equations
              • One or more equations did not get rendered due to their size.
              @[implemented_by _private.Lean.Expr.0.Lean.Expr.updateProj!Impl]
              Equations
              • One or more equations did not get rendered due to their size.
              @[implemented_by _private.Lean.Expr.0.Lean.Expr.updateForall!Impl]
              def Lean.Expr.updateForall! (e : Lean.Expr) (newBinfo : Lean.BinderInfo) (newDomain : Lean.Expr) (newBody : Lean.Expr) :
              Equations
              • One or more equations did not get rendered due to their size.
              @[inline]
              def Lean.Expr.updateForallE! (e : Lean.Expr) (newDomain : Lean.Expr) (newBody : Lean.Expr) :
              Equations
              • One or more equations did not get rendered due to their size.
              @[implemented_by _private.Lean.Expr.0.Lean.Expr.updateLambda!Impl]
              def Lean.Expr.updateLambda! (e : Lean.Expr) (newBinfo : Lean.BinderInfo) (newDomain : Lean.Expr) (newBody : Lean.Expr) :
              Equations
              • One or more equations did not get rendered due to their size.
              @[inline]
              def Lean.Expr.updateLambdaE! (e : Lean.Expr) (newDomain : Lean.Expr) (newBody : Lean.Expr) :
              Equations
              • One or more equations did not get rendered due to their size.
              @[implemented_by _private.Lean.Expr.0.Lean.Expr.updateLet!Impl]
              def Lean.Expr.updateLet! (e : Lean.Expr) (newType : Lean.Expr) (newVal : Lean.Expr) (newBody : Lean.Expr) :
              Equations
              • One or more equations did not get rendered due to their size.
              partial def Lean.Expr.eta (e : Lean.Expr) :

              Eta reduction. If e is of the form (fun x => f x), then return f.

              def Lean.Expr.setOption {α : Type} (e : Lean.Expr) (optionName : Lean.Name) [inst : Lean.KVMap.Value α] (val : α) :

              Annotate e with the given option. The information is stored using metadata around e.

              Equations

              Annotate e with pp.explicit := flag The delaborator uses pp options.

              Equations

              Annotate e with pp.universes := flag The delaborator uses pp options.

              Equations

              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.

              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.

              Annotate e with the given annotation name kind. It uses metadata to store the annotation.

              Equations

              Return some e' if e = mkAnnotation kind e'

              Equations

              Annotate e with the let_fun annotation. This annotation is used as hint for the delaborator. If e is of the form (fun x : t => b) v, then mkLetFunAnnotation e is delaborated at let_fun x : t := v; b

              Equations

              Return true if e = mkLetFunAnnotation e', and e' is of the form (fun x : t => b) v

              Equations

              Auxiliary annotation used to mark terms marked with the "inaccessible" annotation .(t) and _ in patterns.

              Equations

              Return some e' if e = mkInaccessible e'.

              Equations

              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.

              Annotate the pattern p with stx. This is an auxiliary annotation for producing better hover information.

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

              Return some p if e is an annotated pattern (inaccessible? or patternWithRef?)

              Equations

              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

              Return some lhs if e = mkLHSGoal e', where e' is of the form lhs = rhs.

              Equations
              def Lean.mkFreshFVarId {m : TypeType} [inst : Monad m] [inst : Lean.MonadNameGenerator m] :

              Polymorphic operation for generating unique/fresh free variable identifiers. It is available in any monad m that implements the inferface MonadNameGenerator.

              Equations
              • Lean.mkFreshFVarId = do let __do_lift ← Lean.mkFreshId pure { name := __do_lift }
              def Lean.mkFreshMVarId {m : TypeType} [inst : Monad m] [inst : Lean.MonadNameGenerator m] :

              Polymorphic operation for generating unique/fresh metavariable identifiers. It is available in any monad m that implements the inferface MonadNameGenerator.

              Equations
              • Lean.mkFreshMVarId = do let __do_lift ← Lean.mkFreshId pure { name := __do_lift }

              Polymorphic operation for generating unique/fresh universe metavariable identifiers. It is available in any monad m that implements the inferface MonadNameGenerator.

              Equations
              • Lean.mkFreshLMVarId = do let __do_lift ← Lean.mkFreshId pure { name := __do_lift }

              Return p ∨ q

              Equations

              Return p ∧ q

              Equations

              Return Classical.em p

              Equations