abstract rewriting