Proving linearisability of lock-free algorithms