(motive : Lean.Expr → Sort u_1) →
  (e : Lean.Expr) →
    ((a : Lean.Literal) → motive (Lean.Expr.lit a)) →
      ((typeName : Lean.Name) → (idx : ℕ) → (struct : Lean.Expr) → motive (Lean.Expr.proj typeName idx struct)) →
        ((declName : Lean.Name) → (us : List Lean.Level) → motive (Lean.Expr.const declName us)) →
          ((fn arg : Lean.Expr) → motive (fn.app arg)) →
            ((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)) →
                ((binderName : Lean.Name) →
                    (binderType body : Lean.Expr) →
                      (binderInfo : Lean.BinderInfo) → motive (Lean.Expr.lam binderName binderType body binderInfo)) →
                  ((fvarId : Lean.FVarId) → motive (Lean.Expr.fvar fvarId)) →
                    ((mvarId : Lean.MVarId) → motive (Lean.Expr.mvar mvarId)) →
                      ((deBruijnIndex : ℕ) → motive (Lean.Expr.bvar deBruijnIndex)) →
                        ((u : Lean.Level) → motive (Lean.Expr.sort u)) → ((x : Lean.Expr) → motive x) → motive e