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