  Rely/guarantee reasoning provides a compositional way of reasoning about
concurrency. The ABA problem occurs in many non-blocking concurrent data
structures, where a change made by a concurrent process may be undetected by
other processes. Guarantee conditions provide a useful mechanism for reasoning
about such changes, as is demonstrated by two non-blocking examples, the
Treiber stack and the Herlihy-Wing queue. The ABA problem can be identified by
the program making a step where the before and after states do not correspond
to a valid step at the sequential level. Therefore, such invalid behaviour
relates to a failure of the guarantee condition. As such behaviour is
non-linearisable, this suggests a strong relationship between refinement with
rely/guarantee and linearisability.
