let assign_set_value elts =
  (*
    First, we create a new string that will be used as a pointer to the set.
    We register its type as [Pointer], register it in the [global_var_id] table, 
    give it a value ni the [memory_map] table. Informally, this value is the
    address of this set in the memory.
  *)

  let pointer_string_id = string_id#register_blind_const "set" 0 in
  let pointer_global_var_id = Globals.global_var_id#get_id_of 0 pointer_string_id in
  let pointer_mmap_id = Globals.memory_map#map_new_var pointer_global_var_id in

        let eltType =
          let rec find_applied = function
              t::lt ->
                (try
                  [Utils.if_term_to_type t]
                with Not_found -> find_applied lt)
            | [] -> []
          in
          find_applied elts
        in
(*  ignore (Globals.type_table#register_type pointer_string_id (Base(Pointer)));*)
(*  ignore (Globals.type_table#register_type pointer_string_id (Set([Base(Message)])));*)
  ignore (Globals.type_table#register_type pointer_string_id (Set(eltType)));
  Globals.value_table#set_value pointer_mmap_id (If_set(elts));
  if (!debug_level >= 3) then
    prerr_endline ("  creating pointer "^(Globals.string_id#get_name pointer_string_id)
                   ^" for value "^(ground_if_value_to_string (If_set(elts))));
  If_const(pointer_string_id)