| ⊦ (allReadsOK(gs.h) ∧ allWritesOK(gs.h) ∧ gs.vm = ∅ ⊕ gs.h ∧ gs.pm = ∅ ⊕ (gs.h | true)) ∧ pre(gs, ls, invRead, a) ∧ pcstepf(gs, ls, invRead, a) = resRead → allReadsOK(gstepf(gs, ls, invRead, a).h) ∧ allWritesOK(gstepf(gs, ls, invRead, a).h) ∧ gstepf(gs, ls, invRead, a).vm = ∅ ⊕ gstepf(gs, ls, invRead, a).h ∧ gstepf(gs, ls, invRead, a).pm = ∅ ⊕ (gstepf(gs, ls, invRead, a).h | true) |
gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, pcstepf(gs, ls, invRead, a) = resRead, allReadsOK(gs.h), allWritesOK(gs.h), pre(gs, ls, invRead, a) ⊦ allReadsOK(gstepf(gs, ls, invRead, a).h) ∧ allWritesOK(gstepf(gs, ls, invRead, a).h) ∧ gstepf(gs, ls, invRead, a).vm = ∅ ⊕ gstepf(gs, ls, invRead, a).h ∧ gstepf(gs, ls, invRead, a).pm = ∅ ⊕ (gstepf(gs, ls, invRead, a).h | true)
| gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, pcstepf(gs, ls, invRead, a) = resRead, allReadsOK(gs.h), allWritesOK(gs.h), pre(gs, ls, invRead, a) ⊦ allReadsOK(gstepf(gs, ls, invRead, a).h) ∧ allWritesOK(gstepf(gs, ls, invRead, a).h) ∧ gstepf(gs, ls, invRead, a).vm = ∅ ⊕ gstepf(gs, ls, invRead, a).h ∧ gstepf(gs, ls, invRead, a).pm = ∅ ⊕ (gstepf(gs, ls, invRead, a).h | true) |
gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, allReadsOK(gs.h), allWritesOK(gs.h) ⊦ allReadsOK(gs.h + (R(ls.t, ls.il, gs.vm(ls.il)), gs.h.lastPersistedOrElse(ls.il, true)) ') ∧ gs.pm = ∅ ⊕ ((gs.h | true) + (gs.h.lastPersistedOrElse(ls.il, true) ⊃ (R(ls.t, ls.il, gs.vm(ls.il)), true) ';[]))
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (e, b) ' | b0 = (b ↔ b0 ⊃ (e, b) ';[]); (s) ⊦ h + h0 | b = (h | b) + (h0 | b); (s) ⊦ (gs.h:= h).h = h; (s) ⊦ x + a = x + a '; (s) ⊦ ls.t = t → gstepf(gs, ls, invRead, ADoRead(t)) = gs .h:= (gs.h + (R(ls.t, ls.il, gs.vm(ls.il)), gs.h.lastPersistedOrElse(ls.il, true))); (s) ⊦ (gs.h:= h).pm = gs.pm; (s) ⊦ mem ⊕ (h + (R(t, l, v), b) ') = mem ⊕ h; (s) ⊦ (gs.h:= h).vm = gs.vm; (s) ⊦ allWritesOK(h) → allWritesOK(h + (R(t, l, v), b) '); (ss) ⊦ ls.t = t → pcstepf(gs, ls, invRead, ADoRead(t)) = resRead; (s) ⊦ pre(gs, ls, invRead, a) ↔ a = ADoRead(ls.t); (s)
| gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, allReadsOK(gs.h), allWritesOK(gs.h) ⊦ allReadsOK(gs.h + (R(ls.t, ls.il, gs.vm(ls.il)), gs.h.lastPersistedOrElse(ls.il, true)) ') ∧ gs.pm = ∅ ⊕ ((gs.h | true) + (gs.h.lastPersistedOrElse(ls.il, true) ⊃ (R(ls.t, ls.il, gs.vm(ls.il)), true) ';[])) |
gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, allReadsOK(gs.h), allWritesOK(gs.h) ⊦ allReadsOK(gs.h + (R(ls.t, ls.il, ((∅ ⊕ gs.h))(ls.il)), gs.h.lastPersistedOrElse(ls.il, true)) ') ∧ gs.pm = ∅ ⊕ ((gs.h | true) + (gs.h.lastPersistedOrElse(ls.il, true) ⊃ (R(ls.t, ls.il, ((∅ ⊕ gs.h))(ls.il)), true) ';[]))
| gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, allReadsOK(gs.h), allWritesOK(gs.h) ⊦ allReadsOK(gs.h + (R(ls.t, ls.il, ((∅ ⊕ gs.h))(ls.il)), gs.h.lastPersistedOrElse(ls.il, true)) ') ∧ gs.pm = ∅ ⊕ ((gs.h | true) + (gs.h.lastPersistedOrElse(ls.il, true) ⊃ (R(ls.t, ls.il, ((∅ ⊕ gs.h))(ls.il)), true) ';[])) |
⊦ allReadsOK(h) → allReadsOK(h + (R(t, l, ((∅ ⊕ h))(l)), h.lastPersistedOrElse(l, true)) ')
gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, allReadsOK(gs.h), allWritesOK(gs.h), allReadsOK(gs.h) → allReadsOK(gs.h + (R(ls.t, ls.il, ((∅ ⊕ gs.h))(ls.il)), gs.h.lastPersistedOrElse(ls.il, true)) ') ⊦ allReadsOK(gs.h + (R(ls.t, ls.il, ((∅ ⊕ gs.h))(ls.il)), gs.h.lastPersistedOrElse(ls.il, true)) ') ∧ gs.pm = ∅ ⊕ ((gs.h | true) + (gs.h.lastPersistedOrElse(ls.il, true) ⊃ (R(ls.t, ls.il, ((∅ ⊕ gs.h))(ls.il)), true) ';[]))
Used terms: gs.h, ls.t, ls.il
| ⊦ allReadsOK(h) → allReadsOK(h + (R(t, l, ((∅ ⊕ h))(l)), h.lastPersistedOrElse(l, true)) ') |
| gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, allReadsOK(gs.h), allWritesOK(gs.h), allReadsOK(gs.h) → allReadsOK(gs.h + (R(ls.t, ls.il, ((∅ ⊕ gs.h))(ls.il)), gs.h.lastPersistedOrElse(ls.il, true)) ') ⊦ allReadsOK(gs.h + (R(ls.t, ls.il, ((∅ ⊕ gs.h))(ls.il)), gs.h.lastPersistedOrElse(ls.il, true)) ') ∧ gs.pm = ∅ ⊕ ((gs.h | true) + (gs.h.lastPersistedOrElse(ls.il, true) ⊃ (R(ls.t, ls.il, ((∅ ⊕ gs.h))(ls.il)), true) ';[])) |
gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, gs.pm ≠ ∅ ⊕ ((gs.h | true) + (gs.h.lastPersistedOrElse(ls.il, true) ⊃ (R(ls.t, ls.il, gs.vm(ls.il)), true) ';[])), allReadsOK(gs.h), allReadsOK(gs.h + (R(ls.t, ls.il, gs.vm(ls.il)), gs.h.lastPersistedOrElse(ls.il, true)) '), allWritesOK(gs.h) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ allReadsOK(h) → allReadsOK(h + (R(t, l, ((∅ ⊕ h))(l)), h.lastPersistedOrElse(l, true)) '); (ss)
| gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, gs.pm ≠ ∅ ⊕ ((gs.h | true) + (gs.h.lastPersistedOrElse(ls.il, true) ⊃ (R(ls.t, ls.il, gs.vm(ls.il)), true) ';[])), allReadsOK(gs.h), allReadsOK(gs.h + (R(ls.t, ls.il, gs.vm(ls.il)), gs.h.lastPersistedOrElse(ls.il, true)) '), allWritesOK(gs.h) ⊦ |
Used simplifier rules: ⊦ x + [] = x; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ mem ⊕ (h + (R(t, l, v), b) ') = mem ⊕ h; (s) Used formulas: gs.h.lastPersistedOrElse(ls.il, true)
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.