| ⊦ (allReadsOK(gs.h) ∧ allWritesOK(gs.h) ∧ gs.vm = ∅ ⊕ gs.h ∧ gs.pm = ∅ ⊕ (gs.h | true)) ∧ PLIBLInv(gs, lsf(t), pcf(t)) → ⟪pm := gs.pm, vm := gs.vm, h := gs.h; ACrash(pm; vm, h, pcf); gs := (gs.vm:= vm).h:= h⟫ ((allReadsOK(gs.h) ∧ allWritesOK(gs.h) ∧ gs.vm = ∅ ⊕ gs.h ∧ gs.pm = ∅ ⊕ (gs.h | true)) ∧ PLIBLInv(gs, lsf(t), pcf(t))) |
gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h) ⊦ ⟪pm := gs.pm, vm := gs.vm, h := gs.h; ACrash(pm; vm, h, pcf); gs := (gs.vm:= vm).h:= h⟫ ((allReadsOK(gs.h) ∧ allWritesOK(gs.h) ∧ gs.vm = ∅ ⊕ gs.h ∧ gs.pm = ∅ ⊕ (gs.h | true)) ∧ PLIBLInv(gs, lsf(t), pcf(t)))
| gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h) ⊦ ⟪pm := gs.pm, vm := gs.vm, h := gs.h; ACrash(pm; vm, h, pcf); gs := (gs.vm:= vm).h:= h⟫ ((allReadsOK(gs.h) ∧ allWritesOK(gs.h) ∧ gs.vm = ∅ ⊕ gs.h ∧ gs.pm = ∅ ⊕ (gs.h | true)) ∧ PLIBLInv(gs, lsf(t), pcf(t))) |
gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, h = gs.h, pm = gs.pm, vm = gs.vm, PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h) ⊦ ⟪ACrash(pm; vm, h, pcf); gs := (gs.vm:= vm).h:= h⟫ ((allReadsOK(gs.h) ∧ allWritesOK(gs.h) ∧ gs.vm = ∅ ⊕ gs.h ∧ gs.pm = ∅ ⊕ (gs.h | true)) ∧ PLIBLInv(gs, lsf(t), pcf(t)))
| gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, h = gs.h, pm = gs.pm, vm = gs.vm, PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h) ⊦ ⟪ACrash(pm; vm, h, pcf); gs := (gs.vm:= vm).h:= h⟫ ((allReadsOK(gs.h) ∧ allWritesOK(gs.h) ∧ gs.vm = ∅ ⊕ gs.h ∧ gs.pm = ∅ ⊕ (gs.h | true)) ∧ PLIBLInv(gs, lsf(t), pcf(t))) |
gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, h = gs.h, vm = gs.vm, PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h) ⊦ ⟪ACrash(gs.pm; vm, h, pcf); gs := (gs.vm:= vm).h:= h⟫ (allReadsOK(gs.h) ∧ allWritesOK(gs.h) ∧ gs.vm = ∅ ⊕ gs.h ∧ gs.pm = ∅ ⊕ (gs.h | true) ∧ PLIBLInv(gs, lsf(t), pcf(t)))
| gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, h = gs.h, vm = gs.vm, PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h) ⊦ ⟪ACrash(gs.pm; vm, h, pcf); gs := (gs.vm:= vm).h:= h⟫ (allReadsOK(gs.h) ∧ allWritesOK(gs.h) ∧ gs.vm = ∅ ⊕ gs.h ∧ gs.pm = ∅ ⊕ (gs.h | true) ∧ PLIBLInv(gs, lsf(t), pcf(t))) |
gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, h = gs.h, pm = gs.pm, vm = gs.vm, PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h) ⊦ ⟪pcf := λ t. (pcf(t) = idle ⊃ idle;crashed), vm := pm, h := h | true; gs := (gs.vm:= vm).h:= h⟫ (allReadsOK(gs.h) ∧ allWritesOK(gs.h) ∧ gs.vm = ∅ ⊕ gs.h ∧ gs.pm = ∅ ⊕ (gs.h | true) ∧ PLIBLInv(gs, lsf(t), pcf(t)))
Used simplifier rules: decl: ACrash(pm; vm, h, pcf) {pcf := λ t. (pcf(t) = idle ⊃ idle;crashed), vm := pm, h := h | true};
| gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, h = gs.h, pm = gs.pm, vm = gs.vm, PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h) ⊦ ⟪pcf := λ t. (pcf(t) = idle ⊃ idle;crashed), vm := pm, h := h | true; gs := (gs.vm:= vm).h:= h⟫ (allReadsOK(gs.h) ∧ allWritesOK(gs.h) ∧ gs.vm = ∅ ⊕ gs.h ∧ gs.pm = ∅ ⊕ (gs.h | true) ∧ PLIBLInv(gs, lsf(t), pcf(t))) |
gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, h = gs.h, pm = gs.pm, vm = gs.vm, PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h) ⊦ ⟪gs := (gs.vm:= pm).h:= (h | true)⟫ (allReadsOK(gs.h) ∧ allWritesOK(gs.h) ∧ gs.vm = ∅ ⊕ gs.h ∧ gs.pm = ∅ ⊕ (gs.h | true) ∧ PLIBLInv(gs, lsf(t), (pcf(t) = idle ⊃ idle;crashed)))
| gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, h = gs.h, pm = gs.pm, vm = gs.vm, PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h) ⊦ ⟪gs := (gs.vm:= pm).h:= (h | true)⟫ (allReadsOK(gs.h) ∧ allWritesOK(gs.h) ∧ gs.vm = ∅ ⊕ gs.h ∧ gs.pm = ∅ ⊕ (gs.h | true) ∧ PLIBLInv(gs, lsf(t), (pcf(t) = idle ⊃ idle;crashed))) |
gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, h = gs.h, pm = gs.pm, vm = gs.vm, PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h) ⊦ allReadsOK(((gs.vm:= pm).h:= (h | true)).h) ∧ allWritesOK(((gs.vm:= pm).h:= (h | true)).h) ∧ ((gs.vm:= pm).h:= (h | true)).vm = ∅ ⊕ ((gs.vm:= pm).h:= (h | true)).h ∧ ((gs.vm:= pm).h:= (h | true)).pm = ∅ ⊕ (((gs.vm:= pm).h:= (h | true)).h | true) ∧ PLIBLInv((gs.vm:= pm).h:= (h | true), lsf(t), (pcf(t) = idle ⊃ idle;crashed))
| gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, h = gs.h, pm = gs.pm, vm = gs.vm, PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h) ⊦ allReadsOK(((gs.vm:= pm).h:= (h | true)).h) ∧ allWritesOK(((gs.vm:= pm).h:= (h | true)).h) ∧ ((gs.vm:= pm).h:= (h | true)).vm = ∅ ⊕ ((gs.vm:= pm).h:= (h | true)).h ∧ ((gs.vm:= pm).h:= (h | true)).pm = ∅ ⊕ (((gs.vm:= pm).h:= (h | true)).h | true) ∧ PLIBLInv((gs.vm:= pm).h:= (h | true), lsf(t), (pcf(t) = idle ⊃ idle;crashed)) |
gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h), ¬ PLIBLInv((gs.vm:= gs.pm).h:= (gs.h | true), lsf(t), (pcf(t) = idle ⊃ idle;crashed)) ⊦
Used simplifier rules: ⊦ h | b | b = h | b; (s) ⊦ (gs.h:= h).h = h; (s) ⊦ (gs.vm:= vm).pm = gs.pm; (s) ⊦ (gs.h:= h).pm = gs.pm; (s) ⊦ (gs.vm:= vm).vm = vm; (s) ⊦ (gs.h:= h).vm = gs.vm; (s) ⊦ allWritesOK(h) → allWritesOK(h | true); (ss) ⊦ allReadsOK(h) → allReadsOK(h | true); (ss)
| gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h), ¬ PLIBLInv((gs.vm:= gs.pm).h:= (gs.h | true), lsf(t), (pcf(t) = idle ⊃ idle;crashed)) ⊦ |
⊦ PLIBLInv(gs, ls, pc) ↔ pc = resWrite → (gs.h | ls.t) | false = [] ∨ (gs.h | ls.t) | false = (W(ls.t, ls.il, ls.iv), false) '
Used simplifier rules: ⊦ idle ≠ resWrite; (s) ⊦ crashed ≠ resWrite; (s) Used terms: (gs.vm:= gs.pm).h:= (gs.h | true), lsf(t), (pcf(t) = idle ⊃ idle;crashed)
| ⊦ PLIBLInv(gs, ls, pc) ↔ pc = resWrite → (gs.h | ls.t) | false = [] ∨ (gs.h | ls.t) | false = (W(ls.t, ls.il, ls.iv), false) ' |
The following image shows the proof tree of sequent calculus. The proved goal is at the bottom. You can click on the nodes to view additional rules. See here for details on colors in a proof tree.