(motive : Lean.Expr → Sort u_1) →
  (e : Lean.Expr) →
    ((e a : Lean.Expr) → motive (e.app a)) →
      ((binderName : Lean.Name) →
          (binderType t : Lean.Expr) →
            (binderInfo : Lean.BinderInfo) → motive (Lean.Expr.lam binderName binderType t binderInfo)) →
        ((binderName : Lean.Name) →
            (binderType t : Lean.Expr) →
              (binderInfo : Lean.BinderInfo) → motive (Lean.Expr.forallE binderName binderType t binderInfo)) →
          ((declName : Lean.Name) →
              (type e body : Lean.Expr) → (nondep : Bool) → motive (Lean.Expr.letE declName type e body nondep)) →
            ((data : Lean.MData) → (b : Lean.Expr) → motive (Lean.Expr.mdata data b)) →
              ((typeName : Lean.Name) → (idx : ℕ) → (b : Lean.Expr) → motive (Lean.Expr.proj typeName idx b)) →
                ((fvarId : Lean.FVarId) → motive (Lean.Expr.fvar fvarId)) →
                  (Unit → motive (Lean.Expr.sort Lean.Level.zero)) → ((x : Lean.Expr) → motive x) → motive e