| FLITInv(gs, lsf, pcf), FLITInv(gs0, lsf0, pcf0), FLITPSCInv(ags, alsf, apcf), flitStep(mkstate(gs, lsf, pcf), globalPERSIST_FO(loc), mkstate(gs0, lsf0, pcf0)), abs(mkstate(gs, lsf, pcf), mkstate(ags, alsf, apcf)) ⊦ ∃ ags0, alsf0, apcf0. flitpscStep(mkstate(ags, alsf, apcf), globalPSCPERSIST_FO(loc), mkstate(ags0, alsf0, apcf0)) ∧ abs(mkstate(gs0, lsf0, pcf0), mkstate(ags0, alsf0, apcf0)) |
FLITInv(gs0, lsf0, pcf0), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), abs(mkstate(gs, lsf, pcf), mkstate(ags, alsf, apcf)), flitStep(mkstate(gs, lsf, pcf), globalPERSIST_FO(loc), mkstate(gs0, lsf0, pcf0)) ⊦ ∃ ags0, alsf0, apcf0. flitpscStep(mkstate(ags, alsf, apcf), globalPSCPERSIST_FO(loc), mkstate(ags0, alsf0, apcf0)) ∧ abs(mkstate(gs0, lsf0, pcf0), mkstate(ags0, alsf0, apcf0))
| FLITInv(gs0, lsf0, pcf0), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), abs(mkstate(gs, lsf, pcf), mkstate(ags, alsf, apcf)), flitStep(mkstate(gs, lsf, pcf), globalPERSIST_FO(loc), mkstate(gs0, lsf0, pcf0)) ⊦ ∃ ags0, alsf0, apcf0. flitpscStep(mkstate(ags, alsf, apcf), globalPSCPERSIST_FO(loc), mkstate(ags0, alsf0, apcf0)) ∧ abs(mkstate(gs0, lsf0, pcf0), mkstate(ags0, alsf0, apcf0)) |
ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, FLITInv(gs, lsf, pcf), FLITInv(gs0, lsf0, pcf0), FLITPSCInv(ags, alsf, apcf), flitStep(mkstate(gs, lsf, pcf), globalPERSIST_FO(loc), mkstate(gs0, lsf0, pcf0)), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs0.pmem ∧ ags0.ctr = gs0.fctr ∧ reorder(ags0.p, gs0.pq, gs0.rfo) ∧ ags0.writers = gs0.fwriters ∧ (∀ t. labs(gs0, lsf0(t), pcf0(t), ags0, alsf(t), apcf(t)))
Used simplifier rules: abs-def: ⊦ abs(mkstate(gs, lsf, pcf), mkstate(ags, alsf, apcf)) ↔ gabs(gs, lsf, pcf, ags, alsf, apcf) ∧ (∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t))); gabs-def: ⊦ gabs(gs, lsf, pcf, ags, alsf, apcf) ↔ ags.mem = gs.pmem ∧ ags.ctr = gs.fctr ∧ reorder(ags.p, gs.pq, gs.rfo) ∧ ags.writers = gs.fwriters; ⊦ globalPSCCRASH ≠ globalPSCPERSIST_FO(l); (s) ⊦ globalPSCPERSIST_FO(l) = globalPSCPERSIST_FO(l0) ↔ l = l0; (s) ⊦ globalPSCPERSIST_FO(l) ≠ globalPSCPERSIST_W(l0); (s) ⊦ ¬ pre(gs, ls, pc, globalPSCPERSIST_FO(l)); (s) ⊦ lstep(gs, ls, pc, a, gs0, ls0, pc0) ↔ pre(gs, ls, pc, a) ∧ ls0 = lstepf(gs, ls, pc, a) ∧ gs0 = gstepf(gs, ls, pc, a) ∧ pc0 = pcstepf(gs, ls, pc, a); (s) ⊦ flitpscStep(mkstate(gs, lsf, pcf), a, mkstate(gs0, lsf0, pcf0)) ↔ (∃ t, ls, pc. lstep(gs, lsf(t), pcf(t), a, gs0, ls, pc) ∧ lsf0 = lsf(t := ls) ∧ pcf0 = pcf(t := pc)) ∨ (∃ l. a = globalPSCPERSIST_W(l) ∧ firstPersistW(gs.p(l)) < # gs.p(l) ∧ gs0 = (gs.mem:= gs.mem(l := gs.p(l)[firstPersistW(gs.p(l))].val)) .p:= gs.p(l := gs.p(l) -p firstPersistW(gs.p(l))) ∧ lsf0 = lsf ∧ pcf0 = pcf) ∨ (∃ l. a = globalPSCPERSIST_FO(l) ∧ (∃ n. isPersistFO(n, gs.p(l)) ∧ gs0 = gs.p:= gs.p(l := gs.p(l) -p n)) ∧ lsf0 = lsf ∧ pcf0 = pcf) ∨ a = globalPSCCRASH ∧ gs0 = mkFLITPSCgs(gs.mem, λ l. [], λ l. 0, λ l. ∅, λ l. ∅) ∧ lsf0 = lsf ∧ pcf0 = (λ t. (pcf(t) = idle ⊃ idle;crashed)); (s)
| ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, FLITInv(gs, lsf, pcf), FLITInv(gs0, lsf0, pcf0), FLITPSCInv(ags, alsf, apcf), flitStep(mkstate(gs, lsf, pcf), globalPERSIST_FO(loc), mkstate(gs0, lsf0, pcf0)), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs0.pmem ∧ ags0.ctr = gs0.fctr ∧ reorder(ags0.p, gs0.pq, gs0.rfo) ∧ ags0.writers = gs0.fwriters ∧ (∀ t. labs(gs0, lsf0(t), pcf0(t), ags0, alsf(t), apcf(t))) |
⊦ flitStep(mkstate(gs, lsf, pcf), a, mkstate(gs0, lsf0, pcf0)) ↔ (∃ t, ls, pc. lstep(gs, lsf(t), pcf(t), a, gs0, ls, pc) ∧ lsf0 = lsf(t := ls) ∧ pcf0 = pcf(t := pc)) ∨ (∃ tid. a = doWrite(tid, gs.bq(tid).head.l, gs.bq(tid).head.v) ∧ (gs.bq(tid) ≠ [] ∧ gs.bq(tid).head.W?) ∧ gs0 = (gs.pq:= gs.pq(gs.bq(tid).head.l := gs.pq(gs.bq(tid).head.l) + W(gs.bq(tid).head.v, tid))).bq:= gs.bq(tid := gs.bq(tid).tail) ∧ lsf0 = lsf ∧ pcf0 = pcf) ∨ (∃ tid, l. a = (oneMember(tid, l, gs.fwriters) ⊃ doWriteFO(tid, l);propFO(tid, l)) ∧ (∃ n. n < # gs.bq(tid) ∧ isPropFO(n, l, gs.bq(tid))) ∧ ⟨fwriters := gs.fwriters, pq := gs.pq, bq := gs.bq, rfo := gs.rfo; PROP_FO(tid, l, fwriters; pq, bq, rfo); gs := ((gs.pq:= pq).bq:= bq).rfo:= rfo⟩ (gs0 = gs ∧ lsf0 = lsf ∧ pcf0 = pcf)) ∨ (∃ tid. a = propSF(tid) ∧ (gs.bq(tid) ≠ [] ∧ gs.bq(tid).head = SF ∧ (∀ l. ¬ FO(tid) ∈ gs.pq(l))) ∧ gs0 = gs.bq:= gs.bq(tid := gs.bq(tid).tail) ∧ lsf0 = lsf ∧ pcf0 = pcf) ∨ (∃ loc. a = globalPERSIST_W(loc) ∧ (gs.pq(loc) ≠ [] ∧ gs.pq(loc).head.W?) ∧ gs0 = (gs.pmem:= gs.pmem(loc := gs.pq(loc).head.val)).pq:= gs.pq(loc := gs.pq(loc).tail) ∧ lsf0 = lsf ∧ pcf0 = pcf) ∨ (∃ loc. a = globalPERSIST_FO(loc) ∧ (gs.pq(loc) ≠ [] ∧ gs.pq(loc).head.FO?) ∧ gs0 = gs.pq:= gs.pq(loc := gs.pq(loc).tail) ∧ lsf0 = lsf ∧ pcf0 = pcf) ∨ a = globalCRASH ∧ ⟨pq := gs.pq, fctr := gs.fctr, bq := gs.bq, fwriters := gs.fwriters, freaders := gs.freaders, rfo := gs.rfo; CRASH(; pq, fctr, bq, fwriters, freaders, rfo, pcf); gs := (((((gs.pq:= pq).fctr:= fctr).bq:= bq).fwriters:= fwriters).freaders:= freaders).rfo:= rfo⟩ (gs0 = gs ∧ lsf0 = lsf ∧ pcf0 = pcf)
(∃ t, ls, pc. lstep(gs, lsf(t), pcf(t), globalPERSIST_FO(loc), gs0, ls, pc) ∧ lsf0 = lsf(t := ls) ∧ pcf0 = pcf(t := pc)) ∨ (∃ tid. globalPERSIST_FO(loc) = doWrite(tid, gs.bq(tid).head.l, gs.bq(tid).head.v) ∧ (gs.bq(tid) ≠ [] ∧ gs.bq(tid).head.W?) ∧ gs0 = (gs.pq:= gs.pq(gs.bq(tid).head.l := gs.pq(gs.bq(tid).head.l) + W(gs.bq(tid).head.v, tid))).bq:= gs.bq(tid := gs.bq(tid).tail) ∧ lsf0 = lsf ∧ pcf0 = pcf) ∨ (∃ tid, l. globalPERSIST_FO(loc) = (oneMember(tid, l, gs.fwriters) ⊃ doWriteFO(tid, l);propFO(tid, l)) ∧ (∃ n. n < # gs.bq(tid) ∧ isPropFO(n, l, gs.bq(tid))) ∧ ⟨fwriters := gs.fwriters, pq := gs.pq, bq := gs.bq, rfo := gs.rfo; PROP_FO(tid, l, fwriters; pq, bq, rfo); gs := ((gs.pq:= pq).bq:= bq).rfo:= rfo⟩ (gs0 = gs ∧ lsf0 = lsf ∧ pcf0 = pcf)) ∨ (∃ tid. globalPERSIST_FO(loc) = propSF(tid) ∧ (gs.bq(tid) ≠ [] ∧ gs.bq(tid).head = SF ∧ (∀ l. ¬ FO(tid) ∈ gs.pq(l))) ∧ gs0 = gs.bq:= gs.bq(tid := gs.bq(tid).tail) ∧ lsf0 = lsf ∧ pcf0 = pcf) ∨ (∃ loc0. globalPERSIST_FO(loc) = globalPERSIST_W(loc0) ∧ (gs.pq(loc0) ≠ [] ∧ gs.pq(loc0).head.W?) ∧ gs0 = (gs.pmem:= gs.pmem(loc0 := gs.pq(loc0).head.val)).pq:= gs.pq(loc0 := gs.pq(loc0).tail) ∧ lsf0 = lsf ∧ pcf0 = pcf) ∨ (∃ loc0. globalPERSIST_FO(loc) = globalPERSIST_FO(loc0) ∧ (gs.pq(loc0) ≠ [] ∧ gs.pq(loc0).head.FO?) ∧ gs0 = gs.pq:= gs.pq(loc0 := gs.pq(loc0).tail) ∧ lsf0 = lsf ∧ pcf0 = pcf) ∨ globalPERSIST_FO(loc) = globalCRASH ∧ ⟨pq := gs.pq, fctr := gs.fctr, bq := gs.bq, fwriters := gs.fwriters, freaders := gs.freaders, rfo := gs.rfo; CRASH(; pq, fctr, bq, fwriters, freaders, rfo, pcf); gs := (((((gs.pq:= pq).fctr:= fctr).bq:= bq).fwriters:= fwriters).freaders:= freaders).rfo:= rfo⟩ (gs0 = gs ∧ lsf0 = lsf ∧ pcf0 = pcf), ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, FLITInv(gs0, lsf0, pcf0), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs0.pmem ∧ ags0.ctr = gs0.fctr ∧ reorder(ags0.p, gs0.pq, gs0.rfo) ∧ ags0.writers = gs0.fwriters ∧ (∀ t. labs(gs0, lsf0(t), pcf0(t), ags0, alsf(t), apcf(t)))
Used terms: pcf0, globalPERSIST_FO(loc), lsf, gs0, pcf, lsf0, gs
| ⊦ flitStep(mkstate(gs, lsf, pcf), a, mkstate(gs0, lsf0, pcf0)) ↔ (∃ t, ls, pc. lstep(gs, lsf(t), pcf(t), a, gs0, ls, pc) ∧ lsf0 = lsf(t := ls) ∧ pcf0 = pcf(t := pc)) ∨ (∃ tid. a = doWrite(tid, gs.bq(tid).head.l, gs.bq(tid).head.v) ∧ (gs.bq(tid) ≠ [] ∧ gs.bq(tid).head.W?) ∧ gs0 = (gs.pq:= gs.pq(gs.bq(tid).head.l := gs.pq(gs.bq(tid).head.l) + W(gs.bq(tid).head.v, tid))).bq:= gs.bq(tid := gs.bq(tid).tail) ∧ lsf0 = lsf ∧ pcf0 = pcf) ∨ (∃ tid, l. a = (oneMember(tid, l, gs.fwriters) ⊃ doWriteFO(tid, l);propFO(tid, l)) ∧ (∃ n. n < # gs.bq(tid) ∧ isPropFO(n, l, gs.bq(tid))) ∧ ⟨fwriters := gs.fwriters, pq := gs.pq, bq := gs.bq, rfo := gs.rfo; PROP_FO(tid, l, fwriters; pq, bq, rfo); gs := ((gs.pq:= pq).bq:= bq).rfo:= rfo⟩ (gs0 = gs ∧ lsf0 = lsf ∧ pcf0 = pcf)) ∨ (∃ tid. a = propSF(tid) ∧ (gs.bq(tid) ≠ [] ∧ gs.bq(tid).head = SF ∧ (∀ l. ¬ FO(tid) ∈ gs.pq(l))) ∧ gs0 = gs.bq:= gs.bq(tid := gs.bq(tid).tail) ∧ lsf0 = lsf ∧ pcf0 = pcf) ∨ (∃ loc. a = globalPERSIST_W(loc) ∧ (gs.pq(loc) ≠ [] ∧ gs.pq(loc).head.W?) ∧ gs0 = (gs.pmem:= gs.pmem(loc := gs.pq(loc).head.val)).pq:= gs.pq(loc := gs.pq(loc).tail) ∧ lsf0 = lsf ∧ pcf0 = pcf) ∨ (∃ loc. a = globalPERSIST_FO(loc) ∧ (gs.pq(loc) ≠ [] ∧ gs.pq(loc).head.FO?) ∧ gs0 = gs.pq:= gs.pq(loc := gs.pq(loc).tail) ∧ lsf0 = lsf ∧ pcf0 = pcf) ∨ a = globalCRASH ∧ ⟨pq := gs.pq, fctr := gs.fctr, bq := gs.bq, fwriters := gs.fwriters, freaders := gs.freaders, rfo := gs.rfo; CRASH(; pq, fctr, bq, fwriters, freaders, rfo, pcf); gs := (((((gs.pq:= pq).fctr:= fctr).bq:= bq).fwriters:= fwriters).freaders:= freaders).rfo:= rfo⟩ (gs0 = gs ∧ lsf0 = lsf ∧ pcf0 = pcf) |
| (∃ t, ls, pc. lstep(gs, lsf(t), pcf(t), globalPERSIST_FO(loc), gs0, ls, pc) ∧ lsf0 = lsf(t := ls) ∧ pcf0 = pcf(t := pc)) ∨ (∃ tid. globalPERSIST_FO(loc) = doWrite(tid, gs.bq(tid).head.l, gs.bq(tid).head.v) ∧ (gs.bq(tid) ≠ [] ∧ gs.bq(tid).head.W?) ∧ gs0 = (gs.pq:= gs.pq(gs.bq(tid).head.l := gs.pq(gs.bq(tid).head.l) + W(gs.bq(tid).head.v, tid))).bq:= gs.bq(tid := gs.bq(tid).tail) ∧ lsf0 = lsf ∧ pcf0 = pcf) ∨ (∃ tid, l. globalPERSIST_FO(loc) = (oneMember(tid, l, gs.fwriters) ⊃ doWriteFO(tid, l);propFO(tid, l)) ∧ (∃ n. n < # gs.bq(tid) ∧ isPropFO(n, l, gs.bq(tid))) ∧ ⟨fwriters := gs.fwriters, pq := gs.pq, bq := gs.bq, rfo := gs.rfo; PROP_FO(tid, l, fwriters; pq, bq, rfo); gs := ((gs.pq:= pq).bq:= bq).rfo:= rfo⟩ (gs0 = gs ∧ lsf0 = lsf ∧ pcf0 = pcf)) ∨ (∃ tid. globalPERSIST_FO(loc) = propSF(tid) ∧ (gs.bq(tid) ≠ [] ∧ gs.bq(tid).head = SF ∧ (∀ l. ¬ FO(tid) ∈ gs.pq(l))) ∧ gs0 = gs.bq:= gs.bq(tid := gs.bq(tid).tail) ∧ lsf0 = lsf ∧ pcf0 = pcf) ∨ (∃ loc0. globalPERSIST_FO(loc) = globalPERSIST_W(loc0) ∧ (gs.pq(loc0) ≠ [] ∧ gs.pq(loc0).head.W?) ∧ gs0 = (gs.pmem:= gs.pmem(loc0 := gs.pq(loc0).head.val)).pq:= gs.pq(loc0 := gs.pq(loc0).tail) ∧ lsf0 = lsf ∧ pcf0 = pcf) ∨ (∃ loc0. globalPERSIST_FO(loc) = globalPERSIST_FO(loc0) ∧ (gs.pq(loc0) ≠ [] ∧ gs.pq(loc0).head.FO?) ∧ gs0 = gs.pq:= gs.pq(loc0 := gs.pq(loc0).tail) ∧ lsf0 = lsf ∧ pcf0 = pcf) ∨ globalPERSIST_FO(loc) = globalCRASH ∧ ⟨pq := gs.pq, fctr := gs.fctr, bq := gs.bq, fwriters := gs.fwriters, freaders := gs.freaders, rfo := gs.rfo; CRASH(; pq, fctr, bq, fwriters, freaders, rfo, pcf); gs := (((((gs.pq:= pq).fctr:= fctr).bq:= bq).fwriters:= fwriters).freaders:= freaders).rfo:= rfo⟩ (gs0 = gs ∧ lsf0 = lsf ∧ pcf0 = pcf), ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, FLITInv(gs0, lsf0, pcf0), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs0.pmem ∧ ags0.ctr = gs0.fctr ∧ reorder(ags0.p, gs0.pq, gs0.rfo) ∧ ags0.writers = gs0.fwriters ∧ (∀ t. labs(gs0, lsf0(t), pcf0(t), ags0, alsf(t), apcf(t))) |
globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)) ∧ n < # gs.bq(t) ∧ isPropFO(n, l, gs.bq(t)) ∧ ⟨fwriters := gs.fwriters, pq := gs.pq, bq := gs.bq, rfo := gs.rfo; PROP_FO(t, l, fwriters; pq, bq, rfo); gs := ((gs.pq:= pq).bq:= bq).rfo:= rfo⟩ (gs0 = gs ∧ lsf0 = lsf ∧ pcf0 = pcf) ∨ loc = loc0 ∧ gs.pq(loc0) ≠ [] ∧ gs.pq(loc0).head.FO? ∧ gs0 = gs.pq:= gs.pq(loc0 := gs.pq(loc0).tail) ∧ lsf0 = lsf ∧ pcf0 = pcf, ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, FLITInv(gs, lsf, pcf), FLITInv(gs0, lsf0, pcf0), FLITPSCInv(ags, alsf, apcf), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs0.pmem ∧ ags0.ctr = gs0.fctr ∧ reorder(ags0.p, gs0.pq, gs0.rfo) ∧ ags0.writers = gs0.fwriters ∧ (∀ t. labs(gs0, lsf0(t), pcf0(t), ags0, alsf(t), apcf(t)))
Used simplifier rules: ⊦ globalCRASH ≠ globalPERSIST_FO(loc); (s) ⊦ globalPERSIST_FO(loc) = globalPERSIST_FO(loc0) ↔ loc = loc0; (s) ⊦ globalPERSIST_FO(loc) ≠ globalPERSIST_W(loc0); (s) ⊦ globalPERSIST_FO(loc) ≠ propSF(t); (s) ⊦ doWrite(t, loc, v) ≠ globalPERSIST_FO(loc0); (s) ⊦ ¬ pre(gs, ls, pc, globalPERSIST_FO(l)); (s) ⊦ lstep(gs, ls, pc, a, gs0, ls0, pc0) ↔ pre(gs, ls, pc, a) ∧ ls0 = lstepf(gs, ls, pc, a) ∧ gs0 = gstepf(gs, ls, pc, a) ∧ pc0 = pcstepf(gs, ls, pc, a); (s)
| globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)) ∧ n < # gs.bq(t) ∧ isPropFO(n, l, gs.bq(t)) ∧ ⟨fwriters := gs.fwriters, pq := gs.pq, bq := gs.bq, rfo := gs.rfo; PROP_FO(t, l, fwriters; pq, bq, rfo); gs := ((gs.pq:= pq).bq:= bq).rfo:= rfo⟩ (gs0 = gs ∧ lsf0 = lsf ∧ pcf0 = pcf) ∨ loc = loc0 ∧ gs.pq(loc0) ≠ [] ∧ gs.pq(loc0).head.FO? ∧ gs0 = gs.pq:= gs.pq(loc0 := gs.pq(loc0).tail) ∧ lsf0 = lsf ∧ pcf0 = pcf, ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, FLITInv(gs, lsf, pcf), FLITInv(gs0, lsf0, pcf0), FLITPSCInv(ags, alsf, apcf), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs0.pmem ∧ ags0.ctr = gs0.fctr ∧ reorder(ags0.p, gs0.pq, gs0.rfo) ∧ ags0.writers = gs0.fwriters ∧ (∀ t. labs(gs0, lsf0(t), pcf0(t), ags0, alsf(t), apcf(t))) |
⟨fwriters := gs.fwriters, pq := gs.pq, bq := gs.bq, rfo := gs.rfo; PROP_FO(t, l, fwriters; pq, bq, rfo); gs := ((gs.pq:= pq).bq:= bq).rfo:= rfo⟩ (gs0 = gs ∧ lsf0 = lsf ∧ pcf0 = pcf), ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)), n < # gs.bq(t), FLITInv(gs0, lsf0, pcf0), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPropFO(n, l, gs.bq(t)), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs0.pmem ∧ ags0.ctr = gs0.fctr ∧ reorder(ags0.p, gs0.pq, gs0.rfo) ∧ ags0.writers = gs0.fwriters ∧ (∀ t. labs(gs0, lsf0(t), pcf0(t), ags0, alsf(t), apcf(t)))
ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, gs0 = gs.pq:= gs.pq(loc0 := gs.pq(loc0).tail), loc = loc0, lsf0 = lsf, pcf0 = pcf, gs.pq(loc0) ≠ [], gs.pq(loc0).head.FO?, FLITInv(gs0, lsf0, pcf0), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs0.pmem ∧ ags0.ctr = gs0.fctr ∧ reorder(ags0.p, gs0.pq, gs0.rfo) ∧ ags0.writers = gs0.fwriters ∧ (∀ t. labs(gs0, lsf0(t), pcf0(t), ags0, alsf(t), apcf(t)))
| ⟨fwriters := gs.fwriters, pq := gs.pq, bq := gs.bq, rfo := gs.rfo; PROP_FO(t, l, fwriters; pq, bq, rfo); gs := ((gs.pq:= pq).bq:= bq).rfo:= rfo⟩ (gs0 = gs ∧ lsf0 = lsf ∧ pcf0 = pcf), ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)), n < # gs.bq(t), FLITInv(gs0, lsf0, pcf0), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPropFO(n, l, gs.bq(t)), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs0.pmem ∧ ags0.ctr = gs0.fctr ∧ reorder(ags0.p, gs0.pq, gs0.rfo) ∧ ags0.writers = gs0.fwriters ∧ (∀ t. labs(gs0, lsf0(t), pcf0(t), ags0, alsf(t), apcf(t))) |
⟨fwriters := gs.fwriters, pq := gs.pq, bq := gs.bq, rfo := gs.rfo; PROP_FO(t, l, fwriters; pq, bq, rfo); gs := ((gs.pq:= pq).bq:= bq).rfo:= rfo⟩ (gs0 = gs ∧ lsf0 = lsf ∧ pcf0 = pcf), ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)), gs.bq(t) ≠ [], n < # gs.bq(t), FLITInv(gs0, lsf0, pcf0), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPropFO(n, l, gs.bq(t)), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs0.pmem ∧ ags0.ctr = gs0.fctr ∧ reorder(ags0.p, gs0.pq, gs0.rfo) ∧ ags0.writers = gs0.fwriters ∧ (∀ t. labs(gs0, lsf0(t), pcf0(t), ags0, alsf(t), apcf(t)))
Used simplifier rules: ⊦ # x = 0 ↔ x = []; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic
| ⟨fwriters := gs.fwriters, pq := gs.pq, bq := gs.bq, rfo := gs.rfo; PROP_FO(t, l, fwriters; pq, bq, rfo); gs := ((gs.pq:= pq).bq:= bq).rfo:= rfo⟩ (gs0 = gs ∧ lsf0 = lsf ∧ pcf0 = pcf), ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)), gs.bq(t) ≠ [], n < # gs.bq(t), FLITInv(gs0, lsf0, pcf0), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPropFO(n, l, gs.bq(t)), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs0.pmem ∧ ags0.ctr = gs0.fctr ∧ reorder(ags0.p, gs0.pq, gs0.rfo) ∧ ags0.writers = gs0.fwriters ∧ (∀ t. labs(gs0, lsf0(t), pcf0(t), ags0, alsf(t), apcf(t))) |
⟨PROP_FO(t, l, fwriters; pq, bq, rfo); gs := ((gs.pq:= pq).bq:= bq).rfo:= rfo⟩ (gs0 = gs ∧ lsf0 = lsf ∧ pcf0 = pcf), ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, bq = gs.bq, fwriters = gs.fwriters, globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)), pq = gs.pq, rfo = gs.rfo, gs.bq(t) ≠ [], n < # gs.bq(t), FLITInv(gs, lsf, pcf), FLITInv(gs0, lsf0, pcf0), FLITPSCInv(ags, alsf, apcf), isPropFO(n, l, gs.bq(t)), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs0.pmem ∧ ags0.ctr = gs0.fctr ∧ reorder(ags0.p, gs0.pq, gs0.rfo) ∧ ags0.writers = gs0.fwriters ∧ (∀ t. labs(gs0, lsf0(t), pcf0(t), ags0, alsf(t), apcf(t)))
| ⟨PROP_FO(t, l, fwriters; pq, bq, rfo); gs := ((gs.pq:= pq).bq:= bq).rfo:= rfo⟩ (gs0 = gs ∧ lsf0 = lsf ∧ pcf0 = pcf), ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, bq = gs.bq, fwriters = gs.fwriters, globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)), pq = gs.pq, rfo = gs.rfo, gs.bq(t) ≠ [], n < # gs.bq(t), FLITInv(gs, lsf, pcf), FLITInv(gs0, lsf0, pcf0), FLITPSCInv(ags, alsf, apcf), isPropFO(n, l, gs.bq(t)), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs0.pmem ∧ ags0.ctr = gs0.fctr ∧ reorder(ags0.p, gs0.pq, gs0.rfo) ∧ ags0.writers = gs0.fwriters ∧ (∀ t. labs(gs0, lsf0(t), pcf0(t), ags0, alsf(t), apcf(t))) |
⟨gs := ((gs.pq:= pq0).bq:= bq0).rfo:= rfo0⟩ (gs0 = gs ∧ lsf0 = lsf ∧ pcf0 = pcf), ⟨PROP_FO(t, l, fwriters; pq, bq, rfo)⟩ (pq = pq0 ∧ bq = bq0 ∧ rfo = rfo0), ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, bq = gs.bq, fwriters = gs.fwriters, globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)), pq = gs.pq, rfo = gs.rfo, gs.bq(t) ≠ [], n < # gs.bq(t), FLITInv(gs0, lsf0, pcf0), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPropFO(n, l, gs.bq(t)), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs0.pmem ∧ ags0.ctr = gs0.fctr ∧ reorder(ags0.p, gs0.pq, gs0.rfo) ∧ ags0.writers = gs0.fwriters ∧ (∀ t. labs(gs0, lsf0(t), pcf0(t), ags0, alsf(t), apcf(t)))
| ⟨gs := ((gs.pq:= pq0).bq:= bq0).rfo:= rfo0⟩ (gs0 = gs ∧ lsf0 = lsf ∧ pcf0 = pcf), ⟨PROP_FO(t, l, fwriters; pq, bq, rfo)⟩ (pq = pq0 ∧ bq = bq0 ∧ rfo = rfo0), ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, bq = gs.bq, fwriters = gs.fwriters, globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)), pq = gs.pq, rfo = gs.rfo, gs.bq(t) ≠ [], n < # gs.bq(t), FLITInv(gs0, lsf0, pcf0), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPropFO(n, l, gs.bq(t)), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs0.pmem ∧ ags0.ctr = gs0.fctr ∧ reorder(ags0.p, gs0.pq, gs0.rfo) ∧ ags0.writers = gs0.fwriters ∧ (∀ t. labs(gs0, lsf0(t), pcf0(t), ags0, alsf(t), apcf(t))) |
⟨PROP_FO(t, l, fwriters; pq, bq, rfo)⟩ (pq = pq0 ∧ bq = bq0 ∧ rfo = rfo0), ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, bq = gs.bq, fwriters = gs.fwriters, globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)), gs0 = ((gs.pq:= pq0).bq:= bq0).rfo:= rfo0, lsf0 = lsf, pcf0 = pcf, pq = gs.pq, rfo = gs.rfo, gs.bq(t) ≠ [], n < # gs.bq(t), FLITInv(gs, lsf, pcf), FLITInv(gs0, lsf0, pcf0), FLITPSCInv(ags, alsf, apcf), isPropFO(n, l, gs.bq(t)), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs0.pmem ∧ ags0.ctr = gs0.fctr ∧ reorder(ags0.p, gs0.pq, gs0.rfo) ∧ ags0.writers = gs0.fwriters ∧ (∀ t. labs(gs0, lsf0(t), pcf0(t), ags0, alsf(t), apcf(t)))
| ⟨PROP_FO(t, l, fwriters; pq, bq, rfo)⟩ (pq = pq0 ∧ bq = bq0 ∧ rfo = rfo0), ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, bq = gs.bq, fwriters = gs.fwriters, globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)), gs0 = ((gs.pq:= pq0).bq:= bq0).rfo:= rfo0, lsf0 = lsf, pcf0 = pcf, pq = gs.pq, rfo = gs.rfo, gs.bq(t) ≠ [], n < # gs.bq(t), FLITInv(gs, lsf, pcf), FLITInv(gs0, lsf0, pcf0), FLITPSCInv(ags, alsf, apcf), isPropFO(n, l, gs.bq(t)), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs0.pmem ∧ ags0.ctr = gs0.fctr ∧ reorder(ags0.p, gs0.pq, gs0.rfo) ∧ ags0.writers = gs0.fwriters ∧ (∀ t. labs(gs0, lsf0(t), pcf0(t), ags0, alsf(t), apcf(t))) |
⟨PROP_FO(t, l, gs.fwriters; pq, bq, rfo)⟩ (pq = pq0 ∧ bq = bq0 ∧ rfo = rfo0), ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, bq = gs.bq, globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)), pq = gs.pq, rfo = gs.rfo, gs.bq(t) ≠ [], n < # gs.bq(t), FLITInv(gs, lsf, pcf), FLITInv(((gs.pq:= pq0).bq:= bq0).rfo:= rfo0, lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPropFO(n, l, gs.bq(t)), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, pq0, rfo0) ∧ ags0.writers = gs.fwriters ∧ (∀ t. labs(((gs.pq:= pq0).bq:= bq0).rfo:= rfo0, lsf(t), pcf(t), ags0, alsf(t), apcf(t)))
Used simplifier rules: ⊦ (gs.pq:= pq).fwriters = gs.fwriters; (s) ⊦ (gs.bq:= bq).fwriters = gs.fwriters; (s) ⊦ (gs.rfo:= bq0).fwriters = gs.fwriters; (s) ⊦ (gs.rfo:= bq0).rfo = bq0; (s) ⊦ (gs.pq:= pq).pq = pq; (s) ⊦ (gs.bq:= bq).pq = gs.pq; (s) ⊦ (gs.rfo:= bq0).pq = gs.pq; (s) ⊦ (gs.pq:= pq).fctr = gs.fctr; (s) ⊦ (gs.bq:= bq).fctr = gs.fctr; (s) ⊦ (gs.rfo:= bq0).fctr = gs.fctr; (s) ⊦ (gs.pq:= pq).pmem = gs.pmem; (s) ⊦ (gs.bq:= bq).pmem = gs.pmem; (s) ⊦ (gs.rfo:= bq0).pmem = gs.pmem; (s)
| ⟨PROP_FO(t, l, gs.fwriters; pq, bq, rfo)⟩ (pq = pq0 ∧ bq = bq0 ∧ rfo = rfo0), ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, bq = gs.bq, globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)), pq = gs.pq, rfo = gs.rfo, gs.bq(t) ≠ [], n < # gs.bq(t), FLITInv(gs, lsf, pcf), FLITInv(((gs.pq:= pq0).bq:= bq0).rfo:= rfo0, lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPropFO(n, l, gs.bq(t)), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, pq0, rfo0) ∧ ags0.writers = gs.fwriters ∧ (∀ t. labs(((gs.pq:= pq0).bq:= bq0).rfo:= rfo0, lsf(t), pcf(t), ags0, alsf(t), apcf(t))) |
⟨choose n with n < # bq(tid) ∧ isPropFO(n, l, bq(tid)) in pq(l) := pq(l) + FO(tid), bq(tid) := bq(tid) -p n, rfo(tid) := (tid ∈ fwriters(l) ⊃ rfo(tid);rfo(tid) -p n) ifnone skip⟩ (pq = pq0 ∧ bq = bq0 ∧ rfo = rfo0), ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, bq = gs.bq, fwriters = gs.fwriters, globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)), pq = gs.pq, rfo = gs.rfo, tid = t, gs.bq(t) ≠ [], n < # gs.bq(t), FLITInv(((gs.pq:= pq0).bq:= bq0).rfo:= rfo0, lsf, pcf), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPropFO(n, l, gs.bq(t)), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, pq0, rfo0) ∧ ags0.writers = gs.fwriters ∧ (∀ t. labs(((gs.pq:= pq0).bq:= bq0).rfo:= rfo0, lsf(t), pcf(t), ags0, alsf(t), apcf(t)))
Used simplifier rules: decl: PROP_FO(tid, l, fwriters; pq, bq, rfo) {choose n with n < # bq(tid) ∧ isPropFO(n, l, bq(tid)) in pq(l) := pq(l) + FO(tid), bq(tid) := bq(tid) -p n, rfo(tid) := (tid ∈ fwriters(l) ⊃ rfo(tid);rfo(tid) -p n) ifnone skip };
| ⟨choose n with n < # bq(tid) ∧ isPropFO(n, l, bq(tid)) in pq(l) := pq(l) + FO(tid), bq(tid) := bq(tid) -p n, rfo(tid) := (tid ∈ fwriters(l) ⊃ rfo(tid);rfo(tid) -p n) ifnone skip⟩ (pq = pq0 ∧ bq = bq0 ∧ rfo = rfo0), ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, bq = gs.bq, fwriters = gs.fwriters, globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)), pq = gs.pq, rfo = gs.rfo, tid = t, gs.bq(t) ≠ [], n < # gs.bq(t), FLITInv(((gs.pq:= pq0).bq:= bq0).rfo:= rfo0, lsf, pcf), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPropFO(n, l, gs.bq(t)), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, pq0, rfo0) ∧ ags0.writers = gs.fwriters ∧ (∀ t. labs(((gs.pq:= pq0).bq:= bq0).rfo:= rfo0, lsf(t), pcf(t), ags0, alsf(t), apcf(t))) |
⟨pq(l) := pq(l) + FO(tid), bq(tid) := bq(tid) -p n, rfo(tid) := (tid ∈ fwriters(l) ⊃ rfo(tid);rfo(tid) -p n)⟩ (pq = pq0 ∧ bq = bq0 ∧ rfo = rfo0), ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, bq = gs.bq, fwriters = gs.fwriters, globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)), pq = gs.pq, rfo = gs.rfo, tid = t, gs.bq(t) ≠ [], n0 < # gs.bq(t), n < # bq(tid), FLITInv(gs, lsf, pcf), FLITInv(((gs.pq:= pq0).bq:= bq0).rfo:= rfo0, lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPropFO(n0, l, gs.bq(t)), isPropFO(n, l, bq(tid)), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, pq0, rfo0) ∧ ags0.writers = gs.fwriters ∧ (∀ t. labs(((gs.pq:= pq0).bq:= bq0).rfo:= rfo0, lsf(t), pcf(t), ags0, alsf(t), apcf(t)))
⟨skip⟩ (pq = pq0 ∧ bq = bq0 ∧ rfo = rfo0), ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, bq = gs.bq, fwriters = gs.fwriters, globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)), pq = gs.pq, rfo = gs.rfo, tid = t, gs.bq(t) ≠ [], n < # gs.bq(t), FLITInv(gs, lsf, pcf), FLITInv(((gs.pq:= pq0).bq:= bq0).rfo:= rfo0, lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPropFO(n, l, gs.bq(t)), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)), ∀ n. ¬(n < # bq(tid) ∧ isPropFO(n, l, bq(tid))) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, pq0, rfo0) ∧ ags0.writers = gs.fwriters ∧ (∀ t. labs(((gs.pq:= pq0).bq:= bq0).rfo:= rfo0, lsf(t), pcf(t), ags0, alsf(t), apcf(t)))
| ⟨pq(l) := pq(l) + FO(tid), bq(tid) := bq(tid) -p n, rfo(tid) := (tid ∈ fwriters(l) ⊃ rfo(tid);rfo(tid) -p n)⟩ (pq = pq0 ∧ bq = bq0 ∧ rfo = rfo0), ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, bq = gs.bq, fwriters = gs.fwriters, globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)), pq = gs.pq, rfo = gs.rfo, tid = t, gs.bq(t) ≠ [], n0 < # gs.bq(t), n < # bq(tid), FLITInv(gs, lsf, pcf), FLITInv(((gs.pq:= pq0).bq:= bq0).rfo:= rfo0, lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPropFO(n0, l, gs.bq(t)), isPropFO(n, l, bq(tid)), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, pq0, rfo0) ∧ ags0.writers = gs.fwriters ∧ (∀ t. labs(((gs.pq:= pq0).bq:= bq0).rfo:= rfo0, lsf(t), pcf(t), ags0, alsf(t), apcf(t))) |
pq(l := pq(l) + FO(tid)) = pq0, bq(tid := bq(tid) -p n) = bq0, rfo(tid := (tid ∈ fwriters(l) ⊃ rfo(tid);rfo(tid) -p n)) = rfo0, ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, bq = gs.bq, fwriters = gs.fwriters, globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)), pq = gs.pq, rfo = gs.rfo, tid = t, gs.bq(t) ≠ [], n < # bq(tid), n0 < # gs.bq(t), FLITInv(((gs.pq:= pq0).bq:= bq0).rfo:= rfo0, lsf, pcf), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPropFO(n, l, bq(tid)), isPropFO(n0, l, gs.bq(t)), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, pq0, rfo0) ∧ ags0.writers = gs.fwriters ∧ (∀ t. labs(((gs.pq:= pq0).bq:= bq0).rfo:= rfo0, lsf(t), pcf(t), ags0, alsf(t), apcf(t)))
| pq(l := pq(l) + FO(tid)) = pq0, bq(tid := bq(tid) -p n) = bq0, rfo(tid := (tid ∈ fwriters(l) ⊃ rfo(tid);rfo(tid) -p n)) = rfo0, ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, bq = gs.bq, fwriters = gs.fwriters, globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)), pq = gs.pq, rfo = gs.rfo, tid = t, gs.bq(t) ≠ [], n < # bq(tid), n0 < # gs.bq(t), FLITInv(((gs.pq:= pq0).bq:= bq0).rfo:= rfo0, lsf, pcf), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPropFO(n, l, bq(tid)), isPropFO(n0, l, gs.bq(t)), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, pq0, rfo0) ∧ ags0.writers = gs.fwriters ∧ (∀ t. labs(((gs.pq:= pq0).bq:= bq0).rfo:= rfo0, lsf(t), pcf(t), ags0, alsf(t), apcf(t))) |
ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)), gs.bq(t) ≠ [], n0 < # gs.bq(t), n < # gs.bq(t), FLITInv(gs, lsf, pcf), FLITInv (((gs.pq:= gs.pq(l := gs.pq(l) + FO(t) ')).bq:= gs.bq(t := gs.bq(t) -p n)).rfo:= gs.rfo(t := (t ∈ gs.fwriters(l) ⊃ gs.rfo(t);gs.rfo(t) -p n)), lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPropFO(n0, l, gs.bq(t)), isPropFO(n, l, gs.bq(t)), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, gs.pq(l := gs.pq(l) + FO(t) '), gs.rfo(t := (t ∈ gs.fwriters(l) ⊃ gs.rfo(t);gs.rfo(t) -p n))) ∧ ags0.writers = gs.fwriters ∧ (∀ t0. labs (((gs.pq:= gs.pq(l := gs.pq(l) + FO(t) ')).bq:= gs.bq(t := gs.bq(t) -p n)).rfo:= gs.rfo(t := (t ∈ gs.fwriters(l) ⊃ gs.rfo(t);gs.rfo(t) -p n)), lsf(t0), pcf(t0), ags0, alsf(t0), apcf(t0)))
Used simplifier rules: ⊦ x + a = x + a '; (s)
| ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)), gs.bq(t) ≠ [], n0 < # gs.bq(t), n < # gs.bq(t), FLITInv(gs, lsf, pcf), FLITInv (((gs.pq:= gs.pq(l := gs.pq(l) + FO(t) ')).bq:= gs.bq(t := gs.bq(t) -p n)).rfo:= gs.rfo(t := (t ∈ gs.fwriters(l) ⊃ gs.rfo(t);gs.rfo(t) -p n)), lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPropFO(n0, l, gs.bq(t)), isPropFO(n, l, gs.bq(t)), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, gs.pq(l := gs.pq(l) + FO(t) '), gs.rfo(t := (t ∈ gs.fwriters(l) ⊃ gs.rfo(t);gs.rfo(t) -p n))) ∧ ags0.writers = gs.fwriters ∧ (∀ t0. labs (((gs.pq:= gs.pq(l := gs.pq(l) + FO(t) ')).bq:= gs.bq(t := gs.bq(t) -p n)).rfo:= gs.rfo(t := (t ∈ gs.fwriters(l) ⊃ gs.rfo(t);gs.rfo(t) -p n)), lsf(t0), pcf(t0), ags0, alsf(t0), apcf(t0))) |
ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)), gs.bq(t) ≠ [], n < # gs.bq(t), n0 < # gs.bq(t), FLITInv (((gs.pq:= gs.pq(l := gs.pq(l) + FO(t) ')).bq:= gs.bq(t := gs.bq(t) -p n)).rfo:= gs.rfo(t := (t ∈ gs.fwriters(l) ⊃ gs.rfo(t);gs.rfo(t) -p n)), lsf, pcf), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPropFO(n, l, gs.bq(t)), isPropFO(n0, l, gs.bq(t)), reorder(ags.p, gs.pq, gs.rfo), t ∈ gs.fwriters(l), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, gs.pq(l := gs.pq(l) + FO(t) '), gs.rfo(t := (t ∈ gs.fwriters(l) ⊃ gs.rfo(t);gs.rfo(t) -p n))) ∧ ags0.writers = gs.fwriters ∧ (∀ t0. labs (((gs.pq:= gs.pq(l := gs.pq(l) + FO(t) ')).bq:= gs.bq(t := gs.bq(t) -p n)).rfo:= gs.rfo(t := (t ∈ gs.fwriters(l) ⊃ gs.rfo(t);gs.rfo(t) -p n)), lsf(t0), pcf(t0), ags0, alsf(t0), apcf(t0)))
Used simplifier rules: ⊦ oneMember(t, l, tsf) → (t ∈ tsf(l0) ↔ l = l0); (s) ⊦ globalPERSIST_FO(loc) ≠ propFO(t, loc0); (s) Used formulas: t ∈ gs.fwriters(l)
| ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)), gs.bq(t) ≠ [], n < # gs.bq(t), n0 < # gs.bq(t), FLITInv (((gs.pq:= gs.pq(l := gs.pq(l) + FO(t) ')).bq:= gs.bq(t := gs.bq(t) -p n)).rfo:= gs.rfo(t := (t ∈ gs.fwriters(l) ⊃ gs.rfo(t);gs.rfo(t) -p n)), lsf, pcf), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPropFO(n, l, gs.bq(t)), isPropFO(n0, l, gs.bq(t)), reorder(ags.p, gs.pq, gs.rfo), t ∈ gs.fwriters(l), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, gs.pq(l := gs.pq(l) + FO(t) '), gs.rfo(t := (t ∈ gs.fwriters(l) ⊃ gs.rfo(t);gs.rfo(t) -p n))) ∧ ags0.writers = gs.fwriters ∧ (∀ t0. labs (((gs.pq:= gs.pq(l := gs.pq(l) + FO(t) ')).bq:= gs.bq(t := gs.bq(t) -p n)).rfo:= gs.rfo(t := (t ∈ gs.fwriters(l) ⊃ gs.rfo(t);gs.rfo(t) -p n)), lsf(t0), pcf(t0), ags0, alsf(t0), apcf(t0))) |
ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)), # gs.fwriters(l) ≠ 0, gs.bq(t) ≠ [], gs.fwriters(l) ≠ ∅, n < # gs.bq(t), n0 < # gs.bq(t), FLITInv(((gs.pq:= gs.pq(l := gs.pq(l) + FO(t) ')).bq:= gs.bq(t := gs.bq(t) -p n)).rfo:= gs.rfo(t := gs.rfo(t)), lsf, pcf), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPropFO(n, l, gs.bq(t)), isPropFO(n0, l, gs.bq(t)), reorder(ags.p, gs.pq, gs.rfo), t ∈ gs.fwriters(l), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, gs.pq(l := gs.pq(l) + FO(t) '), gs.rfo(t := gs.rfo(t))) ∧ ags0.writers = gs.fwriters ∧ (∀ t0. labs (((gs.pq:= gs.pq(l := gs.pq(l) + FO(t) ')).bq:= gs.bq(t := gs.bq(t) -p n)).rfo:= gs.rfo(t := gs.rfo(t)), lsf(t0), pcf(t0), ags0, alsf(t0), apcf(t0)))
Used simplifier rules: size-zero-01: ⊦ s ≠ ∅ → # s ≠ 0; (forward) from specification set-basic ne-01: ⊦ a ∈ s → s ≠ ∅; (forward) from specification set-basic
| ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)), # gs.fwriters(l) ≠ 0, gs.bq(t) ≠ [], gs.fwriters(l) ≠ ∅, n < # gs.bq(t), n0 < # gs.bq(t), FLITInv(((gs.pq:= gs.pq(l := gs.pq(l) + FO(t) ')).bq:= gs.bq(t := gs.bq(t) -p n)).rfo:= gs.rfo(t := gs.rfo(t)), lsf, pcf), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPropFO(n, l, gs.bq(t)), isPropFO(n0, l, gs.bq(t)), reorder(ags.p, gs.pq, gs.rfo), t ∈ gs.fwriters(l), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, gs.pq(l := gs.pq(l) + FO(t) '), gs.rfo(t := gs.rfo(t))) ∧ ags0.writers = gs.fwriters ∧ (∀ t0. labs (((gs.pq:= gs.pq(l := gs.pq(l) + FO(t) ')).bq:= gs.bq(t := gs.bq(t) -p n)).rfo:= gs.rfo(t := gs.rfo(t)), lsf(t0), pcf(t0), ags0, alsf(t0), apcf(t0))) |
Used simplifier rules: ⊦ globalPERSIST_FO(loc) ≠ propFO(t, loc0); (s) ⊦ doWriteFO(t, loc) ≠ globalPERSIST_FO(loc0); (s) Used formulas: oneMember(t, l, gs.fwriters)
| ⟨skip⟩ (pq = pq0 ∧ bq = bq0 ∧ rfo = rfo0), ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, bq = gs.bq, fwriters = gs.fwriters, globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)), pq = gs.pq, rfo = gs.rfo, tid = t, gs.bq(t) ≠ [], n < # gs.bq(t), FLITInv(gs, lsf, pcf), FLITInv(((gs.pq:= pq0).bq:= bq0).rfo:= rfo0, lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPropFO(n, l, gs.bq(t)), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)), ∀ n. ¬(n < # bq(tid) ∧ isPropFO(n, l, bq(tid))) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, pq0, rfo0) ∧ ags0.writers = gs.fwriters ∧ (∀ t. labs(((gs.pq:= pq0).bq:= bq0).rfo:= rfo0, lsf(t), pcf(t), ags0, alsf(t), apcf(t))) |
ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, bq = gs.bq, bq = bq0, fwriters = gs.fwriters, globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)), pq = gs.pq, pq = pq0, rfo = gs.rfo, rfo = rfo0, tid = t, gs.bq(t) ≠ [], n < # gs.bq(t), FLITInv(((gs.pq:= pq0).bq:= bq0).rfo:= rfo0, lsf, pcf), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPropFO(n, l, gs.bq(t)), reorder(ags.p, gs.pq, gs.rfo), ∀ n. ¬(n < # bq(tid) ∧ isPropFO(n, l, bq(tid))), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, pq0, rfo0) ∧ ags0.writers = gs.fwriters ∧ (∀ t. labs(((gs.pq:= pq0).bq:= bq0).rfo:= rfo0, lsf(t), pcf(t), ags0, alsf(t), apcf(t)))
| ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, bq = gs.bq, bq = bq0, fwriters = gs.fwriters, globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)), pq = gs.pq, pq = pq0, rfo = gs.rfo, rfo = rfo0, tid = t, gs.bq(t) ≠ [], n < # gs.bq(t), FLITInv(((gs.pq:= pq0).bq:= bq0).rfo:= rfo0, lsf, pcf), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPropFO(n, l, gs.bq(t)), reorder(ags.p, gs.pq, gs.rfo), ∀ n. ¬(n < # bq(tid) ∧ isPropFO(n, l, bq(tid))), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, pq0, rfo0) ∧ ags0.writers = gs.fwriters ∧ (∀ t. labs(((gs.pq:= pq0).bq:= bq0).rfo:= rfo0, lsf(t), pcf(t), ags0, alsf(t), apcf(t))) |
ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)), gs.bq(t) ≠ [], n < # gs.bq(t), FLITInv(gs, lsf, pcf), FLITInv(((gs.pq:= gs.pq).bq:= gs.bq).rfo:= gs.rfo, lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPropFO(n, l, gs.bq(t)), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)), ∀ n0. ¬ n0 < # gs.bq(t) ∨ ¬ isPropFO(n0, l, gs.bq(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, gs.pq, gs.rfo) ∧ ags0.writers = gs.fwriters ∧ (∀ t. labs(((gs.pq:= gs.pq).bq:= gs.bq).rfo:= gs.rfo, lsf(t), pcf(t), ags0, alsf(t), apcf(t)))
| ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, globalPERSIST_FO(loc) = (oneMember(t, l, gs.fwriters) ⊃ doWriteFO(t, l);propFO(t, l)), gs.bq(t) ≠ [], n < # gs.bq(t), FLITInv(gs, lsf, pcf), FLITInv(((gs.pq:= gs.pq).bq:= gs.bq).rfo:= gs.rfo, lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPropFO(n, l, gs.bq(t)), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)), ∀ n0. ¬ n0 < # gs.bq(t) ∨ ¬ isPropFO(n0, l, gs.bq(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, gs.pq, gs.rfo) ∧ ags0.writers = gs.fwriters ∧ (∀ t. labs(((gs.pq:= gs.pq).bq:= gs.bq).rfo:= gs.rfo, lsf(t), pcf(t), ags0, alsf(t), apcf(t))) |
Used terms: n
| ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, gs0 = gs.pq:= gs.pq(loc0 := gs.pq(loc0).tail), loc = loc0, lsf0 = lsf, pcf0 = pcf, gs.pq(loc0) ≠ [], gs.pq(loc0).head.FO?, FLITInv(gs0, lsf0, pcf0), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc)) ∧ ags0 = ags.p:= ags.p(loc := ags.p(loc) -p n)) ∧ ags0.mem = gs0.pmem ∧ ags0.ctr = gs0.fctr ∧ reorder(ags0.p, gs0.pq, gs0.rfo) ∧ ags0.writers = gs0.fwriters ∧ (∀ t. labs(gs0, lsf0(t), pcf0(t), ags0, alsf(t), apcf(t))) |
ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, gs.pq(loc0) ≠ [], gs.pq(loc0).head.FO?, FLITInv(gs, lsf, pcf), FLITInv(gs.pq:= gs.pq(loc0 := gs.pq(loc0).tail), lsf, pcf), FLITPSCInv(ags, alsf, apcf), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc0)) ∧ ags0 = ags.p:= ags.p(loc0 := ags.p(loc0) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, gs.pq(loc0 := gs.pq(loc0).tail), gs.rfo) ∧ ags0.writers = gs.fwriters ∧ (∀ t. labs(gs.pq:= gs.pq(loc0 := gs.pq(loc0).tail), lsf(t), pcf(t), ags0, alsf(t), apcf(t)))
Used simplifier rules: ⊦ (gs.pq:= pq).fwriters = gs.fwriters; (s) ⊦ (gs.pq:= pq).rfo = gs.rfo; (s) ⊦ (gs.pq:= pq).pq = pq; (s) ⊦ (gs.pq:= pq).fctr = gs.fctr; (s) ⊦ (gs.pq:= pq).pmem = gs.pmem; (s)
| ags.ctr = gs.fctr, ags.mem = gs.pmem, ags.writers = gs.fwriters, gs.pq(loc0) ≠ [], gs.pq(loc0).head.FO?, FLITInv(gs, lsf, pcf), FLITInv(gs.pq:= gs.pq(loc0 := gs.pq(loc0).tail), lsf, pcf), FLITPSCInv(ags, alsf, apcf), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc0)) ∧ ags0 = ags.p:= ags.p(loc0 := ags.p(loc0) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, gs.pq(loc0 := gs.pq(loc0).tail), gs.rfo) ∧ ags0.writers = gs.fwriters ∧ (∀ t. labs(gs.pq:= gs.pq(loc0 := gs.pq(loc0).tail), lsf(t), pcf(t), ags0, alsf(t), apcf(t))) |
ags.ctr = gs.fctr, ags.mem = gs.pmem, gs.pq(loc0) = fow + fowl, ags.writers = gs.fwriters, gs.pq(loc0) ≠ [], fow.FO?, FLITInv(gs.pq:= gs.pq(loc0 := fowl), lsf, pcf), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc0)) ∧ ags0 = ags.p:= ags.p(loc0 := ags.p(loc0) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, gs.pq(loc0 := fowl), gs.rfo) ∧ ags0.writers = gs.fwriters ∧ (∀ t. labs(gs.pq:= gs.pq(loc0 := fowl), lsf(t), pcf(t), ags0, alsf(t), apcf(t)))
Used simplifier rules: ⊦ x ≠ [] → (head = x.head ∧ tail = x.tail ↔ x = head + tail); (elim) Used terms: gs.pq(loc0), fow, fowl
| ags.ctr = gs.fctr, ags.mem = gs.pmem, gs.pq(loc0) = fow + fowl, ags.writers = gs.fwriters, gs.pq(loc0) ≠ [], fow.FO?, FLITInv(gs.pq:= gs.pq(loc0 := fowl), lsf, pcf), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc0)) ∧ ags0 = ags.p:= ags.p(loc0 := ags.p(loc0) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, gs.pq(loc0 := fowl), gs.rfo) ∧ ags0.writers = gs.fwriters ∧ (∀ t. labs(gs.pq:= gs.pq(loc0 := fowl), lsf(t), pcf(t), ags0, alsf(t), apcf(t))) |
ags.ctr = gs.fctr, ags.mem = gs.pmem, gs.pq(loc0) = fow ' + fowl, ags.writers = gs.fwriters, fow.FO?, FLITInv(gs, lsf, pcf), FLITInv(gs.pq:= gs.pq(loc0 := fowl), lsf, pcf), FLITPSCInv(ags, alsf, apcf), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc0)) ∧ ags0 = ags.p:= ags.p(loc0 := ags.p(loc0) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, gs.pq(loc0 := fowl), gs.rfo) ∧ ags0.writers = gs.fwriters ∧ (∀ t. labs(gs.pq:= gs.pq(loc0 := fowl), lsf(t), pcf(t), ags0, alsf(t), apcf(t)))
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a ∈ a0 ' + x ↔ a = a0 ∨ a ∈ x; (s) ⊦ a ' ≠ []; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) in-14: ⊦ a ' + x = y → a ∈ y; (forward) from specification list ⊦ a + x = a ' + x; (s)
| ags.ctr = gs.fctr, ags.mem = gs.pmem, gs.pq(loc0) = fow ' + fowl, ags.writers = gs.fwriters, fow.FO?, FLITInv(gs, lsf, pcf), FLITInv(gs.pq:= gs.pq(loc0 := fowl), lsf, pcf), FLITPSCInv(ags, alsf, apcf), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc0)) ∧ ags0 = ags.p:= ags.p(loc0 := ags.p(loc0) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, gs.pq(loc0 := fowl), gs.rfo) ∧ ags0.writers = gs.fwriters ∧ (∀ t. labs(gs.pq:= gs.pq(loc0 := fowl), lsf(t), pcf(t), ags0, alsf(t), apcf(t))) |
⊦ fow.FO? ↔ (∃ tid. fow = FO(tid))
ags.ctr = gs.fctr, ags.mem = gs.pmem, gs.pq(loc0) = fow ' + fowl, ags.writers = gs.fwriters, FLITInv(gs.pq:= gs.pq(loc0 := fowl), lsf, pcf), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)), ∃ tid. fow = FO(tid) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc0)) ∧ ags0 = ags.p:= ags.p(loc0 := ags.p(loc0) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, gs.pq(loc0 := fowl), gs.rfo) ∧ ags0.writers = gs.fwriters ∧ (∀ t. labs(gs.pq:= gs.pq(loc0 := fowl), lsf(t), pcf(t), ags0, alsf(t), apcf(t)))
Used terms: fow
| ⊦ fow.FO? ↔ (∃ tid. fow = FO(tid)) |
| ags.ctr = gs.fctr, ags.mem = gs.pmem, gs.pq(loc0) = fow ' + fowl, ags.writers = gs.fwriters, FLITInv(gs.pq:= gs.pq(loc0 := fowl), lsf, pcf), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), reorder(ags.p, gs.pq, gs.rfo), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)), ∃ tid. fow = FO(tid) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc0)) ∧ ags0 = ags.p:= ags.p(loc0 := ags.p(loc0) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, gs.pq(loc0 := fowl), gs.rfo) ∧ ags0.writers = gs.fwriters ∧ (∀ t. labs(gs.pq:= gs.pq(loc0 := fowl), lsf(t), pcf(t), ags0, alsf(t), apcf(t))) |
ags.ctr = gs.fctr, ags.mem = gs.pmem, gs.pq(loc0) = FO(t) ' + fowl, ags.writers = gs.fwriters, FLITInv(gs, lsf, pcf), FLITInv(gs.pq:= gs.pq(loc0 := fowl), lsf, pcf), FLITPSCInv(ags, alsf, apcf), reorder(ags.p, gs.pq, gs.rfo), FO(t) ∈ gs.pq(loc0), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc0)) ∧ ags0 = ags.p:= ags.p(loc0 := ags.p(loc0) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, gs.pq(loc0 := fowl), gs.rfo) ∧ ags0.writers = gs.fwriters ∧ (∀ t. labs(gs.pq:= gs.pq(loc0 := fowl), lsf(t), pcf(t), ags0, alsf(t), apcf(t)))
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list in-14: ⊦ a ' + x = y → a ∈ y; (forward) from specification list
| ags.ctr = gs.fctr, ags.mem = gs.pmem, gs.pq(loc0) = FO(t) ' + fowl, ags.writers = gs.fwriters, FLITInv(gs, lsf, pcf), FLITInv(gs.pq:= gs.pq(loc0 := fowl), lsf, pcf), FLITPSCInv(ags, alsf, apcf), reorder(ags.p, gs.pq, gs.rfo), FO(t) ∈ gs.pq(loc0), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc0)) ∧ ags0 = ags.p:= ags.p(loc0 := ags.p(loc0) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, gs.pq(loc0 := fowl), gs.rfo) ∧ ags0.writers = gs.fwriters ∧ (∀ t. labs(gs.pq:= gs.pq(loc0 := fowl), lsf(t), pcf(t), ags0, alsf(t), apcf(t))) |
⊦ reorder(p, pq, rfo) ∧ pq(l) = FO(t) ' + fowl1 → (∃ n. isPersistFO(n, p(l)) ∧ p(l)[n] = FO(t))
ags.ctr = gs.fctr, ags.mem = gs.pmem, gs.pq(loc0) = FO(t) ' + fowl, ags.writers = gs.fwriters, FLITInv(gs.pq:= gs.pq(loc0 := fowl), lsf, pcf), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), reorder(ags.p, gs.pq, gs.rfo), FO(t) ∈ gs.pq(loc0), reorder(ags.p, gs.pq, gs.rfo) ∧ gs.pq(loc0) = FO(t) ' + fowl → (∃ n. isPersistFO(n, ags.p(loc0)) ∧ ags.p(loc0)[n] = FO(t)), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc0)) ∧ ags0 = ags.p:= ags.p(loc0 := ags.p(loc0) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, gs.pq(loc0 := fowl), gs.rfo) ∧ ags0.writers = gs.fwriters ∧ (∀ t. labs(gs.pq:= gs.pq(loc0 := fowl), lsf(t), pcf(t), ags0, alsf(t), apcf(t)))
Used terms: loc0, gs.rfo, t, gs.pq, fowl, ags.p
| ⊦ reorder(p, pq, rfo) ∧ pq(l) = FO(t) ' + fowl1 → (∃ n. isPersistFO(n, p(l)) ∧ p(l)[n] = FO(t)) |
| ags.ctr = gs.fctr, ags.mem = gs.pmem, gs.pq(loc0) = FO(t) ' + fowl, ags.writers = gs.fwriters, FLITInv(gs.pq:= gs.pq(loc0 := fowl), lsf, pcf), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), reorder(ags.p, gs.pq, gs.rfo), FO(t) ∈ gs.pq(loc0), reorder(ags.p, gs.pq, gs.rfo) ∧ gs.pq(loc0) = FO(t) ' + fowl → (∃ n. isPersistFO(n, ags.p(loc0)) ∧ ags.p(loc0)[n] = FO(t)), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc0)) ∧ ags0 = ags.p:= ags.p(loc0 := ags.p(loc0) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, gs.pq(loc0 := fowl), gs.rfo) ∧ ags0.writers = gs.fwriters ∧ (∀ t. labs(gs.pq:= gs.pq(loc0 := fowl), lsf(t), pcf(t), ags0, alsf(t), apcf(t))) |
ags.ctr = gs.fctr, ags.mem = gs.pmem, gs.pq(loc0) = FO(t) ' + fowl, ags.writers = gs.fwriters, ags.p(loc0)[n] = FO(t), FLITInv(gs, lsf, pcf), FLITInv(gs.pq:= gs.pq(loc0 := fowl), lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPersistFO(n, ags.p(loc0)), reorder(ags.p, gs.pq, gs.rfo), FO(t) ∈ gs.pq(loc0), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc0)) ∧ ags0 = ags.p:= ags.p(loc0 := ags.p(loc0) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, gs.pq(loc0 := fowl), gs.rfo) ∧ ags0.writers = gs.fwriters ∧ (∀ t. labs(gs.pq:= gs.pq(loc0 := fowl), lsf(t), pcf(t), ags0, alsf(t), apcf(t)))
| ags.ctr = gs.fctr, ags.mem = gs.pmem, gs.pq(loc0) = FO(t) ' + fowl, ags.writers = gs.fwriters, ags.p(loc0)[n] = FO(t), FLITInv(gs, lsf, pcf), FLITInv(gs.pq:= gs.pq(loc0 := fowl), lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPersistFO(n, ags.p(loc0)), reorder(ags.p, gs.pq, gs.rfo), FO(t) ∈ gs.pq(loc0), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ ags0. (∃ n. isPersistFO(n, ags.p(loc0)) ∧ ags0 = ags.p:= ags.p(loc0 := ags.p(loc0) -p n)) ∧ ags0.mem = gs.pmem ∧ ags0.ctr = gs.fctr ∧ reorder(ags0.p, gs.pq(loc0 := fowl), gs.rfo) ∧ ags0.writers = gs.fwriters ∧ (∀ t. labs(gs.pq:= gs.pq(loc0 := fowl), lsf(t), pcf(t), ags0, alsf(t), apcf(t))) |
ags.ctr = gs.fctr, ags.mem = gs.pmem, gs.pq(loc0) = FO(t) ' + fowl, ags.writers = gs.fwriters, ags.p(loc0)[n] = FO(t), FLITInv(gs.pq:= gs.pq(loc0 := fowl), lsf, pcf), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPersistFO(n, ags.p(loc0)), reorder(ags.p, gs.pq, gs.rfo), FO(t) ∈ gs.pq(loc0), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ (∃ n0. isPersistFO(n0, ags.p(loc0)) ∧ ags.p:= ags.p(loc0 := ags.p(loc0) -p n) = ags.p:= ags.p(loc0 := ags.p(loc0) -p n0)) ∧ (ags.p:= ags.p(loc0 := ags.p(loc0) -p n)).mem = gs.pmem ∧ (ags.p:= ags.p(loc0 := ags.p(loc0) -p n)).ctr = gs.fctr ∧ reorder((ags.p:= ags.p(loc0 := ags.p(loc0) -p n)).p, gs.pq(loc0 := fowl), gs.rfo) ∧ (ags.p:= ags.p(loc0 := ags.p(loc0) -p n)).writers = gs.fwriters ∧ (∀ t. labs(gs.pq:= gs.pq(loc0 := fowl), lsf(t), pcf(t), ags.p:= ags.p(loc0 := ags.p(loc0) -p n), alsf(t), apcf(t)))
Used terms: ags.p:= ags.p(loc0 := ags.p(loc0) -p n)
| ags.ctr = gs.fctr, ags.mem = gs.pmem, gs.pq(loc0) = FO(t) ' + fowl, ags.writers = gs.fwriters, ags.p(loc0)[n] = FO(t), FLITInv(gs.pq:= gs.pq(loc0 := fowl), lsf, pcf), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPersistFO(n, ags.p(loc0)), reorder(ags.p, gs.pq, gs.rfo), FO(t) ∈ gs.pq(loc0), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ (∃ n0. isPersistFO(n0, ags.p(loc0)) ∧ ags.p:= ags.p(loc0 := ags.p(loc0) -p n) = ags.p:= ags.p(loc0 := ags.p(loc0) -p n0)) ∧ (ags.p:= ags.p(loc0 := ags.p(loc0) -p n)).mem = gs.pmem ∧ (ags.p:= ags.p(loc0 := ags.p(loc0) -p n)).ctr = gs.fctr ∧ reorder((ags.p:= ags.p(loc0 := ags.p(loc0) -p n)).p, gs.pq(loc0 := fowl), gs.rfo) ∧ (ags.p:= ags.p(loc0 := ags.p(loc0) -p n)).writers = gs.fwriters ∧ (∀ t. labs(gs.pq:= gs.pq(loc0 := fowl), lsf(t), pcf(t), ags.p:= ags.p(loc0 := ags.p(loc0) -p n), alsf(t), apcf(t))) |
ags.ctr = gs.fctr, ags.mem = gs.pmem, gs.pq(loc0) = FO(t) ' + fowl, ags.writers = gs.fwriters, ags.p(loc0)[n] = FO(t), FLITInv(gs, lsf, pcf), FLITInv(gs.pq:= gs.pq(loc0 := fowl), lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPersistFO(n, ags.p(loc0)), reorder(ags.p, gs.pq, gs.rfo), FO(t) ∈ gs.pq(loc0), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ (∃ n0. isPersistFO(n0, ags.p(loc0)) ∧ ags.p:= ags.p(loc0 := ags.p(loc0) -p n) = ags.p:= ags.p(loc0 := ags.p(loc0) -p n0)) ∧ labs(gs.pq:= gs.pq(loc0 := fowl), lsf(t0), pcf(t0), ags.p:= ags.p(loc0 := ags.p(loc0) -p n), alsf(t0), apcf(t0))
Used simplifier rules: ⊦ (gs.p:= p).writers = gs.writers; (s) ⊦ reorder(p, pq, rfo) ∧ pq(l) = FO(t) ' + fowl ∧ isPersistFO(n, p(l)) ∧ p(l)[n] = FO(t) → reorder(p(l := p(l) -p n), pq(l := fowl), rfo); (ss) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (gs.p:= p).p = p; (s) ⊦ (gs.p:= p).ctr = gs.ctr; (s) ⊦ (gs.p:= p).mem = gs.mem; (s)
| ags.ctr = gs.fctr, ags.mem = gs.pmem, gs.pq(loc0) = FO(t) ' + fowl, ags.writers = gs.fwriters, ags.p(loc0)[n] = FO(t), FLITInv(gs, lsf, pcf), FLITInv(gs.pq:= gs.pq(loc0 := fowl), lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPersistFO(n, ags.p(loc0)), reorder(ags.p, gs.pq, gs.rfo), FO(t) ∈ gs.pq(loc0), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ (∃ n0. isPersistFO(n0, ags.p(loc0)) ∧ ags.p:= ags.p(loc0 := ags.p(loc0) -p n) = ags.p:= ags.p(loc0 := ags.p(loc0) -p n0)) ∧ labs(gs.pq:= gs.pq(loc0 := fowl), lsf(t0), pcf(t0), ags.p:= ags.p(loc0 := ags.p(loc0) -p n), alsf(t0), apcf(t0)) |
ags.ctr = gs.fctr, ags.mem = gs.pmem, gs.pq(loc0) = FO(t) ' + fowl, ags.writers = gs.fwriters, ags.p(loc0)[n] = FO(t), FLITInv(gs.pq:= gs.pq(loc0 := fowl), lsf, pcf), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPersistFO(n, ags.p(loc0)), reorder(ags.p, gs.pq, gs.rfo), FO(t) ∈ gs.pq(loc0), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ n0. isPersistFO(n0, ags.p(loc0)) ∧ ags.p:= ags.p(loc0 := ags.p(loc0) -p n) = ags.p:= ags.p(loc0 := ags.p(loc0) -p n0)
ags.ctr = gs.fctr, ags.mem = gs.pmem, gs.pq(loc0) = FO(t) ' + fowl, ags.writers = gs.fwriters, ags.p(loc0)[n] = FO(t), FLITInv(gs.pq:= gs.pq(loc0 := fowl), lsf, pcf), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPersistFO(n, ags.p(loc0)), reorder(ags.p, gs.pq, gs.rfo), FO(t) ∈ gs.pq(loc0), ¬ labs(gs.pq:= gs.pq(loc0 := fowl), lsf(t0), pcf(t0), ags.p:= ags.p(loc0 := ags.p(loc0) -p n), alsf(t0), apcf(t0)), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦
| ags.ctr = gs.fctr, ags.mem = gs.pmem, gs.pq(loc0) = FO(t) ' + fowl, ags.writers = gs.fwriters, ags.p(loc0)[n] = FO(t), FLITInv(gs.pq:= gs.pq(loc0 := fowl), lsf, pcf), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPersistFO(n, ags.p(loc0)), reorder(ags.p, gs.pq, gs.rfo), FO(t) ∈ gs.pq(loc0), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ ∃ n0. isPersistFO(n0, ags.p(loc0)) ∧ ags.p:= ags.p(loc0 := ags.p(loc0) -p n) = ags.p:= ags.p(loc0 := ags.p(loc0) -p n0) |
Used terms: n
| ags.ctr = gs.fctr, ags.mem = gs.pmem, gs.pq(loc0) = FO(t) ' + fowl, ags.writers = gs.fwriters, ags.p(loc0)[n] = FO(t), FLITInv(gs.pq:= gs.pq(loc0 := fowl), lsf, pcf), FLITInv(gs, lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPersistFO(n, ags.p(loc0)), reorder(ags.p, gs.pq, gs.rfo), FO(t) ∈ gs.pq(loc0), ¬ labs(gs.pq:= gs.pq(loc0 := fowl), lsf(t0), pcf(t0), ags.p:= ags.p(loc0 := ags.p(loc0) -p n), alsf(t0), apcf(t0)), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ |
ags.ctr = gs.fctr, ags.mem = gs.pmem, gs.pq(loc0) = FO(t) ' + fowl, ags.writers = gs.fwriters, ags.p(loc0)[n] = FO(t), FLITInv(gs, lsf, pcf), FLITInv(gs.pq:= gs.pq(loc0 := fowl), lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPersistFO(n, ags.p(loc0)), reorder(ags.p, gs.pq, gs.rfo), FO(t) ∈ gs.pq(loc0), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ lsf(t0).t = alsf(t0).t ∧ (pcf(t0) = idle → apcf(t0) = idle) ∧ (pcf(t0) = ready → apcf(t0) = ready) ∧ (pcf(t0) = crashed → apcf(t0) = crashed) ∧ (pcf(t0) = R1 → apcf(t0) = R1) ∧ (pcf(t0) = R2 → apcf(t0) = R2) ∧ (pcf(t0) = R3 → apcf(t0) = R3) ∧ (pcf(t0) = R4 → apcf(t0) = R4) ∧ (pcf(t0) = R1 ∨ pcf(t0) = R2 ∨ pcf(t0) = R3 ∨ pcf(t0) = R4 → lsf(t0).loc = alsf(t0).l) ∧ (pcf(t0) = R2 ∨ pcf(t0) = R3 ∨ pcf(t0) = R4 → lsf(t0).val = alsf(t0).v) ∧ (pcf(t0) = W1 → apcf(t0) = W1) ∧ (pcf(t0) = W2 → apcf(t0) = (SF ∈ gs.bq(lsf(t0).t) ⊃ W1;W2)) ∧ (pcf(t0) = W3 → apcf(t0) = W3) ∧ (pcf(t0) = W4 → apcf(t0) = (W(lsf(t0).loc, lsf(t0).val) ∈ gs.bq(lsf(t0).t) ⊃ W3;W4)) ∧ (pcf(t0) = W5 → apcf(t0) = (W(lsf(t0).loc, lsf(t0).val) ∈ gs.bq(lsf(t0).t) ⊃ W3;(FO(lsf(t0).loc) ∈ gs.bq(lsf(t0).t) ⊃ W4;W5))) ∧ ( pcf(t0) = W6 → apcf(t0) = (W(lsf(t0).loc, lsf(t0).val) ∈ gs.bq(lsf(t0).t) ⊃ W3;(FO(lsf(t0).loc) ∈ gs.bq(lsf(t0).t) ⊃ W4;(SF ∈ gs.bq(lsf(t0).t) ⊃ W5;W6)))) ∧ (pcf(t0) = W7 → apcf(t0) = W7) ∧ (pcf(t0) = W1 ∨ pcf(t0) = W2 ∨ pcf(t0) = W3 ∨ pcf(t0) = W4 ∨ pcf(t0) = W5 ∨ pcf(t0) = W6 ∨ pcf(t0) = W7 → lsf(t0).loc = alsf(t0).l) ∧ (pcf(t0) = W1 ∨ pcf(t0) = W2 ∨ pcf(t0) = W3 ∨ pcf(t0) = W4 ∨ pcf(t0) = W5 ∨ pcf(t0) = W6 ∨ pcf(t0) = W7 → lsf(t0).val = alsf(t0).v)
Used simplifier rules: labs-def: ⊦ labs(gs, ls, pc, ags, als, apc) ↔ ls.t = als.t ∧ (pc = idle → apc = idle) ∧ (pc = ready → apc = ready) ∧ (pc = crashed → apc = crashed) ∧ (pc = R1 → apc = R1) ∧ (pc = R2 → apc = R2) ∧ (pc = R3 → apc = R3) ∧ (pc = R4 → apc = R4) ∧ (pc = R1 ∨ pc = R2 ∨ pc = R3 ∨ pc = R4 → ls.loc = als.l) ∧ (pc = R2 ∨ pc = R3 ∨ pc = R4 → ls.val = als.v) ∧ (pc = W1 → apc = W1) ∧ (pc = W2 → apc = (SF ∈ gs.bq(ls.t) ⊃ W1;W2)) ∧ (pc = W3 → apc = W3) ∧ (pc = W4 → apc = (W(ls.loc, ls.val) ∈ gs.bq(ls.t) ⊃ W3;W4)) ∧ ( pc = W5 → apc = (W(ls.loc, ls.val) ∈ gs.bq(ls.t) ⊃ W3;(FO(ls.loc) ∈ gs.bq(ls.t) ⊃ W4;W5))) ∧ ( pc = W6 → apc = (W(ls.loc, ls.val) ∈ gs.bq(ls.t) ⊃ W3 ;(FO(ls.loc) ∈ gs.bq(ls.t) ⊃ W4;(SF ∈ gs.bq(ls.t) ⊃ W5;W6)) )) ∧ (pc = W7 → apc = W7) ∧ ( pc = W1 ∨ pc = W2 ∨ pc = W3 ∨ pc = W4 ∨ pc = W5 ∨ pc = W6 ∨ pc = W7 → ls.loc = als.l) ∧ ( pc = W1 ∨ pc = W2 ∨ pc = W3 ∨ pc = W4 ∨ pc = W5 ∨ pc = W6 ∨ pc = W7 → ls.val = als.v); ⊦ (gs.pq:= pq).bq = gs.bq; (s)
| ags.ctr = gs.fctr, ags.mem = gs.pmem, gs.pq(loc0) = FO(t) ' + fowl, ags.writers = gs.fwriters, ags.p(loc0)[n] = FO(t), FLITInv(gs, lsf, pcf), FLITInv(gs.pq:= gs.pq(loc0 := fowl), lsf, pcf), FLITPSCInv(ags, alsf, apcf), isPersistFO(n, ags.p(loc0)), reorder(ags.p, gs.pq, gs.rfo), FO(t) ∈ gs.pq(loc0), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ lsf(t0).t = alsf(t0).t ∧ (pcf(t0) = idle → apcf(t0) = idle) ∧ (pcf(t0) = ready → apcf(t0) = ready) ∧ (pcf(t0) = crashed → apcf(t0) = crashed) ∧ (pcf(t0) = R1 → apcf(t0) = R1) ∧ (pcf(t0) = R2 → apcf(t0) = R2) ∧ (pcf(t0) = R3 → apcf(t0) = R3) ∧ (pcf(t0) = R4 → apcf(t0) = R4) ∧ (pcf(t0) = R1 ∨ pcf(t0) = R2 ∨ pcf(t0) = R3 ∨ pcf(t0) = R4 → lsf(t0).loc = alsf(t0).l) ∧ (pcf(t0) = R2 ∨ pcf(t0) = R3 ∨ pcf(t0) = R4 → lsf(t0).val = alsf(t0).v) ∧ (pcf(t0) = W1 → apcf(t0) = W1) ∧ (pcf(t0) = W2 → apcf(t0) = (SF ∈ gs.bq(lsf(t0).t) ⊃ W1;W2)) ∧ (pcf(t0) = W3 → apcf(t0) = W3) ∧ (pcf(t0) = W4 → apcf(t0) = (W(lsf(t0).loc, lsf(t0).val) ∈ gs.bq(lsf(t0).t) ⊃ W3;W4)) ∧ (pcf(t0) = W5 → apcf(t0) = (W(lsf(t0).loc, lsf(t0).val) ∈ gs.bq(lsf(t0).t) ⊃ W3;(FO(lsf(t0).loc) ∈ gs.bq(lsf(t0).t) ⊃ W4;W5))) ∧ ( pcf(t0) = W6 → apcf(t0) = (W(lsf(t0).loc, lsf(t0).val) ∈ gs.bq(lsf(t0).t) ⊃ W3;(FO(lsf(t0).loc) ∈ gs.bq(lsf(t0).t) ⊃ W4;(SF ∈ gs.bq(lsf(t0).t) ⊃ W5;W6)))) ∧ (pcf(t0) = W7 → apcf(t0) = W7) ∧ (pcf(t0) = W1 ∨ pcf(t0) = W2 ∨ pcf(t0) = W3 ∨ pcf(t0) = W4 ∨ pcf(t0) = W5 ∨ pcf(t0) = W6 ∨ pcf(t0) = W7 → lsf(t0).loc = alsf(t0).l) ∧ (pcf(t0) = W1 ∨ pcf(t0) = W2 ∨ pcf(t0) = W3 ∨ pcf(t0) = W4 ∨ pcf(t0) = W5 ∨ pcf(t0) = W6 ∨ pcf(t0) = W7 → lsf(t0).val = alsf(t0).v) |
Used simplifier rules: labs-def: ⊦ labs(gs, ls, pc, ags, als, apc) ↔ ls.t = als.t ∧ (pc = idle → apc = idle) ∧ (pc = ready → apc = ready) ∧ (pc = crashed → apc = crashed) ∧ (pc = R1 → apc = R1) ∧ (pc = R2 → apc = R2) ∧ (pc = R3 → apc = R3) ∧ (pc = R4 → apc = R4) ∧ (pc = R1 ∨ pc = R2 ∨ pc = R3 ∨ pc = R4 → ls.loc = als.l) ∧ (pc = R2 ∨ pc = R3 ∨ pc = R4 → ls.val = als.v) ∧ (pc = W1 → apc = W1) ∧ (pc = W2 → apc = (SF ∈ gs.bq(ls.t) ⊃ W1;W2)) ∧ (pc = W3 → apc = W3) ∧ (pc = W4 → apc = (W(ls.loc, ls.val) ∈ gs.bq(ls.t) ⊃ W3;W4)) ∧ ( pc = W5 → apc = (W(ls.loc, ls.val) ∈ gs.bq(ls.t) ⊃ W3;(FO(ls.loc) ∈ gs.bq(ls.t) ⊃ W4;W5))) ∧ ( pc = W6 → apc = (W(ls.loc, ls.val) ∈ gs.bq(ls.t) ⊃ W3 ;(FO(ls.loc) ∈ gs.bq(ls.t) ⊃ W4;(SF ∈ gs.bq(ls.t) ⊃ W5;W6)) )) ∧ (pc = W7 → apc = W7) ∧ ( pc = W1 ∨ pc = W2 ∨ pc = W3 ∨ pc = W4 ∨ pc = W5 ∨ pc = W6 ∨ pc = W7 → ls.loc = als.l) ∧ ( pc = W1 ∨ pc = W2 ∨ pc = W3 ∨ pc = W4 ∨ pc = W5 ∨ pc = W6 ∨ pc = W7 → ls.val = als.v); Used terms: t0
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.