anchor.diff:  ets_do({insert_new, Tab, Item}) -> ets:insert_new(Tab, Item);
   ets_do({lookup, Tab, Key}) -> ets:lookup(Tab, Key);
   ets_do({lookup_element, Tab, Key, Pos}) -> ets:lookup_element(Tab, Key, Pos);
  +ets_do({member, Tab, Key}) -> ets:member(Tab, Key);
   ets_do({delete, Tab}) -> ets:delete(Tab);
  -ets_do({delete, Tab, Key}) -> ets:delete(Tab, Key).
  +ets_do({delete, Tab, Key}) -> ets:delete(Tab, Key);
  +ets_do({match_object, Tab, Pattern}) -> ets:match_object(Tab, Pattern);
  +ets_do({match_delete, Tab, Pattern}) -> ets:match_delete(Tab, Pattern);
  +ets_do({info, Tab}) -> [{P,ets:info(Tab,P)}
  +			|| P <- [name, type, size, named_table, keypos, protection]].
   
   
   %% ===========================================
  
positive.code: prop_same_ets_behaviour() ->
      ?FORALL(X, ets_program(),
  	    begin
  		timer:sleep(400),
  		Here = here(?MODULE, ets_behaviour_wrapper, [X]),
  		There = other(?MODULE, ets_behaviour_wrapper, [X]),
  		if Here /= There -> io:format("Diff: here=~p,\n     there=~p~n", [Here,There]); true -> ok end,
  
negative.code: ets_behaviour([]) -> [];
  ets_behaviour([Cmd | Rest]) ->
      try ets_do(Cmd) of
  	Res -> [{ok, Cmd, Res} | ets_behaviour(Rest)]
      catch A:B ->
  	    [{error, Cmd, A, B, [scrub(catch(lists:sort(ets:tab2list(T)))) || T <- [table1, table2]]} | ets_behaviour(Rest)]
      end.
  
  scrub({'EXIT', {R, ST}}) -> {'EXIT', {R, hd(ST)}}; % Interpreter stacktraces aren't to be relied upon.
  