let rec flatten xs = function
    | Tapp( f , es ) when f = M.union -> List.fold_left flatten xs es
    | Tapp( f , [] ) when f = M.empty -> xs
    | t -> t::xs