anchor.diff:  -define(number_tag,     number).
   -define(opaque_tag,     opaque).
   -define(product_tag,    product).
  --define(remote_tag,     remote).
   -define(tuple_set_tag,  tuple_set).
   -define(tuple_tag,      tuple).
   -define(union_tag,      union).
  
positive.code: t_to_string(?number(?any, ?unknown_qual), _RecDict) -> "number()";
  t_to_string(?product(List), RecDict) -> 
    "<" ++ comma_sequence(List, RecDict) ++ ">";
  t_to_string(?remote(Set), RecDict) ->
    string:join([case Args =:= [] of
  		 true  -> flat_format("~w:~w()", [Mod, Name]);
  		 false ->
  		   ArgString = comma_sequence(Args, RecDict),
  		   flat_format("~w:~w(~s)", [Mod, Name, ArgString])
  	       end
  	       || #remote{mod = Mod, name = Name, args = Args} <-
  		    set_to_list(Set)],
  	      " | ");
  t_to_string(?map(Pairs), RecDict) ->
      "#{" ++ map_pairs_to_string(Pairs,RecDict) ++ "}";
  t_to_string(?tuple(?any, ?any, ?any), _RecDict) -> "tuple()";
  
negative.code:   end.
  
  unify_union(List) ->
    [A,B,F,I,L,N,T,M,O,Map] = List,
    if O =:= ?none -> no;
      true ->
        S = t_opaque_structure(O),
        {yes, t_sup([A,B,F,I,L,N,T,M,S,Map])}
    end.
  
  -spec is_opaque_type(erl_type(), [erl_type()]) -> boolean().
  