| ⊦ (allReadsOK(gs.h) ∧ allWritesOK(gs.h) ∧ gs.vm = ∅ ⊕ gs.h ∧ gs.pm = ∅ ⊕ (gs.h | true)) ∧ PLIBLInv(gs, lsf(t), pcf(t)) ∧ firstVolWrite(l, gs.h) < # gs.h ∧ gs0 = (gs.pm:= gs.pm(l := gs.h[firstVolWrite(l, gs.h)]._1.v)) .h:= ( gs.h.take(firstVolWrite(l, gs.h)) + ((gs.h[firstVolWrite(l, gs.h)]._1, true) + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1)))) → allReadsOK(gs0.h) ∧ allWritesOK(gs0.h) ∧ gs0.vm = ∅ ⊕ gs0.h ∧ gs0.pm = ∅ ⊕ (gs0.h | true) |
gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, gs0 = (gs.pm:= gs.pm(l := gs.h[firstVolWrite(l, gs.h)]._1.v)) .h:= ( gs.h.take(firstVolWrite(l, gs.h)) + ((gs.h[firstVolWrite(l, gs.h)]._1, true) + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1)))), firstVolWrite(l, gs.h) < # gs.h, PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h) ⊦ allReadsOK(gs0.h) ∧ allWritesOK(gs0.h) ∧ gs0.vm = ∅ ⊕ gs0.h ∧ gs0.pm = ∅ ⊕ (gs0.h | true)
| gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, gs0 = (gs.pm:= gs.pm(l := gs.h[firstVolWrite(l, gs.h)]._1.v)) .h:= ( gs.h.take(firstVolWrite(l, gs.h)) + ((gs.h[firstVolWrite(l, gs.h)]._1, true) + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1)))), firstVolWrite(l, gs.h) < # gs.h, PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h) ⊦ allReadsOK(gs0.h) ∧ allWritesOK(gs0.h) ∧ gs0.vm = ∅ ⊕ gs0.h ∧ gs0.pm = ∅ ⊕ (gs0.h | true) |
gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, (gs.h |W | l) | false ≠ [], PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h) ⊦ allReadsOK (gs.h.take(firstVolWrite(l, gs.h)) + (gs.h[firstVolWrite(l, gs.h)]._1, true) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ∧ allWritesOK (gs.h.take(firstVolWrite(l, gs.h)) + (gs.h[firstVolWrite(l, gs.h)]._1, true) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ∧ gs.vm = ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) + (gs.h[firstVolWrite(l, gs.h)]._1, true) ') + gs.h.drop(firstVolWrite(l, gs.h) + 1)) ∧ gs.pm(l := gs.h[firstVolWrite(l, gs.h)]._1.v) = ∅ ⊕ (((gs.h.take(firstVolWrite(l, gs.h)) | true) + (gs.h[firstVolWrite(l, gs.h)]._1, true) ') + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true))
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ mem ⊕ (h1 + (persistDependentReads(l, h2) | true)) = mem ⊕ (h1 + (h2 | true)); (s) ⊦ (e, true) ' + h | true = (e, true) ' + (h | true); (s) ⊦ h + h0 | b = (h | b) + (h0 | b); (s) ⊦ (gs.h:= h).h = h; (s) ⊦ a + x = a ' + x; (s) ⊦ (gs.pm:= vm0).pm = vm0; (s) ⊦ (gs.h:= h).pm = gs.pm; (s) ⊦ mem ⊕ (h1 + persistDependentReads(l, h2)) = mem ⊕ (h1 + h2); (s) ⊦ (gs.pm:= vm0).vm = gs.vm; (s) ⊦ (gs.h:= h).vm = gs.vm; (s) ⊦ firstVolWrite(l, h) < # h ↔ (h |W | l) | false ≠ []; (s)
| gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, (gs.h |W | l) | false ≠ [], PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h) ⊦ allReadsOK (gs.h.take(firstVolWrite(l, gs.h)) + (gs.h[firstVolWrite(l, gs.h)]._1, true) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ∧ allWritesOK (gs.h.take(firstVolWrite(l, gs.h)) + (gs.h[firstVolWrite(l, gs.h)]._1, true) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ∧ gs.vm = ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) + (gs.h[firstVolWrite(l, gs.h)]._1, true) ') + gs.h.drop(firstVolWrite(l, gs.h) + 1)) ∧ gs.pm(l := gs.h[firstVolWrite(l, gs.h)]._1.v) = ∅ ⊕ (((gs.h.take(firstVolWrite(l, gs.h)) | true) + (gs.h[firstVolWrite(l, gs.h)]._1, true) ') + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)) |
gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, gs.h[firstVolWrite(l, gs.h)] = (e, boolvar), (gs.h |W | l) | false ≠ [], PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h) ⊦ allReadsOK(gs.h.take(firstVolWrite(l, gs.h)) + (e, true) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ∧ allWritesOK(gs.h.take(firstVolWrite(l, gs.h)) + (e, true) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ∧ gs.vm = ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) + (e, true) ') + gs.h.drop(firstVolWrite(l, gs.h) + 1)) ∧ gs.pm(l := e.v) = ∅ ⊕ (((gs.h.take(firstVolWrite(l, gs.h)) | true) + (e, true) ') + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true))
Used terms: e, boolvar
| gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, gs.h[firstVolWrite(l, gs.h)] = (e, boolvar), (gs.h |W | l) | false ≠ [], PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h) ⊦ allReadsOK(gs.h.take(firstVolWrite(l, gs.h)) + (e, true) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ∧ allWritesOK(gs.h.take(firstVolWrite(l, gs.h)) + (e, true) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ∧ gs.vm = ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) + (e, true) ') + gs.h.drop(firstVolWrite(l, gs.h) + 1)) ∧ gs.pm(l := e.v) = ∅ ⊕ (((gs.h.take(firstVolWrite(l, gs.h)) | true) + (e, true) ') + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)) |
⊦ firstVolWrite(l, h) < # h → (∃ t, v. h = h.take(firstVolWrite(l, h)) + ((W(t, l, v), false) + h.drop(firstVolWrite(l, h) + 1)))
gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, gs.h[firstVolWrite(l, gs.h)] = (e, boolvar), (gs.h |W | l) | false ≠ [], PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h), firstVolWrite(l, gs.h) < # gs.h → (∃ t, v. gs.h = gs.h.take(firstVolWrite(l, gs.h)) + ((W(t, l, v), false) + gs.h.drop(firstVolWrite(l, gs.h) + 1))) ⊦ allReadsOK(gs.h.take(firstVolWrite(l, gs.h)) + (e, true) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ∧ allWritesOK(gs.h.take(firstVolWrite(l, gs.h)) + (e, true) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ∧ gs.vm = ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) + (e, true) ') + gs.h.drop(firstVolWrite(l, gs.h) + 1)) ∧ gs.pm(l := e.v) = ∅ ⊕ (((gs.h.take(firstVolWrite(l, gs.h)) | true) + (e, true) ') + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true))
Used terms: l, gs.h
| ⊦ firstVolWrite(l, h) < # h → (∃ t, v. h = h.take(firstVolWrite(l, h)) + ((W(t, l, v), false) + h.drop(firstVolWrite(l, h) + 1))) |
| gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, gs.h[firstVolWrite(l, gs.h)] = (e, boolvar), (gs.h |W | l) | false ≠ [], PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h), firstVolWrite(l, gs.h) < # gs.h → (∃ t, v. gs.h = gs.h.take(firstVolWrite(l, gs.h)) + ((W(t, l, v), false) + gs.h.drop(firstVolWrite(l, gs.h) + 1))) ⊦ allReadsOK(gs.h.take(firstVolWrite(l, gs.h)) + (e, true) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ∧ allWritesOK(gs.h.take(firstVolWrite(l, gs.h)) + (e, true) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ∧ gs.vm = ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) + (e, true) ') + gs.h.drop(firstVolWrite(l, gs.h) + 1)) ∧ gs.pm(l := e.v) = ∅ ⊕ (((gs.h.take(firstVolWrite(l, gs.h)) | true) + (e, true) ') + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)) |
gs.h = gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1), gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, gs.h[firstVolWrite(l, gs.h)] = (e, boolvar), (gs.h |W | l) | false ≠ [], PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h) ⊦ allReadsOK(gs.h.take(firstVolWrite(l, gs.h)) + (e, true) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ∧ allWritesOK(gs.h.take(firstVolWrite(l, gs.h)) + (e, true) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ∧ gs.vm = ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) + (e, true) ') + gs.h.drop(firstVolWrite(l, gs.h) + 1)) ∧ gs.pm(l := e.v) = ∅ ⊕ (((gs.h.take(firstVolWrite(l, gs.h)) | true) + (e, true) ') + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true))
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a + x = a ' + x; (s) ⊦ firstVolWrite(l, h) < # h ↔ (h |W | l) | false ≠ []; (s)
| gs.h = gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1), gs.pm = ∅ ⊕ (gs.h | true), gs.vm = ∅ ⊕ gs.h, gs.h[firstVolWrite(l, gs.h)] = (e, boolvar), (gs.h |W | l) | false ≠ [], PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h) ⊦ allReadsOK(gs.h.take(firstVolWrite(l, gs.h)) + (e, true) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ∧ allWritesOK(gs.h.take(firstVolWrite(l, gs.h)) + (e, true) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ∧ gs.vm = ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) + (e, true) ') + gs.h.drop(firstVolWrite(l, gs.h) + 1)) ∧ gs.pm(l := e.v) = ∅ ⊕ (((gs.h.take(firstVolWrite(l, gs.h)) | true) + (e, true) ') + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)) |
gs.h = gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1), gs.pm = ∅ ⊕ (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) | true), gs.vm = ∅ ⊕ (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)), (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) )[firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) ] = (e, boolvar), ((gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1))|W | l) | false ≠ [], PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)), allWritesOK(gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) ⊦ allReadsOK ( (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).take (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) ) + (e, true) ' + persistDependentReads (l, (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).drop (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) + 1 ))) ∧ allWritesOK ( (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).take (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) ) + (e, true) ' + persistDependentReads (l, (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).drop (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) + 1 ))) ∧ gs.vm = ∅ ⊕ ( ( (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).take (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) ) + (e, true) ') + (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).drop (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) + 1 )) ∧ gs.pm(l := e.v) = ∅ ⊕ ( ( ( (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).take (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) ) | true) + (e, true) ') + ( (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).drop (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) + 1 ) | true))
| gs.h = gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1), gs.pm = ∅ ⊕ (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) | true), gs.vm = ∅ ⊕ (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)), (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) )[firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) ] = (e, boolvar), ((gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1))|W | l) | false ≠ [], PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)), allWritesOK(gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) ⊦ allReadsOK ( (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).take (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) ) + (e, true) ' + persistDependentReads (l, (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).drop (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) + 1 ))) ∧ allWritesOK ( (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).take (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) ) + (e, true) ' + persistDependentReads (l, (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).drop (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) + 1 ))) ∧ gs.vm = ∅ ⊕ ( ( (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).take (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) ) + (e, true) ') + (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).drop (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) + 1 )) ∧ gs.pm(l := e.v) = ∅ ⊕ ( ( ( (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).take (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) ) | true) + (e, true) ') + ( (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).drop (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) + 1 ) | true)) |
⊦ ¬ n < # x → (x + y)[n] = y[n - # x]
gs.h = gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1), gs.pm = ∅ ⊕ (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) | true), gs.vm = ∅ ⊕ (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)), ((W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) )[ firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) - # gs.h.take(firstVolWrite(l, gs.h)) ] = (e, boolvar), ((gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1))|W | l) | false ≠ [], PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)), allWritesOK(gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)), ¬ firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) < # gs.h.take(firstVolWrite(l, gs.h)) ⊦ allReadsOK ( (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).take (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) ) + (e, true) ' + persistDependentReads (l, (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).drop (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) + 1 ))) ∧ allWritesOK ( (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).take (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) ) + (e, true) ' + persistDependentReads (l, (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).drop (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) + 1 ))) ∧ gs.vm = ∅ ⊕ ( ( (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).take (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) ) + (e, true) ') + (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).drop (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) + 1 )) ∧ gs.pm(l := e.v) = ∅ ⊕ ( ( ( (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).take (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) ) | true) + (e, true) ') + ( (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).drop (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) + 1 ) | true))
Used simplifier rules: ⊦ n < # x → (x + y)[n] = x[n]; (s) ⊦ (e, false) ' + h | true = h | true; (s) ⊦ (h + h0)|W = h |W + h0 |W; (s) ⊦ ((W(t, l, v), b) ' + h)|W = (W(t, l, v), b) ' + h |W; (s) ⊦ h + h0 | l0 = (h | l0) + (h0 | l0); (s) ⊦ (W(t, l, v), b) ' + h | l = (W(t, l, v), b) ' + (h | l); (s) ⊦ h + h0 | b = (h | b) + (h0 | b); (s) ⊦ ((h.take(firstVolWrite(l, h)))|W | l) | false = []; (s) ⊦ (e, false) ' + h | false = (e, false) ' + (h | false); (s) ⊦ [] + x = x; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) ⊦ a ' ≠ []; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ # x.take(n) = n; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic ⊦ m < n → n ≠ 0; (s) ⊦ ¬ n < n; (s) Used terms: firstVolWrite (l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)), gs.h.take(firstVolWrite(l, gs.h)), (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)
| ⊦ ¬ n < # x → (x + y)[n] = y[n - # x] |
| gs.h = gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1), gs.pm = ∅ ⊕ (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) | true), gs.vm = ∅ ⊕ (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)), ((W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) )[ firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) - # gs.h.take(firstVolWrite(l, gs.h)) ] = (e, boolvar), ((gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1))|W | l) | false ≠ [], PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)), allWritesOK(gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)), ¬ firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) < # gs.h.take(firstVolWrite(l, gs.h)) ⊦ allReadsOK ( (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).take (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) ) + (e, true) ' + persistDependentReads (l, (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).drop (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) + 1 ))) ∧ allWritesOK ( (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).take (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) ) + (e, true) ' + persistDependentReads (l, (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).drop (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) + 1 ))) ∧ gs.vm = ∅ ⊕ ( ( (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).take (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) ) + (e, true) ') + (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).drop (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) + 1 )) ∧ gs.pm(l := e.v) = ∅ ⊕ ( ( ( (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).take (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) ) | true) + (e, true) ') + ( (gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1) ).drop (firstVolWrite(l, gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)) + 1 ) | true)) |
gs.h = gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1), gs.pm = ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)), gs.vm = ∅ ⊕ gs.h, PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h) ⊦ allReadsOK(gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), true) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ∧ allWritesOK(gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), true) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ∧ gs.pm(l := v) = ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (W(t0, l, v), false) ' + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true))
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ mem ⊕ (h1 + (W(t, l, v), true) ' + h2) = mem ⊕ (h1 + (W(t, l, v), false) ' + h2); (s) ⊦ W(t, l, v).v = v; (s) ⊦ m ≤ m; (s) ⊦ (a ' + x)[0] = a; (s) ⊦ m - m = 0; (s) ⊦ m < n ↔ ¬ n ≤ m; (ss) ⊦ # x.take(n) = n; (s) ⊦ a ' ≠ []; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) ⊦ [] + x = x; (s) ⊦ (e, false) ' + h | false = (e, false) ' + (h | false); (s) ⊦ ((h.take(firstVolWrite(l, h)))|W | l) | false = []; (s) ⊦ h + h0 | b = (h | b) + (h0 | b); (s) ⊦ (W(t, l, v), b) ' + h | l = (W(t, l, v), b) ' + (h | l); (s) ⊦ h + h0 | l0 = (h | l0) + (h0 | l0); (s) ⊦ ((W(t, l, v), b) ' + h)|W = (W(t, l, v), b) ' + h |W; (s) ⊦ (h + h0)|W = h |W + h0 |W; (s) ⊦ (e, false) ' + h | true = h | true; (s)
| gs.h = gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1), gs.pm = ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)), gs.vm = ∅ ⊕ gs.h, PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h) ⊦ allReadsOK(gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), true) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ∧ allWritesOK(gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), true) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ∧ gs.pm(l := v) = ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (W(t0, l, v), false) ' + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)) |
⊦ allReadsOK(h1 + (W(t, l, v), false) ' + h2) → allReadsOK(h1 + (W(t, l, v), true) ' + persistDependentReads(l, h2))
gs.h = gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1), gs.pm = ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)), gs.vm = ∅ ⊕ gs.h, PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allReadsOK(gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)), allWritesOK(gs.h) ⊦ true ∧ allWritesOK(gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), true) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ∧ gs.pm(l := v) = ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (W(t0, l, v), false) ' + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true))
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: v, gs.h.drop(firstVolWrite(l, gs.h) + 1), l, gs.h.take(firstVolWrite(l, gs.h)), t0
| ⊦ allReadsOK(h1 + (W(t, l, v), false) ' + h2) → allReadsOK(h1 + (W(t, l, v), true) ' + persistDependentReads(l, h2)) |
| gs.h = gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1), gs.pm = ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)), gs.vm = ∅ ⊕ gs.h, PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allReadsOK(gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1)), allWritesOK(gs.h) ⊦ true ∧ allWritesOK(gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), true) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ∧ gs.pm(l := v) = ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (W(t0, l, v), false) ' + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)) |
gs.h = gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1), gs.pm = ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)), gs.vm = ∅ ⊕ gs.h, PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h) ⊦ allWritesOK(gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), true) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ∧ gs.pm(l := v) = ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (W(t0, l, v), false) ' + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true))
| gs.h = gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1), gs.pm = ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)), gs.vm = ∅ ⊕ gs.h, PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h) ⊦ allWritesOK(gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), true) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ∧ gs.pm(l := v) = ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (W(t0, l, v), false) ' + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)) |
⊦ allWritesOK(h1 + (W(t, l, v), false) ' + h2) → (allWritesOK(h1 + (W(t, l, v), true) ' + h2) ↔ (h1 |W | l) | false = [])
gs.h = gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1), gs.pm = ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)), gs.vm = ∅ ⊕ gs.h, PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h), ¬ allWritesOK(gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ⊦ allWritesOK(gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), true) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ∧ gs.pm(l := v) = ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (W(t0, l, v), false) ' + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true))
gs.h = gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1), gs.pm = ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)), gs.vm = ∅ ⊕ gs.h, PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h), allWritesOK(gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ⊦ ((gs.h.take(firstVolWrite(l, gs.h)))|W | l) | false = [] ∧ gs.pm(l := v) = ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (W(t0, l, v), false) ' + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true))
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: v, persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1)), l, gs.h.take(firstVolWrite(l, gs.h)), t0
| ⊦ allWritesOK(h1 + (W(t, l, v), false) ' + h2) → (allWritesOK(h1 + (W(t, l, v), true) ' + h2) ↔ (h1 |W | l) | false = []) |
| gs.h = gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1), gs.pm = ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)), gs.vm = ∅ ⊕ gs.h, PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h), ¬ allWritesOK(gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ⊦ allWritesOK(gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), true) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ∧ gs.pm(l := v) = ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (W(t0, l, v), false) ' + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)) |
⊦ allWritesOK(h1 + h2) → allWritesOK(h1 + persistDependentReads(l, h2))
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ', l, gs.h.drop(firstVolWrite(l, gs.h) + 1)
| ⊦ allWritesOK(h1 + h2) → allWritesOK(h1 + persistDependentReads(l, h2)) |
| gs.h = gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1), gs.pm = ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)), gs.vm = ∅ ⊕ gs.h, PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h), allWritesOK(gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ⊦ ((gs.h.take(firstVolWrite(l, gs.h)))|W | l) | false = [] ∧ gs.pm(l := v) = ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (W(t0, l, v), false) ' + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)) |
gs.h = gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1), gs.pm = ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)), gs.vm = ∅ ⊕ gs.h, gs.pm(l := v) ≠ ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (W(t0, l, v), false) ' + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)), PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))), allWritesOK(gs.h) ⊦
Used simplifier rules: ⊦ ((h.take(firstVolWrite(l, h)))|W | l) | false = []; (s)
| gs.h = gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1), gs.pm = ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)), gs.vm = ∅ ⊕ gs.h, gs.pm(l := v) ≠ ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (W(t0, l, v), false) ' + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)), PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))), allWritesOK(gs.h) ⊦ |
gs.h = gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1), gs.vm = ∅ ⊕ gs.h, (∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)))(l := v) ≠ ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (W(t0, l, v), false) ' + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)), PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h), allWritesOK(gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ⊦
| gs.h = gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1), gs.vm = ∅ ⊕ gs.h, (∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)))(l := v) ≠ ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (W(t0, l, v), false) ' + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)), PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h), allWritesOK(gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))) ⊦ |
⊦ (h2 |W | l) | true = [] → mem ⊕ (h1 + (W(t, l, v), b) ' + (h2 | true)) = (mem ⊕ (h1 + (h2 | true)))(l := v)
gs.h = gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1), gs.vm = ∅ ⊕ gs.h, (∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)))(l := v) ≠ ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (W(t0, l, v), false) ' + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)), ((gs.h.drop(firstVolWrite(l, gs.h) + 1))|W | l) | true ≠ [], PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))), allWritesOK(gs.h) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: v, gs.h.drop(firstVolWrite(l, gs.h) + 1), false, ∅, l, gs.h.take(firstVolWrite(l, gs.h)) | true, t0
| ⊦ (h2 |W | l) | true = [] → mem ⊕ (h1 + (W(t, l, v), b) ' + (h2 | true)) = (mem ⊕ (h1 + (h2 | true)))(l := v) |
| gs.h = gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + gs.h.drop(firstVolWrite(l, gs.h) + 1), gs.vm = ∅ ⊕ gs.h, (∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)))(l := v) ≠ ∅ ⊕ ((gs.h.take(firstVolWrite(l, gs.h)) | true) + (W(t0, l, v), false) ' + (gs.h.drop(firstVolWrite(l, gs.h) + 1) | true)), ((gs.h.drop(firstVolWrite(l, gs.h) + 1))|W | l) | true ≠ [], PLIBLInv(gs, lsf(t), pcf(t)), allReadsOK(gs.h), allWritesOK(gs.h.take(firstVolWrite(l, gs.h)) + (W(t0, l, v), false) ' + persistDependentReads(l, gs.h.drop(firstVolWrite(l, gs.h) + 1))), allWritesOK(gs.h) ⊦ |
⊦ allWritesOK(h1 + (W(t, l, v), false) ' + h2) → (h2 |W | l) | true = []
Used terms: v, gs.h.drop(firstVolWrite(l, gs.h) + 1), l, gs.h.take(firstVolWrite(l, gs.h)), t0
| ⊦ allWritesOK(h1 + (W(t, l, v), false) ' + h2) → (h2 |W | l) | 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.