(motive : Lean.Expr → Sort u_1) →
  (E : Lean.Expr) →
    ((n : ℕ) → motive (Lean.Expr.bvar n)) →
      ((fvarId : Lean.FVarId) → motive (Lean.Expr.fvar fvarId)) →
        ((mvarId : Lean.MVarId) → motive (Lean.Expr.mvar mvarId)) →
          ((l : Lean.Level) → motive (Lean.Expr.sort l)) →
            ((n : Lean.Name) → (ls : List Lean.Level) → motive (Lean.Expr.const n ls)) →
              ((e₁ e₂ : Lean.Expr) → motive (e₁.app e₂)) →
                ((binderName : Lean.Name) →
                    (e₁ e₂ : Lean.Expr) → (d : Lean.BinderInfo) → motive (Lean.Expr.lam binderName e₁ e₂ d)) →
                  ((binderName : Lean.Name) →
                      (e₁ e₂ : Lean.Expr) → (d : Lean.BinderInfo) → motive (Lean.Expr.forallE binderName e₁ e₂ d)) →
                    ((declName : Lean.Name) →
                        (e₁ e₂ e₃ : Lean.Expr) → (nondep : Bool) → motive (Lean.Expr.letE declName e₁ e₂ e₃ nondep)) →
                      ((n : ℕ) → motive (Lean.Expr.lit (Lean.Literal.natVal n))) →
                        ((s : String) → motive (Lean.Expr.lit (Lean.Literal.strVal s))) →
                          ((data : Lean.MData) → (expr : Lean.Expr) → motive (Lean.Expr.mdata data expr)) →
                            ((n : Lean.Name) → (k : ℕ) → (e : Lean.Expr) → motive (Lean.Expr.proj n k e)) → motive E