let rec pp_term pp_data fmt t = 
  let term = pp_term pp_data in
  match t with
  | Tconst c ->
      constant fmt c
  | Tvar v ->
      pp_var fmt v
  | Tdata d ->
      fprintf fmt "%a" pp_data d
  | Tapp (id, []) ->
      fprintf fmt "%s" id
  | Tapp (id, tl) ->
      fprintf fmt "%s(%a)" id (print_list comma term) tl
  | Tif (c,t,e) -> fprintf fmt "if %a then %a else %a" term c term t term e