anchor.diff:      UVt = map(fun ({V,{State,_,Ls}}) -> {V,{State,used,Ls}} end, U),
       {vtmerge(Vt, UVt), St1}.
   
  +
  +is_var_bound(V, Vt) ->
  +    case orddict:find(V, Vt) of
  +        {ok,{bound,_Usage,_}} -> true;
  +        _ -> false
  +    end.
  +
  +
   %% vtupdate(UpdVarTable, VarTable) -> VarTable.
   %%  Add the variables in the updated vartable to VarTable. The variables
   %%  will be updated with their property in UpdVarTable. The state of
  
positive.code:                   {vtmerge_pat(Pvt, Psvt),vtmerge_pat(Bvt,Bvt1),St1}
            end, {[],[],St}, Ps).
  
  %% reject_bin_alias(Pat, Expr, St) -> St'
  %%  Reject aliases for binary patterns at the top level.
  
  reject_bin_alias_expr({bin,_,_}=P, {match,_,P0,E}, St0) ->
      St = reject_bin_alias(P, P0, St0),
      reject_bin_alias_expr(P, E, St);
  reject_bin_alias_expr({match,_,_,_}=P, {match,_,P0,E}, St0) ->
      St = reject_bin_alias(P, P0, St0),
      reject_bin_alias_expr(P, E, St);
  reject_bin_alias_expr(_, _, St) -> St.
  
  
  %% reject_bin_alias(Pat1, Pat2, St) -> St'
  %%  Aliases of binary patterns, such as <<A:8>> = <<B:4,C:4>> or even
  %%  <<A:8>> = <<A:8>>, are not allowed. Traverse the patterns in parallel
  %%  and generate an error if any binary aliases are found.
  %%    We generate an error even if is obvious that the overall pattern can't
  %%  possibly match, for instance, {a,<<A:8>>,c}={x,<<A:8>>} WILL generate an
  %%  error.
  
  reject_bin_alias({bin,Line,_}, {bin,_,_}, St) ->
      add_error(Line, illegal_bin_pattern, St);
  reject_bin_alias({cons,_,H1,T1}, {cons,_,H2,T2}, St0) ->
      St = reject_bin_alias(H1, H2, St0),
      reject_bin_alias(T1, T2, St);
  reject_bin_alias({tuple,_,Es1}, {tuple,_,Es2}, St) ->
      reject_bin_alias_list(Es1, Es2, St);
  reject_bin_alias({record,_,Name1,Pfs1}, {record,_,Name2,Pfs2},
                   #lint{records=Recs}=St) ->
      case {dict:find(Name1, Recs),dict:find(Name2, Recs)} of
          {{ok,{_Line1,Fields1}},{ok,{_Line2,Fields2}}} ->
  	    reject_bin_alias_rec(Pfs1, Pfs2, Fields1, Fields2, St);
          {_,_} ->
  	    %% One or more non-existing records. (An error messages has
  	    %% already been generated, so we are done here.)
  	    St
      end;
  reject_bin_alias({match,_,P1,P2}, P, St0) ->
      St = reject_bin_alias(P1, P, St0),
      reject_bin_alias(P2, P, St);
  reject_bin_alias(P, {match,_,_,_}=M, St) ->
      reject_bin_alias(M, P, St);
  reject_bin_alias(_P1, _P2, St) -> St.
  
  reject_bin_alias_list([E1|Es1], [E2|Es2], St0) ->
      St = reject_bin_alias(E1, E2, St0),
      reject_bin_alias_list(Es1, Es2, St);
  reject_bin_alias_list(_, _, St) -> St.
  
  reject_bin_alias_rec(PfsA0, PfsB0, FieldsA0, FieldsB0, St) ->
      %% We treat records as if they have been converted to tuples.
      PfsA1 = rbia_field_vars(PfsA0),
      PfsB1 = rbia_field_vars(PfsB0),
  
negative.code: pattern({match,_Line,Pat1,Pat2}, Vt, Old, Bvt, St0) ->
      {Lvt,Bvt1,St1} = pattern(Pat1, Vt, Old, Bvt, St0),
      {Rvt,Bvt2,St2} = pattern(Pat2, Vt, Old, Bvt, St1),
      St3 = reject_invalid_alias(Pat1, Pat2, Vt, St2),
      {vtmerge_pat(Lvt, Rvt),vtmerge_pat(Bvt1,Bvt2),St3};
  %% Catch legal constant expressions, including unary +,-.
  pattern(Pat, _Vt, _Old, _Bvt, St) ->
  