Causal-consistent reversibility in a tuple-based language