let rec fpp_term fmt t =
  match t with
    | Fol.Tconst c -> constant fmt c
    | Fol.Tvar v -> pp_var fmt v
    | Fol.Tapp (id, []) -> pp_print_string fmt id
    | Fol.Tapp ("ite",[c;a;b]) | Fol.Tif (c,a,b) ->
        fprintf fmt "(@[<v 0>if %a@ then %a@ else %a@])"
          fpp_term c fpp_term a fpp_term b
          
    (* INT *)
    | Fol.Tapp ("neg_int", [t]) ->
        fprintf  fmt "@[<hov 1>(-%a)@]" fpp_term t
    | Fol.Tapp ("add_int", ts) ->
        let xs = collect_assoc "add_int" [] ts in
        pp_flow fmt "0" "+" fpp_term xs
    | Fol.Tapp ("sub_int", [a;b]) ->
        fprintf fmt "@[<hov 1>(%a@,-%a)@]" fpp_term a fpp_term b
    | Fol.Tapp ("mul_int", ts) ->
        let xs = collect_assoc "mul_int" [] ts in
        pp_flow fmt "1" "*" fpp_term xs

    (* REAL *)
    | Fol.Tapp ("neg_real", [t]) ->
        fprintf  fmt "@[<hov 1>(-%a)@]" fpp_term t
    | Fol.Tapp ("add_real", ts) ->
        let xs = collect_assoc "add_real" [] ts in
        pp_flow fmt "0.0" "+" fpp_term xs
    | Fol.Tapp ("sub_real", [a;b]) ->
        fprintf fmt "@[<hov 1>(%a@,-%a)@]" fpp_term a fpp_term b
    | Fol.Tapp ("mul_real", ts) ->
        let xs = collect_assoc "mul_real" [] ts in
        pp_flow fmt "1.0" "*" fpp_term xs
    | Fol.Tapp ("div_real", [a;b]) ->
        fprintf fmt "@[<hov 1>(%a@,/%a)@]" fpp_term a fpp_term b

    (* OTHER *)
    | Fol.Taccess(a,k) ->
        Format.fprintf fmt "@[<hv 2>%a[%a]@]" fpp_term a fpp_term k
    | Fol.Tupdate(a,k,b) ->
        Format.fprintf fmt "@[<hv 2>%a[%a@,<-%a]@]"
          fpp_term a fpp_term k fpp_term b
    | Fol.Tgetfield(f,r) ->
        Format.fprintf fmt "@[<hv 2>%s(%a)@]" (get_field f) fpp_term r
    | Fol.Tsetfield(f,r,v) ->
        Format.fprintf fmt "@[<hv 2>%s(%a,%a)@]" (set_field f) fpp_term r fpp_term v
    | Fol.Tapp (id, t::ts) ->
        fprintf fmt "@[<hov 2>%s(@,%a" id fpp_term t ;
        List.iter (fun t -> fprintf fmt ",@,%a" fpp_term t) ts ;
        fprintf fmt ")@]"
    | Fol.Tlet (x,v,t) ->
        fprintf fmt "(@[<hov 0>let %a=%a in@ %a@])"
          pp_var x fpp_term v fpp_term t