(motive : Lean.Expr → Sort u_1) →
  (e : Lean.Expr) →
    ((deBruijnIndex : ℕ) → motive (Lean.Expr.bvar deBruijnIndex)) →
      ((u : Lean.Level) → motive (Lean.Expr.sort u)) →
        ((a : Lean.Literal) → motive (Lean.Expr.lit a)) →
          ((fvarId : Lean.FVarId) → motive (Lean.Expr.fvar fvarId)) →
            ((mvarId : Lean.MVarId) → motive (Lean.Expr.mvar mvarId)) →
              ((f a : Lean.Expr) → motive (f.app a)) →
                ((typeName : Lean.Name) → (idx : ℕ) → (b : Lean.Expr) → motive (Lean.Expr.proj typeName idx b)) →
                  ((data : Lean.MData) → (b : Lean.Expr) → motive (Lean.Expr.mdata data b)) →
                    ((binderName : Lean.Name) →
                        (binderType body : Lean.Expr) →
                          (binderInfo : Lean.BinderInfo) →
                            motive (Lean.Expr.lam binderName binderType body binderInfo)) →
                      ((declName : Lean.Name) →
                          (type value body : Lean.Expr) →
                            (nondep : Bool) → motive (Lean.Expr.letE declName type value body nondep)) →
                        ((binderName : Lean.Name) →
                            (binderType body : Lean.Expr) →
                              (binderInfo : Lean.BinderInfo) →
                                motive (Lean.Expr.forallE binderName binderType body binderInfo)) →
                          ((declName : Lean.Name) → (us : List Lean.Level) → motive (Lean.Expr.const declName us)) →
                            motive e