let str_term_dbg tab (ter : term) =
  let rec f inter = function
    | Var(n)           ->
        let int_type = var_type n in
        let str_type = try List.assoc int_type !localtabletype with Not_found -> string_of_int int_type in
        let str = try List.assoc n tab with Not_found -> "X" ^ (string_of_int (var_id n)) in
        ( str ^ "(" ^ (string_of_int n) ^ ")" ^ ":" ^ str_type )

(*        (try List.assoc n tab   *)
(*        with Not_found -> "^(string_of_int n)^"^(string_of_int (var_id n))^"^(string_of_int (var_type n))         )  *)
(*        with Not_found -> "^(string_of_int (var_id n))^      *)
(*                          (if var_type n=0 then " else "^   *)
(*                          string_of_int (var_type n))          *)
    | Atm(n)           ->
        (try List.assoc n tab
        with Not_found -> "A"^(string_of_int (var_id n))^
                          (if var_type n=0 then "" else "_"^
                          string_of_int (var_type n)))
    | PInv(t)          -> "(" ^ (f false t) ^ ")'"
    | SCrypt(m,k)      -> "{" ^(f true m) ^ "}_"  ^ (f false k)
    | PCrypt(m,k)      -> "#{"^(f true m) ^ "}_"  ^ (f false k)
    | Uplet(h::l)      ->
        if inter then
          it_list (fun r t -> (r ^ "," ^ (f true t))) (f true h) l
        else
          "<" ^ (it_list (fun r t -> (r ^ "," ^ (f true t))) (f true h) l) ^ ">"
    | Uplet([])        -> "<>"
    | Xor(h::l)        ->
        if inter then
          it_list (fun r t -> (r ^ "+" ^ (f false t))) (f false h) l
        else
          "(" ^ (it_list (fun r t -> (r ^ "+" ^ (f false t))) (f false h) l) ^ ")"
    | Xor([])          -> "()"
    | Exp(m,l)         -> "Exp(" ^ (f false m) ^ "," ^ 
        (it_list (fun s -> function 
                    | (a,Pos-> s ^ "*" ^ (f false a)
                    | (a,Neg-> s ^ "/" ^ (f false a)
                 ) "1" l)   ^ ")"
  in
    f false ter