let rec pp_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 c -> pp_print_string fmt (if c.cstruct then "record" else "union")
    | Array a ->
        Format.fprintf fmt "%a array" pp_tau
          (tau_of_logic_ctype a.arr_element)
    | Formula.Set te ->
        if Wp_parameters.verbose_atleast 2
        then Format.fprintf fmt "%a set" pp_tau te
        else pp_print_string fmt "set"
    | ADT(s,[]) -> pp_print_string fmt s
    | ADT(s,[t]) -> Format.fprintf fmt "%a %s" pp_tau t s
    | ADT(s,t::ts) ->
        Format.fprintf fmt "@[(%a" pp_tau t ;
        List.iter (fun t -> Format.fprintf fmt ",@,%a" pp_tau t) ts ;
        Format.fprintf fmt ") %s@]" s