anchor.diff:  t_subst_aux(?tuple_set(_) = TS, VarMap) ->
     t_sup([t_subst_aux(T, VarMap) || T <- t_tuple_subtypes(TS)]);
   t_subst_aux(?map(Pairs), VarMap) ->
  -erlang:display({?LINE,map,subst_aux,Pairs}),
     ?map([{t_subst_aux(K, VarMap), t_subst_aux(V, VarMap)} ||
            {K, V} <- Pairs]);
   t_subst_aux(?opaque(Es), VarMap) ->
  
positive.code: t_contains_opaque(?list(Type, Tail, _), Opaques) ->
    t_contains_opaque(Type, Opaques) orelse t_contains_opaque(Tail, Opaques);
  t_contains_opaque(?map(_) = Map, Opaques) ->
  erlang:display({?LINE,map,contains,Map}),
    list_contains_opaque(map_values(Map), Opaques) orelse
    list_contains_opaque(map_keys(Map), Opaques);
  t_contains_opaque(?matchstate(_P, _Slots), _Opaques) -> false;
  
negative.code: t_has_var(?tuple_set(_) = T) ->
    t_has_var_list(t_tuple_subtypes(T));
  t_has_var(?map(_)= Map) ->
    t_has_var_list(map_keys(Map)) orelse t_has_var_list(map_values(Map));
  t_has_var(?opaque(Set)) ->
    %% Assume variables in 'args' are also present i 'struct'
  