anchor.diff:    specialization_list(Elements1, sup_tuple_elements(List));
   is_specialization(?tuple_set(List1), ?tuple_set(List2)) ->
     try
  -    specialization_list(lists:append([T || {_Arity, T} <- List1]),
  -                        lists:append([T || {_Arity, T} <- List2]))
  +    specialization_list_list([sup_tuple_elements(T) || {_Arity, T} <- List1],
  +                             [sup_tuple_elements(T) || {_Arity, T} <- List2])
     catch _:_ -> false
     end;
   is_specialization(?union(List1)=T1, ?union(List2)=T2) ->
  
positive.code:   is_specialization(T1, t_opaque_structure(T2));
  is_specialization(?var(_), _) -> exit(error);
  is_specialization(_, ?var(_)) -> exit(error);
  is_specialization(T, T) -> true;
  is_specialization(?none, _) -> false;
  is_specialization(_, ?none) -> false;
  is_specialization(?unit, _) -> false;
  is_specialization(_, ?unit) -> false;
  is_specialization(#c{}, #c{}) -> false.
  
  specialization_list(L1, L2) ->
    length(L1) =:= length(L2) andalso specialization_list1(L1, L2).
  
negative.code: %% any(). For example, {_,_} is a specialization of any(), but not of
  %% tuple(). Does not handle variables, but any() and unions (sort of).
  
  is_specialization(T, T) -> true;
  is_specialization(_, ?any) -> true;
  is_specialization(?any, _) -> false;
  is_specialization(?function(Domain1, Range1), ?function(Domain2, Range2)) ->
  