Documentation

Mathlib.Lean.Expr.Basic

Additional operations on Expr and related types #

This file defines basic operations on the types expr, name, declaration, level, environment.

This file is mostly for non-tactics.

Declarations about BinderInfo #

The brackets corresponding to a given BinderInfo.

Instances For

    Declarations about name #

    @[specialize #[]]

    Find the largest prefix n of a Name such that f n != none, then replace this prefix with the value of f n.

    Instances For

      Build a name from components. For example, from_components [`foo, `bar] becomes `foo.bar. It is the inverse of Name.components on list of names that have single components.

      Instances For

        Update the last component of a name.

        Instances For

          Get the last field of a name as a string. Doesn't raise an error when the last component is a numeric field.

          Instances For
            def Lean.Name.splitAt (nm : Name) (n : Nat) :

            nm.splitAt n splits a name nm in two parts, such that the second part has depth n, i.e. (nm.splitAt n).2.getNumParts = n (assuming nm.getNumParts ≥ n). Example: splitAt `foo.bar.baz.back.bat 1 = (`foo.bar.baz.back, `bat).

            Instances For

              isPrefixOf? pre nm returns some post if nm = pre ++ post. Note that this includes the case where nm has multiple more namespaces. If pre is not a prefix of nm, it returns none.

              Instances For
                def Lean.Name.isBlackListed {m : TypeType} [Monad m] [MonadEnv m] (declName : Name) :
                Instances For

                  Checks whether this ConstantInfo is a definition.

                  Instances For

                    Checks whether this ConstantInfo is a theorem.

                    Instances For

                      Update ConstantVal (the data common to all constructors of ConstantInfo) in a ConstantInfo.

                      Instances For

                        Update the name of a ConstantInfo.

                        Instances For

                          Update the type of a ConstantInfo.

                          Instances For

                            Update the level parameters of a ConstantInfo.

                            Instances For

                              Update the mutual-block all field of a ConstantInfo.

                              This applies to declaration kinds where ConstantInfo.all is stored directly.

                              Instances For

                                Update the value of a ConstantInfo, if it has one.

                                Instances For

                                  Turn a ConstantInfo into a declaration.

                                  Instances For
                                    def Lean.mkConst' (constName : Name) :

                                    Same as mkConst, but with fresh level metavariables.

                                    Instances For

                                      Declarations about Expr #

                                      Instances For
                                        @[inline]

                                        Given f a b c, return #[f a, f a b, f a b c]. Each entry in the array is an Expr.app, and this array has the same length as the one returned by Lean.Expr.getAppArgs.

                                        Instances For

                                          Erase proofs in an expression by replacing them with sorrys.

                                          This function replaces all proofs in the expression and in the types that appear in the expression by sorryAxs. The resulting expression has the same type as the old one.

                                          It is useful, e.g., to verify if the proof-irrelevant part of a definition depends on a variable.

                                          Instances For

                                            If an Expr has the form Type u, then return some u, otherwise none.

                                            Instances For
                                              @[deprecated "This function was implemented incorrectly" (since := "2026-02-13")]

                                              isConstantApplication e checks whether e is syntactically an application of the form (fun x₁ ⋯ xₙ => H) y₁ ⋯ yₙ where H does not contain the variable xₙ. In other words, it does a syntactic check that the expression does not depend on yₙ.

                                              Instances For
                                                @[inline]
                                                partial def Lean.Expr.isAppOrForallOfConstP (p : NameBool) (type : Expr) :

                                                Returns true if type is an application of a constant decl for which p decl is true, or a forall with return type of the same form (i.e. of the form ∀ (x₀ : X₀) (x₁ : X₁) ⋯, decl .. where p decl).

                                                Runs cleanupAnnotations on type and forallE bodies, and ignores metadata in applications.

                                                @[inline]
                                                def Lean.Expr.isAppOrForallOfConst (declName : Name) (type : Expr) :

                                                Returns true if type is an application of a constant declName, or a forall with return type of the same form (i.e. of the form ∀ (x₀ : X₀) (x₁ : X₁) ⋯, declName ..).

                                                Runs cleanupAnnotations on type and forallE bodies, and ignores metadata in applications.

                                                Instances For

                                                  Gets the indices i (in ascending order) of the binders of a nested .forallE, (x₀ : A₀) → (x₁ : A₁) → ⋯ → X, such that

                                                  • the binder [xᵢ : Aᵢ] has instImplicit binderInfo
                                                  • p Aᵢ is true
                                                  • The rest of the type (xᵢ₊₁ : Aᵢ₊₁) → ⋯ → X does not depend on xᵢ. (It's in this sense that xᵢ : Aᵢ is "unused".)

                                                  Note that the argument to p may have loose bvars. This is a performance optimization.

                                                  This function runs cleanupAnnotations on each expression before examining it.

                                                  We see through lets, and do not increment the index when doing so. This behavior is compatible with forallBoundedTelescope.

                                                  Instances For
                                                    partial def Lean.Expr.hasInstanceBinderOf (p : ExprBool) (e : Expr) :

                                                    Returns true if e includes a forallE instance binder that satisfies p.

                                                    Cleans up annotations before traversing nested forallEs, and sees through lets.

                                                    Counts the immediate depth of a nested let expression.

                                                    Instances For

                                                      Check that an expression contains no metavariables (after instantiation).

                                                      Instances For
                                                        def Lean.Expr.ofNat (α : Expr) (n : Nat) :

                                                        Construct the term of type α for a given natural number (doing typeclass search for the OfNat instance required).

                                                        Instances For

                                                          Construct the term of type α for a given integer (doing typeclass search for the OfNat and Neg instances required).

                                                          Instances For
                                                            partial def Lean.Expr.numeral? (e : Expr) :

                                                            Return some n if e is one of the following

                                                            Test if an expression is either Nat.zero, or OfNat.ofNat 0.

                                                            Instances For

                                                              Tests is if an expression matches either x ≠ y or ¬ (x = y). If it matches, returns some (type, x, y).

                                                              Instances For
                                                                @[inline]

                                                                Lean.Expr.le? e takes e : Expr as input. If e represents a ≤ b, then it returns some (t, a, b), where t is the Type of a, otherwise, it returns none.

                                                                Instances For
                                                                  @[inline]

                                                                  Lean.Expr.lt? e takes e : Expr as input. If e represents a < b, then it returns some (t, a, b), where t is the Type of a, otherwise, it returns none.

                                                                  Instances For

                                                                    Given a proposition ty that is an Eq, Iff, or HEq, returns (tyLhs, lhs, tyRhs, rhs), where lhs : tyLhs and rhs : tyRhs, and where lhs is related to rhs by the respective relation.

                                                                    See also Lean.Expr.iff?, Lean.Expr.eq?, and Lean.Expr.heq?.

                                                                    Instances For

                                                                      Returns true if the provided Expr is exactly of the form sorryAx _ _. This is the form produced by the sorry term/tactic.

                                                                      Contrast with Lean.Expr.isSorry, which additionally returns true for any function application of sorry/sorryAx (including e.g. sorryAx α true x y z).

                                                                      Instances For
                                                                        def Lean.Expr.modifyAppArgM {M : TypeType u} [Functor M] [Pure M] (modifier : ExprM Expr) :
                                                                        ExprM Expr
                                                                        Instances For
                                                                          def Lean.Expr.modifyRevArg (modifier : ExprExpr) :
                                                                          NatExprExpr
                                                                          Instances For
                                                                            def Lean.Expr.modifyArg (modifier : ExprExpr) (e : Expr) (i : Nat) (n : Nat := e.getAppNumArgs) :

                                                                            Given f a₀ a₁ ... aₙ₋₁, runs modifier on the ith argument or returns the original expression if out of bounds.

                                                                            Instances For
                                                                              def Lean.Expr.setArg (e : Expr) (i : Nat) (x : Expr) (n : Nat := e.getAppNumArgs) :

                                                                              Given f a₀ a₁ ... aₙ₋₁, sets the argument on the ith argument to x or returns the original expression if out of bounds.

                                                                              Instances For
                                                                                Instances For
                                                                                  def Lean.Expr.getArg? (e : Expr) (i : Nat) (n : Nat := e.getAppNumArgs) :

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

                                                                                  Instances For
                                                                                    def Lean.Expr.modifyArgM {M : TypeType u} [Monad M] (modifier : ExprM Expr) (e : Expr) (i : Nat) (n : Nat := e.getAppNumArgs) :

                                                                                    Given f a₀ a₁ ... aₙ₋₁, runs modifier on the ith argument. An argument n may be provided which says how many arguments we are expecting e to have.

                                                                                    Instances For
                                                                                      def Lean.Expr.renameBVar (e : Expr) (old new : Name) :

                                                                                      Traverses an expression e and renames bound variables named old to new.

                                                                                      Instances For

                                                                                        getBinderName e returns some n if e is an expression of the form ∀ n, ... and none otherwise.

                                                                                        Instances For

                                                                                          Map binder names in a nested forall (a₁ : α₁) → ... → (aₙ : αₙ) → _

                                                                                          Instances For

                                                                                            If e has a structure as type with field fieldName, mkDirectProjection e fieldName creates the projection expression e.fieldName

                                                                                            Instances For
                                                                                              def Lean.Expr.mkProjection (e : Expr) (fieldName : Name) :

                                                                                              If e has a structure as type with field fieldName (either directly or in a parent structure), mkProjection e fieldName creates the projection expression e.fieldName

                                                                                              Instances For

                                                                                                If e is a projection of the structure constructor, reduce the projection. Otherwise returns none. If this function detects that expression is ill-typed, throws an error. For example, given Prod.fst (x, y), returns some x.

                                                                                                Instances For
                                                                                                  @[specialize #[]]

                                                                                                  Returns true if e contains a name n where p n is true.

                                                                                                  Instances For

                                                                                                    Given (hNotEx : Not ex) where ex is of the form Exists x, p x, return a forall x, Not (p x) and a proof for it.

                                                                                                    This function handles nested existentials.

                                                                                                    Instances For
                                                                                                      def Lean.getFieldsToParents (env : Environment) (structName : Name) :

                                                                                                      Get the projections that are projections to parent structures. Similar to getParentStructures, except that this returns the (last component of the) projection names instead of the parent names.

                                                                                                      Instances For