{motive_1 : Aesop.Frontend.RuleExpr → Sort u} →
  {motive_2 : Array Aesop.Frontend.RuleExpr → Sort u} →
    {motive_3 : List Aesop.Frontend.RuleExpr → Sort u} →
      ((f : Aesop.Frontend.Feature) →
          (children : Array Aesop.Frontend.RuleExpr) →
            motive_2 children → motive_1 (Aesop.Frontend.RuleExpr.node f children)) →
        ((toList : List Aesop.Frontend.RuleExpr) → motive_3 toList → motive_2 { toList := toList }) →
          motive_3 [] →
            ((head : Aesop.Frontend.RuleExpr) →
                (tail : List Aesop.Frontend.RuleExpr) → motive_1 head → motive_3 tail → motive_3 (head :: tail)) →
              (t : Array Aesop.Frontend.RuleExpr) → motive_2 t