anchor.diff:      bind_vars(Vs, Env, []).
   
   bind_vars([#c_var{name=X}|Vs], Env0, Xs)->
  -    bind_vars(Vs, dict:store(X, 0, Env0), [X|Xs]);
  +    bind_vars(Vs, Env0#{X=>0}, [X|Xs]);
   bind_vars([], Env,Xs) ->
       {Xs, Env}.
   
  
positive.code:     {Vs, Env}.
  
  visit_pat(Env0, #c_var{name=V}, Vs) ->
      {[V|Vs], dict:store(V, 0, Env0)};
  visit_pat(Env0, #c_tuple{es=Es}, Vs) ->
      visit_pats(Es, Env0, Vs);
  visit_pat(Env0, #c_map{es=Es}, Vs) ->
  
negative.code: 	case Sz of
  	    #c_var{name=V} ->
  		%% We don't tolerate free variables.
  		case Env0 of
  		    #{V:=N} ->
  			{Vs0, Env0#{V:=N+1}}
  		end;
  	    _ ->
  		visit_pat(Env0, Sz, Vs0)
  	end,
      visit_pat(Env1, Val, Vs1);
  visit_pat(Env0, #c_alias{pat=P,var=#c_var{name=V}}, Vs) ->
      visit_pat(Env0#{V=>0}, P, [V|Vs]);
  visit_pat(Env, #c_literal{}, Vs) ->
      {Vs, Env}.
  
  restore_vars([V|Vs], Env0, Env1) ->
      case Env0 of
  	#{V:=N} ->
  	    restore_vars(Vs, Env0, Env1#{V=>N});
  	_ ->
  	    restore_vars(Vs, Env0, maps:remove(V, Env1))
      end;
  restore_vars([], _, Env1) ->
      Env1.
  