let fpp_term term fmt t =
  match t with
    | Tconst c -> constant fmt c
    | Tvar v -> pp_var fmt v
    | Tapp (id, []) -> pp_print_string fmt id
    | Tapp ("ite",[c;a;b]) | Tif (c,a,b) ->
        fprintf fmt "(@[<v 0>if %a@ then %a@ else %a@])"
          term c term a term b
    | Tapp ("neg_int",[a]) ->
        fprintf fmt "@[<hov 1> (-%a)@]" term a
    | Tapp ("add_int", ts) ->
        let xs = collect_assoc "add_int" [] ts in
        pp_flow fmt "0" "+" term xs
    | Tapp ("sub_int", [a;b]) ->
        fprintf fmt "@[<hov 1>(%a@ -%a)@]" term a term b
    | Tapp ("mul_int", ts) ->
        let xs = collect_assoc "mul_int" [] ts in
        pp_flow fmt "1" "*" term xs
    | Tapp (id, t::ts) ->
        fprintf fmt "@[<hov 2>(%s@, %a" id term t ;
        List.iter (fun t -> fprintf fmt " @, %a" term t) ts ;
        fprintf fmt ")@]"
    | Tlet (x,v,t) ->
        fprintf fmt "(@[<v 0>let %a@ := %a@ in %a@])"
          pp_var x term v term t
    | Taccess(t,i) ->
        fprintf fmt "@[<hov 2>(access@, %a@, %a)@]" term t term i
    | Tupdate(t,i,v)  ->
        fprintf fmt "@[<hov 2>(update@, %a@, %a@, %a)@]" term t term i term v
    | Tgetfield(f,r) ->
        if f.Cil_types.fcomp.Cil_types.cstruct then
        fprintf fmt "@[<hov 2>(%a.(%s))@]" term r (field f)
        else (fprintf fmt "@[<hov 2>(%s @, %a)@]"(get_ufield f) term r)
    | Tsetfield(f,r,v) ->
        let cp = f.Cil_types.fcomp in
        if cp.Cil_types.cstruct then
          begin
            let built_rec = "mk"^(String.capitalize cp.Cil_types.cname) in
            fprintf fmt "@[<hov 2> ( %s " built_rec;
            List.iter (fun g ->
                         (if Cil_datatype.Fieldinfo.equal g f then
                            Format.fprintf fmt"(%a)@]" term v
                          else
                            Format.fprintf fmt "%a.(%s)" term r (field g))
                      ) cp.Cil_types.cfields   ;
            fprintf fmt ")@]"
          end
        else fprintf fmt "@[<hov 2>(%s @, %a @, %a)@]"(set_ufield f) term r term v