anchor.diff:         {{a,b,2},
           [{['$1','$1'],[],[{exception_trace},{message,{process_dump}}]}],
           [local]}}
  +     ,{"x:y(A,[A,B,C])when A==B,is_atom(C)",
  +       {{x,y,2},
  +        [{['$1',['$1','$3','$2']],
  +          [{'==','$1','$3'},{is_atom,'$2'}],
  +          []}],
  +        [local]}}
  +     ,{"x:y([A,B,C])when A=/=B,is_atom(C)",
  +       {{x,y,1},
  +        [{[['$3','$2','$1']],[{'=/=','$3','$2'},{is_atom,'$1'}],[]}],
  +        [local]}}
  +     ,{"a:b([A,B,T])when B==T",
  +       {{a,b,1},
  +        [{[['$3','$2','$1']],[{'==','$2','$1'}],[]}],
  +        [local]}}
       ]).
   
   
  
positive.code: arg({T,1,Var})      -> {T,Var}.
  
  arg_list({cons,_,H,T}) -> [arg(H)|arg_list(T)];
  arg_list({nil,_})      -> [].
  %% non-proper list should be handled here.
  
  actions_fun(Str) ->
    fun() ->
  
negative.code:   {Vars,O++[Val]}.
  
  ca_fun_list(Es,Vars) ->
    cfl(lists:reverse(Es),{Vars,[]}).
  
  cfl([],O) -> O;
  cfl([E|Es],{V0,P0}) when is_list(Es) ->
    {V,P}=ca_fun(E,{V0,[]}),
    cfl(Es,{lists:usort(V0++V),P++P0});
  cfl(A,B) ->
    %% non-proper list / tail match
    exit({nyi,A,B}).
  
  assert_type(Type,Val) ->
    case lists:member(Type,[integer,atom,string]) of
  