anchor.diff:  %% Unification
   %%
   
  --spec t_unify(erl_type(), erl_type()) -> {erl_type(), [{_, erl_type()}]}.
  +-type t_unify_ret() :: {erl_type(), [{_, erl_type()}]}.
  +
  +-spec t_unify(erl_type(), erl_type()) -> t_unify_ret().
   
   t_unify(T1, T2) ->
     t_unify(T1, T2, []).
   
  --spec t_unify(erl_type(), erl_type(), [erl_type()]) -> {erl_type(), [{_, erl_type()}]}.
  +-spec t_unify(erl_type(), erl_type(), [erl_type()]) -> t_unify_ret().
   
   t_unify(T1, T2, Opaques) ->
     {T, Dict} = t_unify(T1, T2, dict:new(), Opaques),
  
positive.code: t_is_none_or_unit(_) -> false.
  
  %%-----------------------------------------------------------------------------
  %% Atoms and the derived type bool
  %%
  
  -spec t_atom() -> erl_type().
  
negative.code: 
  module_builtin_opaques(Module) ->
    [O || O <- all_opaque_builtins(), t_opaque_module(O) =:= Module].
  
  %%-----------------------------------------------------------------------------
  %% Remote types: these types are used for preprocessing;
  %% they should never reach the analysis stage.
  
  -spec t_remote(module(), atom(), [_]) -> erl_type().
  
  