@[simp]
theorem
Rollback.rollback_redoable
{L : Type u_1}
(es : PES L)
{c : Conf es}
{e : es.Event}
(he : e ∈ ↑c)
:
Configuration.enables es (↑(rollbackFuture es c e)) e
Redoability: e is enabled in rollback(c,e) when e ∈ c.
theorem
Rollback.rollback_causal_safety
{L : Type u_1}
(es : PES L)
{c : Conf es}
{e x : es.Event}
:
x ∈ ↑(rollbackFuture es c e) → x ∉ es.future e
Causal safety: Rollback removes exactly the causal consequences of e.
theorem
Rollback.rollback_future
{L : Type u_1}
(es : PES L)
{c : Conf es}
{e : es.Event}
:
isRollback es.toFamily c e (rollbackFuture es c e)
The canonical rollback is a rollback for c and e.
theorem
Rollback.rollback_unique
{L : Type u_1}
(es : PES L)
{c : Conf es}
{e : es.Event}
{m₁ m₂ : Conf es}
(h₁ : isRollback es.toFamily c e m₁)
(h₂ : isRollback es.toFamily c e m₂)
:
Rollbacks are unique when they exist.
theorem
Rollback.rollback_maximum
{L : Type u_1}
(es : PES L)
{c : Conf es}
{e : es.Event}
{m : Conf es}
(h : isRollback es.toFamily c e m)
(m' : Conf es)
:
m' ∈ RollbackCandidates es.toFamily c e → ↑m' ⊆ ↑m
The rollback is the maximum element among rollback candidates.
theorem
Rollback.rollback_minimality
{L : Type u_1}
(es : PES L)
[DecidableEq es.Event]
{c : Conf es}
{e : es.Event}
{c' : Conf es}
(_hredo : Configuration.enables es (↑c') e)
(hsafe : ∀ x ∈ ↑c', x ∉ es.future e)
(p' : Path es.toFamily c' c)
:
Any path from a redo candidate c' to c is at least as long as the
number of events of c causally after e.