let rec export_tau fmt = function
  | Integer -> pp_print_string fmt "int"
  | Real -> pp_print_string fmt "real"
  | Boolean -> pp_print_string fmt "bool"
  | Pointer -> pp_print_string fmt "pointer"
  | Record _ -> pp_print_string fmt "data farray"
  | Array arr ->
      Format.fprintf fmt "%a farray"
        export_tau (Datalib.Tau.tau_of_logic_ctype arr.Ctypes.arr_element)
  | Set te ->
      Format.fprintf fmt "%a set" export_tau te
  | ADT(s,[]) -> pp_print_string fmt s
  | ADT(s,[t]) -> Format.fprintf fmt "%a %s" export_tau t s
  | ADT(s,t::ts) ->
      Format.fprintf fmt "@[(%a" export_tau t ;
      List.iter (fun t -> Format.fprintf fmt ",@,%a" export_tau t) ts ;
      Format.fprintf fmt ") %s@]" s