anchor.diff:  	 t_is_port/1, t_is_port/2,
   	 t_is_maybe_improper_list/1, t_is_maybe_improper_list/2,
   	 t_is_reference/1, t_is_reference/2,
  -	 t_is_remote/1,
   	 t_is_string/1,
   	 t_is_subtype/2,
   	 t_is_tuple/1, t_is_tuple/2,
  
positive.code:   [t_struct_from_opaque(Type, Opaques) || Type <- Types].
  
  %%-----------------------------------------------------------------------------
  %% Remote types: these types are used for preprocessing;
  %% they should never reach the analysis stage.
  
  -spec t_remote(atom(), atom(), [erl_type()]) -> erl_type().
  
  t_remote(Mod, Name, Args) ->
    ?remote(set_singleton(#remote{mod = Mod, name = Name, args = Args})).
  
  -spec t_is_remote(erl_type()) -> boolean().
  
  t_is_remote(Type) ->
    do_opaque(Type, 'universe', fun is_remote/1).
  
  is_remote(?remote(_)) -> true;
  is_remote(_) -> false.
  
  -type mod_records() :: dict:dict(module(), type_table()).
  
  
negative.code: %%  io:format("Debug: t_sup executed with args ~w and ~w~n",[T1, T2]), ?none;
  %%t_sup(T1, T2=?opaque(_,_,_)) ->
  %%  io:format("Debug: t_sup executed with args ~w and ~w~n",[T1, T2]), ?none;
  t_sup(?matchstate(Pres1, Slots1), ?matchstate(Pres2, Slots2)) ->
    ?matchstate(t_sup(Pres1, Pres2), t_sup(Slots1, Slots2));
  t_sup(?nil, ?nil) -> ?nil;
  