[Imprint][Data Privacy Statement][E-Mail]



View long theorem info. View the proof. Back to main index. View the specification. View theorem base summary, View theorem base listing, the used properties by spec, the dependency list, the symbol table,

Proof step 1 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (conclusion) (back to tree)

FLITPSCInv(gs, lsf, pcf), FLITPSCInv(gs0, lsf0, pcf0), PLIBInv(ags, alsf, apcf), flitpscStep(mkstate(gs, lsf, pcf), globalPSCPERSIST_W(l), mkstate(gs0, lsf0, pcf0)), abs(mkstate(gs, lsf, pcf), mkstate(ags, alsf, apcf)) ⊦ ∃ ags0, alsf0, apcf0. plibStep(mkstate(ags, alsf, apcf), globalAPersist(l), mkstate(ags0, alsf0, apcf0)) ∧ abs(mkstate(gs0, lsf0, pcf0), mkstate(ags0, alsf0, apcf0))

System applied rule normalize

And obtained the following new goals

Rule argument

Additional information

Proof step 2 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

FLITPSCInv(gs0, lsf0, pcf0), FLITPSCInv(gs, lsf, pcf), PLIBInv(ags, alsf, apcf), abs(mkstate(gs, lsf, pcf), mkstate(ags, alsf, apcf)), flitpscStep(mkstate(gs, lsf, pcf), globalPSCPERSIST_W(l), mkstate(gs0, lsf0, pcf0)) ⊦ ∃ ags0, alsf0, apcf0. plibStep(mkstate(ags, alsf, apcf), globalAPersist(l), mkstate(ags0, alsf0, apcf0)) ∧ abs(mkstate(gs0, lsf0, pcf0), mkstate(ags0, alsf0, apcf0))

Heuristic simplifier applied rule simplifier

And obtained the following new goals

Rule argument

Additional information

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.pm = gs.mem ∧ ags.vm = gs.mem ⊕ gs.p ∧ abs(ags.h, gs.readers, gs.p); ⊦ (gs.p:= p).p = p; (s) ⊦ (gs.mem:= mem).readers = gs.readers; (s) ⊦ (gs.p:= p).readers = gs.readers; (s) ⊦ (gs.mem:= mem).mem = mem; (s) ⊦ (gs.p:= p).mem = gs.mem; (s) ⊦ abs(h, rs, p) ∧ firstPersistW(p(l)) < # p(l) → (h |W | l) | false ≠ []; (as) ⊦ # x = 0 ↔ x = []; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic ⊦ (gs.h:= h).h = h; (s) ⊦ (gs.pm:= vm0).vm = gs.vm; (s) ⊦ (gs.h:= h).vm = gs.vm; (s) ⊦ (gs.pm:= vm0).pm = vm0; (s) ⊦ (gs.h:= h).pm = gs.pm; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a + x = a ' + x; (s) ⊦ firstVolWrite(l, h) < # h ↔ (h |W | l) | false ≠ []; (s) ⊦ globalAPersist(l) = globalAPersist(l0) ↔ l = l0; (s) ⊦ globalACrash ≠ globalAPersist(l); (s) ⊦ ¬ pre(gs, ls, pc, globalAPersist(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) ⊦ plibStep(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)) ∨ a = globalACrash ∧ gs0 = mkPLIBgs(gs.pm, gs.pm, gs.h | true) ∧ lsf0 = lsf ∧ pcf0 = (λ t. (pcf(t) = idle ⊃ idle;crashed)) ∨ (∃ l. a = globalAPersist(l) ∧ 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)))) ∧ lsf0 = lsf ∧ pcf0 = pcf); (s) ⊦ globalPSCCRASH ≠ globalPSCPERSIST_W(l); (s) ⊦ globalPSCPERSIST_FO(l) ≠ globalPSCPERSIST_W(l0); (s) ⊦ globalPSCPERSIST_W(l) = globalPSCPERSIST_W(l0) ↔ l = l0; (s) ⊦ ¬ pre(gs, ls, pc, globalPSCPERSIST_W(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)

Proof step 3 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

ags.pm = gs.mem, ags.vm = gs.mem ⊕ gs.p, gs.p(l0) ≠ [], firstPersistW(gs.p(l0)) < # gs.p(l0), FLITPSCInv((gs.mem:= gs.mem(l0 := gs.p(l0)[firstPersistW(gs.p(l0))].val)).p:= gs.p(l0 := gs.p(l0) -p firstPersistW(gs.p(l0))), lsf, pcf), FLITPSCInv(gs, lsf, pcf), PLIBInv(ags, alsf, apcf), abs(ags.h, gs.readers, gs.p), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ gs.mem(l0 := ags.h[firstVolWrite(l0, ags.h)]._1.v) = gs.mem(l0 := gs.p(l0)[firstPersistW(gs.p(l0))].val) ∧ ags.vm = gs.mem(l0 := gs.p(l0)[firstPersistW(gs.p(l0))].val) ⊕ gs.p(l0 := gs.p(l0) -p firstPersistW(gs.p(l0))) ∧ abs ( ags.h.take(firstVolWrite(l0, ags.h)) + (ags.h[firstVolWrite(l0, ags.h)]._1, true) ' + persistDependentReads(l0, ags.h.drop(firstVolWrite(l0, ags.h) + 1)), gs.readers, gs.p(l0 := gs.p(l0) -p firstPersistW(gs.p(l0)))) ∧ labs ((gs.mem:= gs.mem(l0 := gs.p(l0)[firstPersistW(gs.p(l0))].val)).p:= gs.p(l0 := gs.p(l0) -p firstPersistW(gs.p(l0))), lsf(t), pcf(t), (ags.pm:= gs.mem(l0 := ags.h[firstVolWrite(l0, ags.h)]._1.v)) .h:= ( ags.h.take(firstVolWrite(l0, ags.h)) + (ags.h[firstVolWrite(l0, ags.h)]._1, true) ' + persistDependentReads(l0, ags.h.drop(firstVolWrite(l0, ags.h) + 1))), alsf(t), apcf(t))

Heuristic elimination applied rule apply elim lemma

And obtained the following new goals

Rule argument

term: ags.h[firstVolWrite(l0, ags.h)]._1

Additional information

Used terms: e, boolvar

Proof step 4 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

ags.pm = gs.mem, ags.vm = gs.mem ⊕ gs.p, ags.h[firstVolWrite(l0, ags.h)] = (e, boolvar), gs.p(l0) ≠ [], firstPersistW(gs.p(l0)) < # gs.p(l0), FLITPSCInv(gs, lsf, pcf), FLITPSCInv((gs.mem:= gs.mem(l0 := gs.p(l0)[firstPersistW(gs.p(l0))].val)).p:= gs.p(l0 := gs.p(l0) -p firstPersistW(gs.p(l0))), lsf, pcf), PLIBInv(ags, alsf, apcf), abs(ags.h, gs.readers, gs.p), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ gs.mem(l0 := e.v) = gs.mem(l0 := gs.p(l0)[firstPersistW(gs.p(l0))].val) ∧ ags.vm = gs.mem(l0 := gs.p(l0)[firstPersistW(gs.p(l0))].val) ⊕ gs.p(l0 := gs.p(l0) -p firstPersistW(gs.p(l0))) ∧ abs (ags.h.take(firstVolWrite(l0, ags.h)) + (e, true) ' + persistDependentReads(l0, ags.h.drop(firstVolWrite(l0, ags.h) + 1)), gs.readers, gs.p(l0 := gs.p(l0) -p firstPersistW(gs.p(l0)))) ∧ labs ((gs.mem:= gs.mem(l0 := gs.p(l0)[firstPersistW(gs.p(l0))].val)).p:= gs.p(l0 := gs.p(l0) -p firstPersistW(gs.p(l0))), lsf(t), pcf(t), (ags.pm:= gs.mem(l0 := e.v)) .h:= (ags.h.take(firstVolWrite(l0, ags.h)) + (e, true) ' + persistDependentReads(l0, ags.h.drop(firstVolWrite(l0, ags.h) + 1))), alsf(t), apcf(t))

Heuristic simplifier applied rule simplifier

And obtained the following new goals

Rule argument

Additional information

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 = invRead) ∧ (pc = R2 ∨ pc = R3 ∨ pc = R4 → apc = resRead) ∧ (pc = W1 ∨ pc = W2 ∨ pc = W3 → apc = invWrite) ∧ (pc = W4 ∨ pc = W5 ∨ pc = W6 ∨ pc = W7 → apc = resWrite) ∧ (pc = R1 → ls.l = als.il) ∧ (pc = R2 ∨ pc = R3 ∨ pc = R4 → ls.v = als.ov) ∧ ( pc = W1 ∨ pc = W2 ∨ pc = W3 ∨ pc = W4 ∨ pc = W5 ∨ pc = W6 ∨ pc = W7 → ls.l = als.il ∧ ls.v = als.iv) ∧ ( pc = idle ∨ pc = ready ∨ pc = R1 ∨ pc = R4 ∨ pc = W1 ∨ pc = W5 → (∀ l. ¬ FO(ls.t) ∈ gs.p(l) → ((ags.h | l) | ls.t) | false = [])) ∧ (pc = W2 ∨ pc = W3 ∨ pc = W6 ∨ pc = W7 → (∀ l. ((ags.h | l) | ls.t) | false = [])) ∧ ( pc = R2 ∨ pc = R3 → (∀ l0. l0 ≠ ls.l ∧ ¬ FO(ls.t) ∈ gs.p(l0) → ((ags.h | l0) | ls.t) | false = [])) ∧ (pc = R2 → gs.ctr(ls.l) = 0 → ((ags.h | ls.l) | ls.t) | false = []) ∧ ( pc = W4 → ((ags.h | ls.l) | ls.t) | false = (W(ls.t, ls.l, ls.v), false) ' ∨ ((ags.h | ls.l) | ls.t) | false = []); a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) ⊦ h + h0 | b = (h | b) + (h0 | b); (s) ⊦ h + h0 | t = (h | t) + (h0 | t); (s) ⊦ abs(h, rs, p) ∧ firstPersistW(p(l)) < # p(l) ∧ h[firstVolWrite(l, h)] = (e, bv) → e.l = l; (s) ⊦ vpe ' | l = (vpe._1.l = l ⊃ vpe ';[]); (s) ⊦ h + h0 | l0 = (h | l0) + (h0 | l0); (s) ⊦ (gs.h:= h).h = h; (s) ⊦ (gs.mem:= mem).ctr = gs.ctr; (s) ⊦ (gs.p:= p).ctr = gs.ctr; (s) ⊦ (gs.p:= p).p = p; (s) ⊦ abs(h, rs, p) ∧ firstPersistW(p(l)) < # p(l) ∧ h[firstVolWrite(l, h)] = (e, bv) → p(l)[firstPersistW(p(l))].val = e.v; (s) c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ abs(h, rs, p) ∧ firstPersistW(p(l)) < # p(l) ∧ h[firstVolWrite(l, h)] = (e, bv) → abs ( h.take(firstVolWrite(l, h)) + (e, true) ' + persistDependentReads(l, h.drop(firstVolWrite(l, h) + 1)), rs, p(l := p(l) -p firstPersistW(p(l)))); (ss) ⊦ abs(h, rs, p) ∧ firstPersistW(p(l)) < # p(l) ∧ h[firstVolWrite(l, h)] = (e, bv) → mem(l := e.v) ⊕ p(l := p(l) -p firstPersistW(p(l))) = mem ⊕ p; (s)

Proof step 5 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

ags.pm = gs.mem, ags.vm = gs.mem ⊕ gs.p, ags.h[firstVolWrite(l0, ags.h)] = (e, boolvar), gs.p(l0) ≠ [], firstPersistW(gs.p(l0)) < # gs.p(l0), FLITPSCInv(gs, lsf, pcf), FLITPSCInv((gs.mem:= gs.mem(l0 := e.v)).p:= gs.p(l0 := gs.p(l0) -p firstPersistW(gs.p(l0))), lsf, pcf), PLIBInv(ags, alsf, apcf), abs(ags.h, gs.readers, gs.p), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ lsf(t).t = alsf(t).t ∧ (pcf(t) = idle → apcf(t) = idle) ∧ (pcf(t) = ready → apcf(t) = ready) ∧ (pcf(t) = crashed → apcf(t) = crashed) ∧ (pcf(t) = R1 → apcf(t) = invRead) ∧ (pcf(t) = R2 ∨ pcf(t) = R3 ∨ pcf(t) = R4 → apcf(t) = resRead) ∧ (pcf(t) = W1 ∨ pcf(t) = W2 ∨ pcf(t) = W3 → apcf(t) = invWrite) ∧ (pcf(t) = W4 ∨ pcf(t) = W5 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → apcf(t) = resWrite) ∧ (pcf(t) = R1 → lsf(t).l = alsf(t).il) ∧ (pcf(t) = R2 ∨ pcf(t) = R3 ∨ pcf(t) = R4 → lsf(t).v = alsf(t).ov) ∧ (pcf(t) = W1 ∨ pcf(t) = W2 ∨ pcf(t) = W3 ∨ pcf(t) = W4 ∨ pcf(t) = W5 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → lsf(t).l = alsf(t).il ∧ lsf(t).v = alsf(t).iv) ∧ ( pcf(t) = idle ∨ pcf(t) = ready ∨ pcf(t) = R1 ∨ pcf(t) = R4 ∨ pcf(t) = W1 ∨ pcf(t) = W5 → ¬ FO(lsf(t).t) ∈ (l0 = l ⊃ gs.p(l) -p firstPersistW(gs.p(l));gs.p(l)) → ((ags.h.take(firstVolWrite(l0, ags.h)) | l) | lsf(t).t) | false = [] ∧ ((l0 = l ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, ags.h.drop(firstVolWrite(l0, ags.h) + 1)) | l) | lsf(t).t) | false = []) ∧ ( pcf(t) = W2 ∨ pcf(t) = W3 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → ((ags.h.take(firstVolWrite(l0, ags.h)) | l1) | lsf(t).t) | false = [] ∧ ((l0 = l1 ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, ags.h.drop(firstVolWrite(l0, ags.h) + 1)) | l1) | lsf(t).t) | false = []) ∧ ( pcf(t) = R2 ∨ pcf(t) = R3 → l2 ≠ lsf(t).l ∧ ¬ FO(lsf(t).t) ∈ (l0 = l2 ⊃ gs.p(l2) -p firstPersistW(gs.p(l2));gs.p(l2)) → ((ags.h.take(firstVolWrite(l0, ags.h)) | l2) | lsf(t).t) | false = [] ∧ ((l0 = l2 ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, ags.h.drop(firstVolWrite(l0, ags.h) + 1)) | l2) | lsf(t).t) | false = []) ∧ ( pcf(t) = R2 → gs.ctr(lsf(t).l) = 0 → ((ags.h.take(firstVolWrite(l0, ags.h)) | lsf(t).l) | lsf(t).t) | false = [] ∧ ((l0 = lsf(t).l ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, ags.h.drop(firstVolWrite(l0, ags.h) + 1)) | lsf(t).l) | lsf(t).t) | false = []) ∧ ( pcf(t) = W4 → (((ags.h.take(firstVolWrite(l0, ags.h)) | lsf(t).l) | lsf(t).t) | false) + (((l0 = lsf(t).l ⊃ (e, true) ';[]) | lsf(t).t) | false) + (((persistDependentReads(l0, ags.h.drop(firstVolWrite(l0, ags.h) + 1)) | lsf(t).l) | lsf(t).t) | false) = (W(lsf(t).t, lsf(t).l, lsf(t).v), false) ' ∨ ((ags.h.take(firstVolWrite(l0, ags.h)) | lsf(t).l) | lsf(t).t) | false = [] ∧ ((l0 = lsf(t).l ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, ags.h.drop(firstVolWrite(l0, ags.h) + 1)) | lsf(t).l) | lsf(t).t) | false = [])

Heuristic elimination applied rule apply elim lemma

And obtained the following new goals

Rule argument

spec: FLITPSCweak, name:elim-mkFLITPSCgs, seq:⊦ (((mem = gs.mem ∧ p = gs.p) ∧ ctr = gs.ctr) ∧ writers = gs.writers) ∧ readers = gs.readers ↔ gs = mkFLITPSCgs(mem, p, ctr, writers, readers), subst:[gs, mem, ctr, p, readers, writers] → [gs, mem, ctr, p, writers0, writers]

Additional information

Used simplifier rules: ⊦ (((mem = gs.mem ∧ p = gs.p) ∧ ctr = gs.ctr) ∧ writers = gs.writers) ∧ readers = gs.readers ↔ gs = mkFLITPSCgs(mem, p, ctr, writers, readers); (elim) Used terms: gs, mem, ctr, writers, writers0, p

Proof step 6 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

ags.pm = mem, ags.vm = mem ⊕ p, ags.h[firstVolWrite(l0, ags.h)] = (e, boolvar), gs = mkFLITPSCgs(mem, p, ctr, writers, writers0), p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCInv((gs.mem:= mem(l0 := e.v)).p:= p(l0 := p(l0) -p firstPersistW(p(l0))), lsf, pcf), FLITPSCInv(gs, lsf, pcf), PLIBInv(ags, alsf, apcf), abs(ags.h, writers0, p), ∀ t. labs(gs, lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ lsf(t).t = alsf(t).t ∧ (pcf(t) = idle → apcf(t) = idle) ∧ (pcf(t) = ready → apcf(t) = ready) ∧ (pcf(t) = crashed → apcf(t) = crashed) ∧ (pcf(t) = R1 → apcf(t) = invRead) ∧ (pcf(t) = R2 ∨ pcf(t) = R3 ∨ pcf(t) = R4 → apcf(t) = resRead) ∧ (pcf(t) = W1 ∨ pcf(t) = W2 ∨ pcf(t) = W3 → apcf(t) = invWrite) ∧ (pcf(t) = W4 ∨ pcf(t) = W5 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → apcf(t) = resWrite) ∧ (pcf(t) = R1 → lsf(t).l = alsf(t).il) ∧ (pcf(t) = R2 ∨ pcf(t) = R3 ∨ pcf(t) = R4 → lsf(t).v = alsf(t).ov) ∧ (pcf(t) = W1 ∨ pcf(t) = W2 ∨ pcf(t) = W3 ∨ pcf(t) = W4 ∨ pcf(t) = W5 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → lsf(t).l = alsf(t).il ∧ lsf(t).v = alsf(t).iv) ∧ ( pcf(t) = idle ∨ pcf(t) = ready ∨ pcf(t) = R1 ∨ pcf(t) = R4 ∨ pcf(t) = W1 ∨ pcf(t) = W5 → ¬ FO(lsf(t).t) ∈ (l0 = l ⊃ p(l) -p firstPersistW(p(l));p(l)) → ((ags.h.take(firstVolWrite(l0, ags.h)) | l) | lsf(t).t) | false = [] ∧ ((l0 = l ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, ags.h.drop(firstVolWrite(l0, ags.h) + 1)) | l) | lsf(t).t) | false = []) ∧ ( pcf(t) = W2 ∨ pcf(t) = W3 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → ((ags.h.take(firstVolWrite(l0, ags.h)) | l1) | lsf(t).t) | false = [] ∧ ((l0 = l1 ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, ags.h.drop(firstVolWrite(l0, ags.h) + 1)) | l1) | lsf(t).t) | false = []) ∧ ( pcf(t) = R2 ∨ pcf(t) = R3 → l2 ≠ lsf(t).l ∧ ¬ FO(lsf(t).t) ∈ (l0 = l2 ⊃ p(l2) -p firstPersistW(p(l2));p(l2)) → ((ags.h.take(firstVolWrite(l0, ags.h)) | l2) | lsf(t).t) | false = [] ∧ ((l0 = l2 ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, ags.h.drop(firstVolWrite(l0, ags.h) + 1)) | l2) | lsf(t).t) | false = []) ∧ ( pcf(t) = R2 → ctr(lsf(t).l) = 0 → ((ags.h.take(firstVolWrite(l0, ags.h)) | lsf(t).l) | lsf(t).t) | false = [] ∧ ((l0 = lsf(t).l ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, ags.h.drop(firstVolWrite(l0, ags.h) + 1)) | lsf(t).l) | lsf(t).t) | false = []) ∧ ( pcf(t) = W4 → (((ags.h.take(firstVolWrite(l0, ags.h)) | lsf(t).l) | lsf(t).t) | false) + (((l0 = lsf(t).l ⊃ (e, true) ';[]) | lsf(t).t) | false) + (((persistDependentReads(l0, ags.h.drop(firstVolWrite(l0, ags.h) + 1)) | lsf(t).l) | lsf(t).t) | false) = (W(lsf(t).t, lsf(t).l, lsf(t).v), false) ' ∨ ((ags.h.take(firstVolWrite(l0, ags.h)) | lsf(t).l) | lsf(t).t) | false = [] ∧ ((l0 = lsf(t).l ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, ags.h.drop(firstVolWrite(l0, ags.h) + 1)) | lsf(t).l) | lsf(t).t) | false = [])

Heuristic simplifier applied rule simplifier

And obtained the following new goals

Rule argument

Additional information

Used simplifier rules: ⊦ # x = 0 ↔ x = []; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic ⊦ mkFLITPSCgs(mem, p, ctr, writers, writers0).p:= p0 = mkFLITPSCgs(mem, p0, ctr, writers, writers0); (s) ⊦ mkFLITPSCgs(mem, p, ctr, writers, writers0).mem:= mem0 = mkFLITPSCgs(mem0, p, ctr, writers, writers0); (s)

Proof step 7 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

ags.vm = ags.pm ⊕ p, ags.h[firstVolWrite(l0, ags.h)] = (e, boolvar), p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCInv(mkFLITPSCgs(ags.pm(l0 := e.v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCInv(mkFLITPSCgs(ags.pm, p, ctr, writers, writers0), lsf, pcf), PLIBInv(ags, alsf, apcf), abs(ags.h, writers0, p), ∀ t. labs(mkFLITPSCgs(ags.pm, p, ctr, writers, writers0), lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ lsf(t).t = alsf(t).t ∧ (pcf(t) = idle → apcf(t) = idle) ∧ (pcf(t) = ready → apcf(t) = ready) ∧ (pcf(t) = crashed → apcf(t) = crashed) ∧ (pcf(t) = R1 → apcf(t) = invRead) ∧ (pcf(t) = R2 ∨ pcf(t) = R3 ∨ pcf(t) = R4 → apcf(t) = resRead) ∧ (pcf(t) = W1 ∨ pcf(t) = W2 ∨ pcf(t) = W3 → apcf(t) = invWrite) ∧ (pcf(t) = W4 ∨ pcf(t) = W5 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → apcf(t) = resWrite) ∧ (pcf(t) = R1 → lsf(t).l = alsf(t).il) ∧ (pcf(t) = R2 ∨ pcf(t) = R3 ∨ pcf(t) = R4 → lsf(t).v = alsf(t).ov) ∧ (pcf(t) = W1 ∨ pcf(t) = W2 ∨ pcf(t) = W3 ∨ pcf(t) = W4 ∨ pcf(t) = W5 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → lsf(t).l = alsf(t).il ∧ lsf(t).v = alsf(t).iv) ∧ ( pcf(t) = idle ∨ pcf(t) = ready ∨ pcf(t) = R1 ∨ pcf(t) = R4 ∨ pcf(t) = W1 ∨ pcf(t) = W5 → ¬ FO(lsf(t).t) ∈ (l0 = l ⊃ p(l) -p firstPersistW(p(l));p(l)) → ((ags.h.take(firstVolWrite(l0, ags.h)) | l) | lsf(t).t) | false = [] ∧ ((l0 = l ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, ags.h.drop(firstVolWrite(l0, ags.h) + 1)) | l) | lsf(t).t) | false = []) ∧ ( pcf(t) = W2 ∨ pcf(t) = W3 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → ((ags.h.take(firstVolWrite(l0, ags.h)) | l1) | lsf(t).t) | false = [] ∧ ((l0 = l1 ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, ags.h.drop(firstVolWrite(l0, ags.h) + 1)) | l1) | lsf(t).t) | false = []) ∧ ( pcf(t) = R2 ∨ pcf(t) = R3 → l2 ≠ lsf(t).l ∧ ¬ FO(lsf(t).t) ∈ (l0 = l2 ⊃ p(l2) -p firstPersistW(p(l2));p(l2)) → ((ags.h.take(firstVolWrite(l0, ags.h)) | l2) | lsf(t).t) | false = [] ∧ ((l0 = l2 ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, ags.h.drop(firstVolWrite(l0, ags.h) + 1)) | l2) | lsf(t).t) | false = []) ∧ ( pcf(t) = R2 → ctr(lsf(t).l) = 0 → ((ags.h.take(firstVolWrite(l0, ags.h)) | lsf(t).l) | lsf(t).t) | false = [] ∧ ((l0 = lsf(t).l ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, ags.h.drop(firstVolWrite(l0, ags.h) + 1)) | lsf(t).l) | lsf(t).t) | false = []) ∧ ( pcf(t) = W4 → (((ags.h.take(firstVolWrite(l0, ags.h)) | lsf(t).l) | lsf(t).t) | false) + (((l0 = lsf(t).l ⊃ (e, true) ';[]) | lsf(t).t) | false) + (((persistDependentReads(l0, ags.h.drop(firstVolWrite(l0, ags.h) + 1)) | lsf(t).l) | lsf(t).t) | false) = (W(lsf(t).t, lsf(t).l, lsf(t).v), false) ' ∨ ((ags.h.take(firstVolWrite(l0, ags.h)) | lsf(t).l) | lsf(t).t) | false = [] ∧ ((l0 = lsf(t).l ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, ags.h.drop(firstVolWrite(l0, ags.h) + 1)) | lsf(t).l) | lsf(t).t) | false = [])

Heuristic elimination applied rule apply elim lemma

And obtained the following new goals

Rule argument

spec: PLIB, name:elim-mkPLIBgs, seq: ⊦ (vm = gs.vm ∧ pm = gs.pm) ∧ h = gs.h ↔ gs = mkPLIBgs(vm, pm, h), subst:[gs, vm, pm, h] → [ags, mem, mem0, h]

Additional information

Used simplifier rules: ⊦ (vm = gs.vm ∧ pm = gs.pm) ∧ h = gs.h ↔ gs = mkPLIBgs(vm, pm, h); (elim) Used terms: ags, mem, mem0, h

Proof step 8 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

h[firstVolWrite(l0, h)] = (e, boolvar), ags = mkPLIBgs(mem, mem0, h), mem = mem0 ⊕ p, p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf, pcf), FLITPSCInv(mkFLITPSCgs(mem0(l0 := e.v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), PLIBInv(ags, alsf, apcf), abs(h, writers0, p), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), ags, alsf(t), apcf(t)) ⊦ lsf(t).t = alsf(t).t ∧ (pcf(t) = idle → apcf(t) = idle) ∧ (pcf(t) = ready → apcf(t) = ready) ∧ (pcf(t) = crashed → apcf(t) = crashed) ∧ (pcf(t) = R1 → apcf(t) = invRead) ∧ (pcf(t) = R2 ∨ pcf(t) = R3 ∨ pcf(t) = R4 → apcf(t) = resRead) ∧ (pcf(t) = W1 ∨ pcf(t) = W2 ∨ pcf(t) = W3 → apcf(t) = invWrite) ∧ (pcf(t) = W4 ∨ pcf(t) = W5 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → apcf(t) = resWrite) ∧ (pcf(t) = R1 → lsf(t).l = alsf(t).il) ∧ (pcf(t) = R2 ∨ pcf(t) = R3 ∨ pcf(t) = R4 → lsf(t).v = alsf(t).ov) ∧ (pcf(t) = W1 ∨ pcf(t) = W2 ∨ pcf(t) = W3 ∨ pcf(t) = W4 ∨ pcf(t) = W5 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → lsf(t).l = alsf(t).il ∧ lsf(t).v = alsf(t).iv) ∧ ( pcf(t) = idle ∨ pcf(t) = ready ∨ pcf(t) = R1 ∨ pcf(t) = R4 ∨ pcf(t) = W1 ∨ pcf(t) = W5 → ¬ FO(lsf(t).t) ∈ (l0 = l ⊃ p(l) -p firstPersistW(p(l));p(l)) → ((h.take(firstVolWrite(l0, h)) | l) | lsf(t).t) | false = [] ∧ ((l0 = l ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l) | lsf(t).t) | false = []) ∧ ( pcf(t) = W2 ∨ pcf(t) = W3 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → ((h.take(firstVolWrite(l0, h)) | l1) | lsf(t).t) | false = [] ∧ ((l0 = l1 ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l1) | lsf(t).t) | false = []) ∧ ( pcf(t) = R2 ∨ pcf(t) = R3 → l2 ≠ lsf(t).l ∧ ¬ FO(lsf(t).t) ∈ (l0 = l2 ⊃ p(l2) -p firstPersistW(p(l2));p(l2)) → ((h.take(firstVolWrite(l0, h)) | l2) | lsf(t).t) | false = [] ∧ ((l0 = l2 ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l2) | lsf(t).t) | false = []) ∧ ( pcf(t) = R2 → ctr(lsf(t).l) = 0 → ((h.take(firstVolWrite(l0, h)) | lsf(t).l) | lsf(t).t) | false = [] ∧ ((l0 = lsf(t).l ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | lsf(t).l) | lsf(t).t) | false = []) ∧ ( pcf(t) = W4 → (((h.take(firstVolWrite(l0, h)) | lsf(t).l) | lsf(t).t) | false) + (((l0 = lsf(t).l ⊃ (e, true) ';[]) | lsf(t).t) | false) + (((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | lsf(t).l) | lsf(t).t) | false) = (W(lsf(t).t, lsf(t).l, lsf(t).v), false) ' ∨ ((h.take(firstVolWrite(l0, h)) | lsf(t).l) | lsf(t).t) | false = [] ∧ ((l0 = lsf(t).l ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | lsf(t).l) | lsf(t).t) | false = [])

Heuristic simplifier applied rule simplifier

And obtained the following new goals

Rule argument

Additional information

Proof step 9 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

h[firstVolWrite(l0, h)] = (e, boolvar), p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCInv(mkFLITPSCgs(mem0(l0 := e.v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf, pcf), PLIBInv(mkPLIBgs(mem0 ⊕ p, mem0, h), alsf, apcf), abs(h, writers0, p), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h), alsf(t), apcf(t)) ⊦ lsf(t).t = alsf(t).t ∧ (pcf(t) = idle → apcf(t) = idle) ∧ (pcf(t) = ready → apcf(t) = ready) ∧ (pcf(t) = crashed → apcf(t) = crashed) ∧ (pcf(t) = R1 → apcf(t) = invRead) ∧ (pcf(t) = R2 ∨ pcf(t) = R3 ∨ pcf(t) = R4 → apcf(t) = resRead) ∧ (pcf(t) = W1 ∨ pcf(t) = W2 ∨ pcf(t) = W3 → apcf(t) = invWrite) ∧ (pcf(t) = W4 ∨ pcf(t) = W5 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → apcf(t) = resWrite) ∧ (pcf(t) = R1 → lsf(t).l = alsf(t).il) ∧ (pcf(t) = R2 ∨ pcf(t) = R3 ∨ pcf(t) = R4 → lsf(t).v = alsf(t).ov) ∧ (pcf(t) = W1 ∨ pcf(t) = W2 ∨ pcf(t) = W3 ∨ pcf(t) = W4 ∨ pcf(t) = W5 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → lsf(t).l = alsf(t).il ∧ lsf(t).v = alsf(t).iv) ∧ ( pcf(t) = idle ∨ pcf(t) = ready ∨ pcf(t) = R1 ∨ pcf(t) = R4 ∨ pcf(t) = W1 ∨ pcf(t) = W5 → ¬ FO(lsf(t).t) ∈ (l0 = l ⊃ p(l) -p firstPersistW(p(l));p(l)) → ((h.take(firstVolWrite(l0, h)) | l) | lsf(t).t) | false = [] ∧ ((l0 = l ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l) | lsf(t).t) | false = []) ∧ ( pcf(t) = W2 ∨ pcf(t) = W3 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → ((h.take(firstVolWrite(l0, h)) | l1) | lsf(t).t) | false = [] ∧ ((l0 = l1 ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l1) | lsf(t).t) | false = []) ∧ ( pcf(t) = R2 ∨ pcf(t) = R3 → l2 ≠ lsf(t).l ∧ ¬ FO(lsf(t).t) ∈ (l0 = l2 ⊃ p(l2) -p firstPersistW(p(l2));p(l2)) → ((h.take(firstVolWrite(l0, h)) | l2) | lsf(t).t) | false = [] ∧ ((l0 = l2 ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l2) | lsf(t).t) | false = []) ∧ ( pcf(t) = R2 → ctr(lsf(t).l) = 0 → ((h.take(firstVolWrite(l0, h)) | lsf(t).l) | lsf(t).t) | false = [] ∧ ((l0 = lsf(t).l ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | lsf(t).l) | lsf(t).t) | false = []) ∧ ( pcf(t) = W4 → (((h.take(firstVolWrite(l0, h)) | lsf(t).l) | lsf(t).t) | false) + (((l0 = lsf(t).l ⊃ (e, true) ';[]) | lsf(t).t) | false) + (((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | lsf(t).l) | lsf(t).t) | false) = (W(lsf(t).t, lsf(t).l, lsf(t).v), false) ' ∨ ((h.take(firstVolWrite(l0, h)) | lsf(t).l) | lsf(t).t) | false = [] ∧ ((l0 = lsf(t).l ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | lsf(t).l) | lsf(t).t) | false = [])

User applied rule apply lemma

And obtained the following new goals

Rule argument

spec: PLIB-preds, name:first-vol-write-split, seq:⊦ firstVolWrite(l, h) < # h → (∃ t, v. h = h.take(firstVolWrite(l, h)) + ((W(t, l, v), false) + h.drop(firstVolWrite(l, h) + 1))), subst:[l, h] → [l0, h]

Additional information

Used terms: l0, h

Proof step 10 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

⊦ firstVolWrite(l, h) < # h → (∃ t, v. h = h.take(firstVolWrite(l, h)) + ((W(t, l, v), false) + h.drop(firstVolWrite(l, h) + 1)))

A spec-lemma

Proof step 11 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

h[firstVolWrite(l0, h)] = (e, boolvar), p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf, pcf), FLITPSCInv(mkFLITPSCgs(mem0(l0 := e.v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), PLIBInv(mkPLIBgs(mem0 ⊕ p, mem0, h), alsf, apcf), abs(h, writers0, p), firstVolWrite(l0, h) < # h → (∃ t, v. h = h.take(firstVolWrite(l0, h)) + ((W(t, l0, v), false) + h.drop(firstVolWrite(l0, h) + 1))), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h), alsf(t), apcf(t)) ⊦ lsf(t).t = alsf(t).t ∧ (pcf(t) = idle → apcf(t) = idle) ∧ (pcf(t) = ready → apcf(t) = ready) ∧ (pcf(t) = crashed → apcf(t) = crashed) ∧ (pcf(t) = R1 → apcf(t) = invRead) ∧ (pcf(t) = R2 ∨ pcf(t) = R3 ∨ pcf(t) = R4 → apcf(t) = resRead) ∧ (pcf(t) = W1 ∨ pcf(t) = W2 ∨ pcf(t) = W3 → apcf(t) = invWrite) ∧ (pcf(t) = W4 ∨ pcf(t) = W5 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → apcf(t) = resWrite) ∧ (pcf(t) = R1 → lsf(t).l = alsf(t).il) ∧ (pcf(t) = R2 ∨ pcf(t) = R3 ∨ pcf(t) = R4 → lsf(t).v = alsf(t).ov) ∧ (pcf(t) = W1 ∨ pcf(t) = W2 ∨ pcf(t) = W3 ∨ pcf(t) = W4 ∨ pcf(t) = W5 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → lsf(t).l = alsf(t).il ∧ lsf(t).v = alsf(t).iv) ∧ ( pcf(t) = idle ∨ pcf(t) = ready ∨ pcf(t) = R1 ∨ pcf(t) = R4 ∨ pcf(t) = W1 ∨ pcf(t) = W5 → ¬ FO(lsf(t).t) ∈ (l0 = l ⊃ p(l) -p firstPersistW(p(l));p(l)) → ((h.take(firstVolWrite(l0, h)) | l) | lsf(t).t) | false = [] ∧ ((l0 = l ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l) | lsf(t).t) | false = []) ∧ ( pcf(t) = W2 ∨ pcf(t) = W3 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → ((h.take(firstVolWrite(l0, h)) | l1) | lsf(t).t) | false = [] ∧ ((l0 = l1 ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l1) | lsf(t).t) | false = []) ∧ ( pcf(t) = R2 ∨ pcf(t) = R3 → l2 ≠ lsf(t).l ∧ ¬ FO(lsf(t).t) ∈ (l0 = l2 ⊃ p(l2) -p firstPersistW(p(l2));p(l2)) → ((h.take(firstVolWrite(l0, h)) | l2) | lsf(t).t) | false = [] ∧ ((l0 = l2 ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l2) | lsf(t).t) | false = []) ∧ ( pcf(t) = R2 → ctr(lsf(t).l) = 0 → ((h.take(firstVolWrite(l0, h)) | lsf(t).l) | lsf(t).t) | false = [] ∧ ((l0 = lsf(t).l ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | lsf(t).l) | lsf(t).t) | false = []) ∧ ( pcf(t) = W4 → (((h.take(firstVolWrite(l0, h)) | lsf(t).l) | lsf(t).t) | false) + (((l0 = lsf(t).l ⊃ (e, true) ';[]) | lsf(t).t) | false) + (((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | lsf(t).l) | lsf(t).t) | false) = (W(lsf(t).t, lsf(t).l, lsf(t).v), false) ' ∨ ((h.take(firstVolWrite(l0, h)) | lsf(t).l) | lsf(t).t) | false = [] ∧ ((l0 = lsf(t).l ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | lsf(t).l) | lsf(t).t) | false = [])

Heuristic simplifier applied rule simplifier

And obtained the following new goals

Rule argument

Additional information

Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a + x = a ' + x; (s) ⊦ abs(h, rs, p) ∧ firstPersistW(p(l)) < # p(l) → (h |W | l) | false ≠ []; (as) ⊦ firstVolWrite(l, h) < # h ↔ (h |W | l) | false ≠ []; (s)

Proof step 12 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

h[firstVolWrite(l0, h)] = (e, boolvar), h = h.take(firstVolWrite(l0, h)) + (W(t0, l0, v), false) ' + h.drop(firstVolWrite(l0, h) + 1), p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCInv(mkFLITPSCgs(mem0(l0 := e.v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf, pcf), PLIBInv(mkPLIBgs(mem0 ⊕ p, mem0, h), alsf, apcf), abs(h, writers0, p), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h), alsf(t), apcf(t)) ⊦ lsf(t).t = alsf(t).t ∧ (pcf(t) = idle → apcf(t) = idle) ∧ (pcf(t) = ready → apcf(t) = ready) ∧ (pcf(t) = crashed → apcf(t) = crashed) ∧ (pcf(t) = R1 → apcf(t) = invRead) ∧ (pcf(t) = R2 ∨ pcf(t) = R3 ∨ pcf(t) = R4 → apcf(t) = resRead) ∧ (pcf(t) = W1 ∨ pcf(t) = W2 ∨ pcf(t) = W3 → apcf(t) = invWrite) ∧ (pcf(t) = W4 ∨ pcf(t) = W5 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → apcf(t) = resWrite) ∧ (pcf(t) = R1 → lsf(t).l = alsf(t).il) ∧ (pcf(t) = R2 ∨ pcf(t) = R3 ∨ pcf(t) = R4 → lsf(t).v = alsf(t).ov) ∧ (pcf(t) = W1 ∨ pcf(t) = W2 ∨ pcf(t) = W3 ∨ pcf(t) = W4 ∨ pcf(t) = W5 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → lsf(t).l = alsf(t).il ∧ lsf(t).v = alsf(t).iv) ∧ ( pcf(t) = idle ∨ pcf(t) = ready ∨ pcf(t) = R1 ∨ pcf(t) = R4 ∨ pcf(t) = W1 ∨ pcf(t) = W5 → ¬ FO(lsf(t).t) ∈ (l0 = l ⊃ p(l) -p firstPersistW(p(l));p(l)) → ((h.take(firstVolWrite(l0, h)) | l) | lsf(t).t) | false = [] ∧ ((l0 = l ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l) | lsf(t).t) | false = []) ∧ ( pcf(t) = W2 ∨ pcf(t) = W3 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → ((h.take(firstVolWrite(l0, h)) | l1) | lsf(t).t) | false = [] ∧ ((l0 = l1 ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l1) | lsf(t).t) | false = []) ∧ ( pcf(t) = R2 ∨ pcf(t) = R3 → l2 ≠ lsf(t).l ∧ ¬ FO(lsf(t).t) ∈ (l0 = l2 ⊃ p(l2) -p firstPersistW(p(l2));p(l2)) → ((h.take(firstVolWrite(l0, h)) | l2) | lsf(t).t) | false = [] ∧ ((l0 = l2 ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l2) | lsf(t).t) | false = []) ∧ ( pcf(t) = R2 → ctr(lsf(t).l) = 0 → ((h.take(firstVolWrite(l0, h)) | lsf(t).l) | lsf(t).t) | false = [] ∧ ((l0 = lsf(t).l ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | lsf(t).l) | lsf(t).t) | false = []) ∧ ( pcf(t) = W4 → (((h.take(firstVolWrite(l0, h)) | lsf(t).l) | lsf(t).t) | false) + (((l0 = lsf(t).l ⊃ (e, true) ';[]) | lsf(t).t) | false) + (((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | lsf(t).l) | lsf(t).t) | false) = (W(lsf(t).t, lsf(t).l, lsf(t).v), false) ' ∨ ((h.take(firstVolWrite(l0, h)) | lsf(t).l) | lsf(t).t) | false = [] ∧ ((l0 = lsf(t).l ⊃ (e, true) ';[]) | lsf(t).t) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | lsf(t).l) | lsf(t).t) | false = [])

Heuristic elimination applied rule apply elim lemma

And obtained the following new goals

Rule argument

spec: FLITPSCweak, name:elim-mkFLITPSCls, seq: ⊦ (t = ls.t ∧ l = ls.l) ∧ v = ls.v ↔ ls = mkFLITPSCls(t, l, v), subst:[ls, t, l, v] → [lsf(t), t1, l3, v0]

Additional information

Used simplifier rules: ⊦ (t = ls.t ∧ l = ls.l) ∧ v = ls.v ↔ ls = mkFLITPSCls(t, l, v); (elim) Used terms: lsf(t), t1, l3, v0

Proof step 13 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

h[firstVolWrite(l0, h)] = (e, boolvar), h = h.take(firstVolWrite(l0, h)) + (W(t0, l0, v), false) ' + h.drop(firstVolWrite(l0, h) + 1), lsf(t) = mkFLITPSCls(t1, l3, v0), p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf, pcf), FLITPSCInv(mkFLITPSCgs(mem0(l0 := e.v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), PLIBInv(mkPLIBgs(mem0 ⊕ p, mem0, h), alsf, apcf), abs(h, writers0, p), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h), alsf(t), apcf(t)) ⊦ t1 = alsf(t).t ∧ (pcf(t) = idle → apcf(t) = idle) ∧ (pcf(t) = ready → apcf(t) = ready) ∧ (pcf(t) = crashed → apcf(t) = crashed) ∧ (pcf(t) = R1 → apcf(t) = invRead) ∧ (pcf(t) = R2 ∨ pcf(t) = R3 ∨ pcf(t) = R4 → apcf(t) = resRead) ∧ (pcf(t) = W1 ∨ pcf(t) = W2 ∨ pcf(t) = W3 → apcf(t) = invWrite) ∧ (pcf(t) = W4 ∨ pcf(t) = W5 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → apcf(t) = resWrite) ∧ (pcf(t) = R1 → l3 = alsf(t).il) ∧ (pcf(t) = R2 ∨ pcf(t) = R3 ∨ pcf(t) = R4 → v0 = alsf(t).ov) ∧ (pcf(t) = W1 ∨ pcf(t) = W2 ∨ pcf(t) = W3 ∨ pcf(t) = W4 ∨ pcf(t) = W5 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → l3 = alsf(t).il ∧ v0 = alsf(t).iv) ∧ ( pcf(t) = idle ∨ pcf(t) = ready ∨ pcf(t) = R1 ∨ pcf(t) = R4 ∨ pcf(t) = W1 ∨ pcf(t) = W5 → ¬ FO(t1) ∈ (l0 = l ⊃ p(l) -p firstPersistW(p(l));p(l)) → ((h.take(firstVolWrite(l0, h)) | l) | t1) | false = [] ∧ ((l0 = l ⊃ (e, true) ';[]) | t1) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l) | t1) | false = []) ∧ ( pcf(t) = W2 ∨ pcf(t) = W3 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → ((h.take(firstVolWrite(l0, h)) | l1) | t1) | false = [] ∧ ((l0 = l1 ⊃ (e, true) ';[]) | t1) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l1) | t1) | false = []) ∧ ( pcf(t) = R2 ∨ pcf(t) = R3 → l2 ≠ l3 ∧ ¬ FO(t1) ∈ (l0 = l2 ⊃ p(l2) -p firstPersistW(p(l2));p(l2)) → ((h.take(firstVolWrite(l0, h)) | l2) | t1) | false = [] ∧ ((l0 = l2 ⊃ (e, true) ';[]) | t1) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l2) | t1) | false = []) ∧ ( pcf(t) = R2 → ctr(l3) = 0 → ((h.take(firstVolWrite(l0, h)) | l3) | t1) | false = [] ∧ ((l0 = l3 ⊃ (e, true) ';[]) | t1) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t1) | false = []) ∧ ( pcf(t) = W4 → (((h.take(firstVolWrite(l0, h)) | l3) | t1) | false) + (((l0 = l3 ⊃ (e, true) ';[]) | t1) | false) + (((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t1) | false) = (W(t1, l3, v0), false) ' ∨ ((h.take(firstVolWrite(l0, h)) | l3) | t1) | false = [] ∧ ((l0 = l3 ⊃ (e, true) ';[]) | t1) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t1) | false = [])

Heuristic simplifier applied rule simplifier

And obtained the following new goals

Rule argument

Additional information

Proof step 14 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

h[firstVolWrite(l0, h)] = (e, boolvar), h = h.take(firstVolWrite(l0, h)) + (W(t0, l0, v), false) ' + h.drop(firstVolWrite(l0, h) + 1), lsf(t) = mkFLITPSCls(t1, l3, v0), p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCInv(mkFLITPSCgs(mem0(l0 := e.v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf, pcf), PLIBInv(mkPLIBgs(mem0 ⊕ p, mem0, h), alsf, apcf), abs(h, writers0, p), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h), alsf(t), apcf(t)) ⊦ t1 = alsf(t).t ∧ (pcf(t) = idle → apcf(t) = idle) ∧ (pcf(t) = ready → apcf(t) = ready) ∧ (pcf(t) = crashed → apcf(t) = crashed) ∧ (pcf(t) = R1 → apcf(t) = invRead) ∧ (pcf(t) = R2 ∨ pcf(t) = R3 ∨ pcf(t) = R4 → apcf(t) = resRead) ∧ (pcf(t) = W1 ∨ pcf(t) = W2 ∨ pcf(t) = W3 → apcf(t) = invWrite) ∧ (pcf(t) = W4 ∨ pcf(t) = W5 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → apcf(t) = resWrite) ∧ (pcf(t) = R1 → l3 = alsf(t).il) ∧ (pcf(t) = R2 ∨ pcf(t) = R3 ∨ pcf(t) = R4 → v0 = alsf(t).ov) ∧ (pcf(t) = W1 ∨ pcf(t) = W2 ∨ pcf(t) = W3 ∨ pcf(t) = W4 ∨ pcf(t) = W5 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → l3 = alsf(t).il ∧ v0 = alsf(t).iv) ∧ ( pcf(t) = idle ∨ pcf(t) = ready ∨ pcf(t) = R1 ∨ pcf(t) = R4 ∨ pcf(t) = W1 ∨ pcf(t) = W5 → ¬ FO(alsf(t).t) ∈ (l0 = l ⊃ p(l) -p firstPersistW(p(l));p(l)) → ((h.take(firstVolWrite(l0, h)) | l) | alsf(t).t) | false = [] ∧ ((l0 = l ⊃ (e, true) ';[]) | alsf(t).t) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l) | alsf(t).t) | false = []) ∧ ( pcf(t) = W2 ∨ pcf(t) = W3 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → ((h.take(firstVolWrite(l0, h)) | l1) | alsf(t).t) | false = [] ∧ ((l0 = l1 ⊃ (e, true) ';[]) | alsf(t).t) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l1) | alsf(t).t) | false = []) ∧ ( pcf(t) = R2 ∨ pcf(t) = R3 → l2 ≠ l3 ∧ ¬ FO(alsf(t).t) ∈ (l0 = l2 ⊃ p(l2) -p firstPersistW(p(l2));p(l2)) → ((h.take(firstVolWrite(l0, h)) | l2) | alsf(t).t) | false = [] ∧ ((l0 = l2 ⊃ (e, true) ';[]) | alsf(t).t) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l2) | alsf(t).t) | false = []) ∧ ( pcf(t) = R2 → ctr(l3) = 0 → ((h.take(firstVolWrite(l0, h)) | l3) | alsf(t).t) | false = [] ∧ ((l0 = l3 ⊃ (e, true) ';[]) | alsf(t).t) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | alsf(t).t) | false = []) ∧ ( pcf(t) = W4 → (((h.take(firstVolWrite(l0, h)) | l3) | alsf(t).t) | false) + (((l0 = l3 ⊃ (e, true) ';[]) | alsf(t).t) | false) + (((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | alsf(t).t) | false) = (W(alsf(t).t, l3, v0), false) ' ∨ ((h.take(firstVolWrite(l0, h)) | l3) | alsf(t).t) | false = [] ∧ ((l0 = l3 ⊃ (e, true) ';[]) | alsf(t).t) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | alsf(t).t) | false = [])

Heuristic elimination applied rule apply elim lemma

And obtained the following new goals

Rule argument

spec: PLIB, name:elim-mkPLIBls, seq: ⊦ ((t = ls.t ∧ il = ls.il) ∧ iv = ls.iv) ∧ ov = ls.ov ↔ ls = mkPLIBls(t, il, iv, ov), subst:[ls, t, iv, ov, il] → [alsf(t), t2, iv, ov, il]

Additional information

Used simplifier rules: ⊦ ((t = ls.t ∧ il = ls.il) ∧ iv = ls.iv) ∧ ov = ls.ov ↔ ls = mkPLIBls(t, il, iv, ov); (elim) Used terms: alsf(t), iv, t2, il, ov

Proof step 15 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

h[firstVolWrite(l0, h)] = (e, boolvar), alsf(t) = mkPLIBls(t2, il, iv, ov), h = h.take(firstVolWrite(l0, h)) + (W(t0, l0, v), false) ' + h.drop(firstVolWrite(l0, h) + 1), lsf(t) = mkFLITPSCls(t1, l3, v0), p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf, pcf), FLITPSCInv(mkFLITPSCgs(mem0(l0 := e.v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), PLIBInv(mkPLIBgs(mem0 ⊕ p, mem0, h), alsf, apcf), abs(h, writers0, p), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h), alsf(t), apcf(t)) ⊦ t1 = t2 ∧ (pcf(t) = idle → apcf(t) = idle) ∧ (pcf(t) = ready → apcf(t) = ready) ∧ (pcf(t) = crashed → apcf(t) = crashed) ∧ (pcf(t) = R1 → apcf(t) = invRead) ∧ (pcf(t) = R2 ∨ pcf(t) = R3 ∨ pcf(t) = R4 → apcf(t) = resRead) ∧ (pcf(t) = W1 ∨ pcf(t) = W2 ∨ pcf(t) = W3 → apcf(t) = invWrite) ∧ (pcf(t) = W4 ∨ pcf(t) = W5 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → apcf(t) = resWrite) ∧ (pcf(t) = R1 → l3 = il) ∧ (pcf(t) = R2 ∨ pcf(t) = R3 ∨ pcf(t) = R4 → v0 = ov) ∧ (pcf(t) = W1 ∨ pcf(t) = W2 ∨ pcf(t) = W3 ∨ pcf(t) = W4 ∨ pcf(t) = W5 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → l3 = il ∧ v0 = iv) ∧ ( pcf(t) = idle ∨ pcf(t) = ready ∨ pcf(t) = R1 ∨ pcf(t) = R4 ∨ pcf(t) = W1 ∨ pcf(t) = W5 → ¬ FO(t2) ∈ (l0 = l ⊃ p(l) -p firstPersistW(p(l));p(l)) → ((h.take(firstVolWrite(l0, h)) | l) | t2) | false = [] ∧ ((l0 = l ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l) | t2) | false = []) ∧ ( pcf(t) = W2 ∨ pcf(t) = W3 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → ((h.take(firstVolWrite(l0, h)) | l1) | t2) | false = [] ∧ ((l0 = l1 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l1) | t2) | false = []) ∧ ( pcf(t) = R2 ∨ pcf(t) = R3 → l2 ≠ l3 ∧ ¬ FO(t2) ∈ (l0 = l2 ⊃ p(l2) -p firstPersistW(p(l2));p(l2)) → ((h.take(firstVolWrite(l0, h)) | l2) | t2) | false = [] ∧ ((l0 = l2 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l2) | t2) | false = []) ∧ ( pcf(t) = R2 → ctr(l3) = 0 → ((h.take(firstVolWrite(l0, h)) | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t2) | false = []) ∧ ( pcf(t) = W4 → (((h.take(firstVolWrite(l0, h)) | l3) | t2) | false) + (((l0 = l3 ⊃ (e, true) ';[]) | t2) | false) + (((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h.take(firstVolWrite(l0, h)) | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t2) | false = [])

User applied rule apply rewrite lemma

And obtained the following new goals

Rule argument

spec: FLITPSCweak, name:FLITPSCInv, seq:⊦ FLITPSCInv(gs, lsf, pcf) ↔ FLITPSCGInv(gs) ∧ (∀ t. lsf(t).t = t ∧ FLITPSCLInv(gs, lsf(t), pcf(t))), subst:[gs, lsf, pcf] → [mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf, pcf], <all paths>

Additional information

Used terms: mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf, pcf

Proof step 16 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

⊦ FLITPSCInv(gs, lsf, pcf) ↔ FLITPSCGInv(gs) ∧ (∀ t. lsf(t).t = t ∧ FLITPSCLInv(gs, lsf(t), pcf(t)))

A spec-lemma

Proof step 17 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

h[firstVolWrite(l0, h)] = (e, boolvar), alsf(t) = mkPLIBls(t2, il, iv, ov), h = h.take(firstVolWrite(l0, h)) + (W(t0, l0, v), false) ' + h.drop(firstVolWrite(l0, h) + 1), lsf(t) = mkFLITPSCls(t1, l3, v0), p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := e.v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), PLIBInv(mkPLIBgs(mem0 ⊕ p, mem0, h), alsf, apcf), abs(h, writers0, p), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h), alsf(t), apcf(t)), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)) ⊦ t1 = t2 ∧ (pcf(t) = idle → apcf(t) = idle) ∧ (pcf(t) = ready → apcf(t) = ready) ∧ (pcf(t) = crashed → apcf(t) = crashed) ∧ (pcf(t) = R1 → apcf(t) = invRead) ∧ (pcf(t) = R2 ∨ pcf(t) = R3 ∨ pcf(t) = R4 → apcf(t) = resRead) ∧ (pcf(t) = W1 ∨ pcf(t) = W2 ∨ pcf(t) = W3 → apcf(t) = invWrite) ∧ (pcf(t) = W4 ∨ pcf(t) = W5 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → apcf(t) = resWrite) ∧ (pcf(t) = R1 → l3 = il) ∧ (pcf(t) = R2 ∨ pcf(t) = R3 ∨ pcf(t) = R4 → v0 = ov) ∧ (pcf(t) = W1 ∨ pcf(t) = W2 ∨ pcf(t) = W3 ∨ pcf(t) = W4 ∨ pcf(t) = W5 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → l3 = il ∧ v0 = iv) ∧ ( pcf(t) = idle ∨ pcf(t) = ready ∨ pcf(t) = R1 ∨ pcf(t) = R4 ∨ pcf(t) = W1 ∨ pcf(t) = W5 → ¬ FO(t2) ∈ (l0 = l ⊃ p(l) -p firstPersistW(p(l));p(l)) → ((h.take(firstVolWrite(l0, h)) | l) | t2) | false = [] ∧ ((l0 = l ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l) | t2) | false = []) ∧ ( pcf(t) = W2 ∨ pcf(t) = W3 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → ((h.take(firstVolWrite(l0, h)) | l1) | t2) | false = [] ∧ ((l0 = l1 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l1) | t2) | false = []) ∧ ( pcf(t) = R2 ∨ pcf(t) = R3 → l2 ≠ l3 ∧ ¬ FO(t2) ∈ (l0 = l2 ⊃ p(l2) -p firstPersistW(p(l2));p(l2)) → ((h.take(firstVolWrite(l0, h)) | l2) | t2) | false = [] ∧ ((l0 = l2 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l2) | t2) | false = []) ∧ ( pcf(t) = R2 → ctr(l3) = 0 → ((h.take(firstVolWrite(l0, h)) | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t2) | false = []) ∧ ( pcf(t) = W4 → (((h.take(firstVolWrite(l0, h)) | l3) | t2) | false) + (((l0 = l3 ⊃ (e, true) ';[]) | t2) | false) + (((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h.take(firstVolWrite(l0, h)) | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t2) | false = [])

User applied rule all left

And obtained the following new goals

Rule argument

pos: left 12 terms: t abort: F discard: F computed: F

Additional information

Used terms: t

Proof step 18 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

lsf(t).t = t, h[firstVolWrite(l0, h)] = (e, boolvar), alsf(t) = mkPLIBls(t2, il, iv, ov), h = h.take(firstVolWrite(l0, h)) + (W(t0, l0, v), false) ' + h.drop(firstVolWrite(l0, h) + 1), lsf(t) = mkFLITPSCls(t1, l3, v0), p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := e.v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), PLIBInv(mkPLIBgs(mem0 ⊕ p, mem0, h), alsf, apcf), abs(h, writers0, p), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h), alsf(t), apcf(t)) ⊦ t1 = t2 ∧ (pcf(t) = idle → apcf(t) = idle) ∧ (pcf(t) = ready → apcf(t) = ready) ∧ (pcf(t) = crashed → apcf(t) = crashed) ∧ (pcf(t) = R1 → apcf(t) = invRead) ∧ (pcf(t) = R2 ∨ pcf(t) = R3 ∨ pcf(t) = R4 → apcf(t) = resRead) ∧ (pcf(t) = W1 ∨ pcf(t) = W2 ∨ pcf(t) = W3 → apcf(t) = invWrite) ∧ (pcf(t) = W4 ∨ pcf(t) = W5 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → apcf(t) = resWrite) ∧ (pcf(t) = R1 → l3 = il) ∧ (pcf(t) = R2 ∨ pcf(t) = R3 ∨ pcf(t) = R4 → v0 = ov) ∧ (pcf(t) = W1 ∨ pcf(t) = W2 ∨ pcf(t) = W3 ∨ pcf(t) = W4 ∨ pcf(t) = W5 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → l3 = il ∧ v0 = iv) ∧ ( pcf(t) = idle ∨ pcf(t) = ready ∨ pcf(t) = R1 ∨ pcf(t) = R4 ∨ pcf(t) = W1 ∨ pcf(t) = W5 → ¬ FO(t2) ∈ (l0 = l ⊃ p(l) -p firstPersistW(p(l));p(l)) → ((h.take(firstVolWrite(l0, h)) | l) | t2) | false = [] ∧ ((l0 = l ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l) | t2) | false = []) ∧ ( pcf(t) = W2 ∨ pcf(t) = W3 ∨ pcf(t) = W6 ∨ pcf(t) = W7 → ((h.take(firstVolWrite(l0, h)) | l1) | t2) | false = [] ∧ ((l0 = l1 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l1) | t2) | false = []) ∧ ( pcf(t) = R2 ∨ pcf(t) = R3 → l2 ≠ l3 ∧ ¬ FO(t2) ∈ (l0 = l2 ⊃ p(l2) -p firstPersistW(p(l2));p(l2)) → ((h.take(firstVolWrite(l0, h)) | l2) | t2) | false = [] ∧ ((l0 = l2 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l2) | t2) | false = []) ∧ ( pcf(t) = R2 → ctr(l3) = 0 → ((h.take(firstVolWrite(l0, h)) | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t2) | false = []) ∧ ( pcf(t) = W4 → (((h.take(firstVolWrite(l0, h)) | l3) | t2) | false) + (((l0 = l3 ⊃ (e, true) ';[]) | t2) | false) + (((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h.take(firstVolWrite(l0, h)) | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t2) | false = [])

Heuristic simplifier applied rule simplifier

And obtained the following new goals

Rule argument

Additional information

Used simplifier rules: ⊦ mkFLITPSCls(t, l, v).t = t; (s)

Proof step 19 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

h[firstVolWrite(l0, h)] = (e, boolvar), alsf(t1) = mkPLIBls(t2, il, iv, ov), h = h.take(firstVolWrite(l0, h)) + (W(t0, l0, v), false) ' + h.drop(firstVolWrite(l0, h) + 1), lsf(t1) = mkFLITPSCls(t1, l3, v0), p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := e.v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t1, l3, v0), pcf(t1)), PLIBInv(mkPLIBgs(mem0 ⊕ p, mem0, h), alsf, apcf), abs(h, writers0, p), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h), alsf(t), apcf(t)) ⊦ t1 = t2 ∧ (pcf(t2) = idle → apcf(t2) = idle) ∧ (pcf(t2) = ready → apcf(t2) = ready) ∧ (pcf(t2) = crashed → apcf(t2) = crashed) ∧ (pcf(t2) = R1 → apcf(t2) = invRead) ∧ (pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead) ∧ (pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite) ∧ (pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite) ∧ (pcf(t2) = R1 → l3 = il) ∧ (pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov) ∧ (pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv) ∧ ( pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → ¬ FO(t2) ∈ (l0 = l ⊃ p(l) -p firstPersistW(p(l));p(l)) → ((h.take(firstVolWrite(l0, h)) | l) | t2) | false = [] ∧ ((l0 = l ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l) | t2) | false = []) ∧ ( pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → ((h.take(firstVolWrite(l0, h)) | l1) | t2) | false = [] ∧ ((l0 = l1 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l1) | t2) | false = []) ∧ ( pcf(t2) = R2 ∨ pcf(t2) = R3 → l2 ≠ l3 ∧ ¬ FO(t2) ∈ (l0 = l2 ⊃ p(l2) -p firstPersistW(p(l2));p(l2)) → ((h.take(firstVolWrite(l0, h)) | l2) | t2) | false = [] ∧ ((l0 = l2 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l2) | t2) | false = []) ∧ ( pcf(t2) = R2 → ctr(l3) = 0 → ((h.take(firstVolWrite(l0, h)) | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t2) | false = []) ∧ ( pcf(t2) = W4 → (((h.take(firstVolWrite(l0, h)) | l3) | t2) | false) + (((l0 = l3 ⊃ (e, true) ';[]) | t2) | false) + (((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h.take(firstVolWrite(l0, h)) | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t2) | false = [])

User applied rule apply rewrite lemma

And obtained the following new goals

Rule argument

spec: PLIB, name:PLIBInv, seq:⊦ PLIBInv(gs, lsf, pcf) ↔ PLIBGInv(gs) ∧ (∀ t. lsf(t).t = t ∧ PLIBLInv(gs, lsf(t), pcf(t))), subst:[gs, lsf, pcf] → [mkPLIBgs(mem0 ⊕ p, mem0, h), alsf, apcf], <all paths>

Additional information

Used terms: mkPLIBgs(mem0 ⊕ p, mem0, h), alsf, apcf

Proof step 20 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

⊦ PLIBInv(gs, lsf, pcf) ↔ PLIBGInv(gs) ∧ (∀ t. lsf(t).t = t ∧ PLIBLInv(gs, lsf(t), pcf(t)))

A spec-lemma

Proof step 21 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

h[firstVolWrite(l0, h)] = (e, boolvar), alsf(t1) = mkPLIBls(t2, il, iv, ov), h = h.take(firstVolWrite(l0, h)) + (W(t0, l0, v), false) ' + h.drop(firstVolWrite(l0, h) + 1), lsf(t1) = mkFLITPSCls(t1, l3, v0), p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := e.v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t1, l3, v0), pcf(t1)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h)), abs(h, writers0, p), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h), alsf(t), apcf(t)), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h), alsf(t), apcf(t)) ⊦ t1 = t2 ∧ (pcf(t2) = idle → apcf(t2) = idle) ∧ (pcf(t2) = ready → apcf(t2) = ready) ∧ (pcf(t2) = crashed → apcf(t2) = crashed) ∧ (pcf(t2) = R1 → apcf(t2) = invRead) ∧ (pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead) ∧ (pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite) ∧ (pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite) ∧ (pcf(t2) = R1 → l3 = il) ∧ (pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov) ∧ (pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv) ∧ ( pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → ¬ FO(t2) ∈ (l0 = l ⊃ p(l) -p firstPersistW(p(l));p(l)) → ((h.take(firstVolWrite(l0, h)) | l) | t2) | false = [] ∧ ((l0 = l ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l) | t2) | false = []) ∧ ( pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → ((h.take(firstVolWrite(l0, h)) | l1) | t2) | false = [] ∧ ((l0 = l1 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l1) | t2) | false = []) ∧ ( pcf(t2) = R2 ∨ pcf(t2) = R3 → l2 ≠ l3 ∧ ¬ FO(t2) ∈ (l0 = l2 ⊃ p(l2) -p firstPersistW(p(l2));p(l2)) → ((h.take(firstVolWrite(l0, h)) | l2) | t2) | false = [] ∧ ((l0 = l2 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l2) | t2) | false = []) ∧ ( pcf(t2) = R2 → ctr(l3) = 0 → ((h.take(firstVolWrite(l0, h)) | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t2) | false = []) ∧ ( pcf(t2) = W4 → (((h.take(firstVolWrite(l0, h)) | l3) | t2) | false) + (((l0 = l3 ⊃ (e, true) ';[]) | t2) | false) + (((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h.take(firstVolWrite(l0, h)) | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t2) | false = [])

User applied rule all left

And obtained the following new goals

Rule argument

pos: left 14 terms: t1 abort: F discard: F computed: T

Additional information

Used terms: t1

Proof step 22 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

alsf(t1).t = t1, h[firstVolWrite(l0, h)] = (e, boolvar), alsf(t1) = mkPLIBls(t2, il, iv, ov), h = h.take(firstVolWrite(l0, h)) + (W(t0, l0, v), false) ' + h.drop(firstVolWrite(l0, h) + 1), lsf(t1) = mkFLITPSCls(t1, l3, v0), p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := e.v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t1, l3, v0), pcf(t1)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h), alsf(t1), apcf(t1)), abs(h, writers0, p), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h), alsf(t), apcf(t)), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h), alsf(t), apcf(t)) ⊦ t1 = t2 ∧ (pcf(t2) = idle → apcf(t2) = idle) ∧ (pcf(t2) = ready → apcf(t2) = ready) ∧ (pcf(t2) = crashed → apcf(t2) = crashed) ∧ (pcf(t2) = R1 → apcf(t2) = invRead) ∧ (pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead) ∧ (pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite) ∧ (pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite) ∧ (pcf(t2) = R1 → l3 = il) ∧ (pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov) ∧ (pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv) ∧ ( pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → ¬ FO(t2) ∈ (l0 = l ⊃ p(l) -p firstPersistW(p(l));p(l)) → ((h.take(firstVolWrite(l0, h)) | l) | t2) | false = [] ∧ ((l0 = l ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l) | t2) | false = []) ∧ ( pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → ((h.take(firstVolWrite(l0, h)) | l1) | t2) | false = [] ∧ ((l0 = l1 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l1) | t2) | false = []) ∧ ( pcf(t2) = R2 ∨ pcf(t2) = R3 → l2 ≠ l3 ∧ ¬ FO(t2) ∈ (l0 = l2 ⊃ p(l2) -p firstPersistW(p(l2));p(l2)) → ((h.take(firstVolWrite(l0, h)) | l2) | t2) | false = [] ∧ ((l0 = l2 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l2) | t2) | false = []) ∧ ( pcf(t2) = R2 → ctr(l3) = 0 → ((h.take(firstVolWrite(l0, h)) | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t2) | false = []) ∧ ( pcf(t2) = W4 → (((h.take(firstVolWrite(l0, h)) | l3) | t2) | false) + (((l0 = l3 ⊃ (e, true) ';[]) | t2) | false) + (((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h.take(firstVolWrite(l0, h)) | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t2) | false = [])

Heuristic simplifier applied rule simplifier

And obtained the following new goals

Rule argument

Additional information

Used simplifier rules: ⊦ mkPLIBls(t, il, iv, iv0).t = t; (s)

Proof step 23 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

h[firstVolWrite(l0, h)] = (e, boolvar), alsf(t2) = mkPLIBls(t2, il, iv, ov), h = h.take(firstVolWrite(l0, h)) + (W(t0, l0, v), false) ' + h.drop(firstVolWrite(l0, h) + 1), lsf(t2) = mkFLITPSCls(t2, l3, v0), p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := e.v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, v0), pcf(t2)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h), mkPLIBls(t2, il, iv, ov), apcf(t2)), abs(h, writers0, p), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h), alsf(t), apcf(t)), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h), alsf(t), apcf(t)) ⊦ (pcf(t2) = idle → apcf(t2) = idle) ∧ (pcf(t2) = ready → apcf(t2) = ready) ∧ (pcf(t2) = crashed → apcf(t2) = crashed) ∧ (pcf(t2) = R1 → apcf(t2) = invRead) ∧ (pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead) ∧ (pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite) ∧ (pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite) ∧ (pcf(t2) = R1 → l3 = il) ∧ (pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov) ∧ (pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv) ∧ ( pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → ¬ FO(t2) ∈ (l0 = l ⊃ p(l) -p firstPersistW(p(l));p(l)) → ((h.take(firstVolWrite(l0, h)) | l) | t2) | false = [] ∧ ((l0 = l ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l) | t2) | false = []) ∧ ( pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → ((h.take(firstVolWrite(l0, h)) | l1) | t2) | false = [] ∧ ((l0 = l1 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l1) | t2) | false = []) ∧ ( pcf(t2) = R2 ∨ pcf(t2) = R3 → l2 ≠ l3 ∧ ¬ FO(t2) ∈ (l0 = l2 ⊃ p(l2) -p firstPersistW(p(l2));p(l2)) → ((h.take(firstVolWrite(l0, h)) | l2) | t2) | false = [] ∧ ((l0 = l2 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l2) | t2) | false = []) ∧ ( pcf(t2) = R2 → ctr(l3) = 0 → ((h.take(firstVolWrite(l0, h)) | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t2) | false = []) ∧ ( pcf(t2) = W4 → (((h.take(firstVolWrite(l0, h)) | l3) | t2) | false) + (((l0 = l3 ⊃ (e, true) ';[]) | t2) | false) + (((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h.take(firstVolWrite(l0, h)) | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t2) | false = [])

User applied rule all left

And obtained the following new goals

Rule argument

pos: left 15 terms: t2 abort: F discard: F computed: F

Additional information

Used terms: t2

Proof step 24 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

h[firstVolWrite(l0, h)] = (e, boolvar), alsf(t2) = mkPLIBls(t2, il, iv, ov), h = h.take(firstVolWrite(l0, h)) + (W(t0, l0, v), false) ' + h.drop(firstVolWrite(l0, h) + 1), lsf(t2) = mkFLITPSCls(t2, l3, v0), p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := e.v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, v0), pcf(t2)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h), mkPLIBls(t2, il, iv, ov), apcf(t2)), abs(h, writers0, p), labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t2), pcf(t2), mkPLIBgs(mem0 ⊕ p, mem0, h), alsf(t2), apcf(t2)), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h), alsf(t), apcf(t)), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h), alsf(t), apcf(t)) ⊦ (pcf(t2) = idle → apcf(t2) = idle) ∧ (pcf(t2) = ready → apcf(t2) = ready) ∧ (pcf(t2) = crashed → apcf(t2) = crashed) ∧ (pcf(t2) = R1 → apcf(t2) = invRead) ∧ (pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead) ∧ (pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite) ∧ (pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite) ∧ (pcf(t2) = R1 → l3 = il) ∧ (pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov) ∧ (pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv) ∧ ( pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → ¬ FO(t2) ∈ (l0 = l ⊃ p(l) -p firstPersistW(p(l));p(l)) → ((h.take(firstVolWrite(l0, h)) | l) | t2) | false = [] ∧ ((l0 = l ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l) | t2) | false = []) ∧ ( pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → ((h.take(firstVolWrite(l0, h)) | l1) | t2) | false = [] ∧ ((l0 = l1 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l1) | t2) | false = []) ∧ ( pcf(t2) = R2 ∨ pcf(t2) = R3 → l2 ≠ l3 ∧ ¬ FO(t2) ∈ (l0 = l2 ⊃ p(l2) -p firstPersistW(p(l2));p(l2)) → ((h.take(firstVolWrite(l0, h)) | l2) | t2) | false = [] ∧ ((l0 = l2 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l2) | t2) | false = []) ∧ ( pcf(t2) = R2 → ctr(l3) = 0 → ((h.take(firstVolWrite(l0, h)) | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t2) | false = []) ∧ ( pcf(t2) = W4 → (((h.take(firstVolWrite(l0, h)) | l3) | t2) | false) + (((l0 = l3 ⊃ (e, true) ';[]) | t2) | false) + (((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h.take(firstVolWrite(l0, h)) | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t2) | false = [])

Heuristic simplifier applied rule simplifier

And obtained the following new goals

Rule argument

Additional information

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 = invRead) ∧ (pc = R2 ∨ pc = R3 ∨ pc = R4 → apc = resRead) ∧ (pc = W1 ∨ pc = W2 ∨ pc = W3 → apc = invWrite) ∧ (pc = W4 ∨ pc = W5 ∨ pc = W6 ∨ pc = W7 → apc = resWrite) ∧ (pc = R1 → ls.l = als.il) ∧ (pc = R2 ∨ pc = R3 ∨ pc = R4 → ls.v = als.ov) ∧ ( pc = W1 ∨ pc = W2 ∨ pc = W3 ∨ pc = W4 ∨ pc = W5 ∨ pc = W6 ∨ pc = W7 → ls.l = als.il ∧ ls.v = als.iv) ∧ ( pc = idle ∨ pc = ready ∨ pc = R1 ∨ pc = R4 ∨ pc = W1 ∨ pc = W5 → (∀ l. ¬ FO(ls.t) ∈ gs.p(l) → ((ags.h | l) | ls.t) | false = [])) ∧ (pc = W2 ∨ pc = W3 ∨ pc = W6 ∨ pc = W7 → (∀ l. ((ags.h | l) | ls.t) | false = [])) ∧ ( pc = R2 ∨ pc = R3 → (∀ l0. l0 ≠ ls.l ∧ ¬ FO(ls.t) ∈ gs.p(l0) → ((ags.h | l0) | ls.t) | false = [])) ∧ (pc = R2 → gs.ctr(ls.l) = 0 → ((ags.h | ls.l) | ls.t) | false = []) ∧ ( pc = W4 → ((ags.h | ls.l) | ls.t) | false = (W(ls.t, ls.l, ls.v), false) ' ∨ ((ags.h | ls.l) | ls.t) | false = []); ⊦ mkPLIBls(t, il, iv, iv0).il = il; (s) ⊦ mkFLITPSCls(t, l, v).l = l; (s) ⊦ mkPLIBls(t, il, iv, iv0).ov = iv0; (s) ⊦ mkFLITPSCls(t, l, v).v = v; (s) ⊦ mkPLIBls(t, il, iv, iv0).iv = iv; (s) ⊦ mkPLIBls(t, il, iv, iv0).t = t; (s) ⊦ mkFLITPSCls(t, l, v).t = t; (s) ⊦ mkPLIBgs(vm, vm0, h).h = h; (s) ⊦ mkFLITPSCgs(mem, p, ctr, writers, writers0).ctr = ctr; (s) ⊦ mkFLITPSCgs(mem, p, ctr, writers, writers0).p = p; (s)

Proof step 25 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

h[firstVolWrite(l0, h)] = (e, boolvar), alsf(t2) = mkPLIBls(t2, il, iv, ov), h = h.take(firstVolWrite(l0, h)) + (W(t0, l0, v), false) ' + h.drop(firstVolWrite(l0, h) + 1), lsf(t2) = mkFLITPSCls(t2, l3, v0), p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := e.v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, v0), pcf(t2)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h), mkPLIBls(t2, il, iv, ov), apcf(t2)), abs(h, writers0, p), pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead, pcf(t2) = R1 → apcf(t2) = invRead, pcf(t2) = crashed → apcf(t2) = crashed, pcf(t2) = ready → apcf(t2) = ready, pcf(t2) = idle → apcf(t2) = idle, pcf(t2) = W4 → ((h | l3) | t2) | false = (W(t2, l3, v0), false) ' ∨ ((h | l3) | t2) | false = [], pcf(t2) = R2 → ctr(l3) = 0 → ((h | l3) | t2) | false = [], pcf(t2) = R2 ∨ pcf(t2) = R3 → (∀ l4. l4 ≠ l3 ∧ ¬ FO(t2) ∈ p(l4) → ((h | l4) | t2) | false = []), pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → (∀ l4. ((h | l4) | t2) | false = []), pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → (∀ l4. ¬ FO(t2) ∈ p(l4) → ((h | l4) | t2) | false = []), pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov, pcf(t2) = R1 → l3 = il, ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h), alsf(t), apcf(t)), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h), alsf(t), apcf(t)) ⊦ ( pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → ¬ FO(t2) ∈ (l0 = l ⊃ p(l) -p firstPersistW(p(l));p(l)) → ((h.take(firstVolWrite(l0, h)) | l) | t2) | false = [] ∧ ((l0 = l ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l) | t2) | false = []) ∧ ( pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → ((h.take(firstVolWrite(l0, h)) | l1) | t2) | false = [] ∧ ((l0 = l1 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l1) | t2) | false = []) ∧ ( pcf(t2) = R2 ∨ pcf(t2) = R3 → l2 ≠ l3 ∧ ¬ FO(t2) ∈ (l0 = l2 ⊃ p(l2) -p firstPersistW(p(l2));p(l2)) → ((h.take(firstVolWrite(l0, h)) | l2) | t2) | false = [] ∧ ((l0 = l2 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l2) | t2) | false = []) ∧ ( pcf(t2) = R2 → ctr(l3) = 0 → ((h.take(firstVolWrite(l0, h)) | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t2) | false = []) ∧ ( pcf(t2) = W4 → (((h.take(firstVolWrite(l0, h)) | l3) | t2) | false) + (((l0 = l3 ⊃ (e, true) ';[]) | t2) | false) + (((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h.take(firstVolWrite(l0, h)) | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t2) | false = [])

User applied rule apply elim lemma

And obtained the following new goals

Rule argument

spec: list-del, name:elim-firstn-restn, seq: ⊦ n ≤ # x → (y = x.take(n) ∧ z = x.drop(n) ↔ x = y + z ∧ # y = n), subst:[x, n, y, z] → [h, firstVolWrite(l0, h), h0, h1]; ['a] → [(RWevent, Bool)]

Additional information

Used simplifier rules: ⊦ m ≤ n ↔ ¬ n < m; (ss) ⊦ ¬ # h < firstVolWrite(l, h); (s) ⊦ n ≤ # x → (y = x.take(n) ∧ z = x.drop(n) ↔ x = y + z ∧ # y = n); (elim) Used terms: h, firstVolWrite(l0, h), h0, h1

Proof step 26 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l0, h), h[firstVolWrite(l0, h)] = (e, boolvar), alsf(t2) = mkPLIBls(t2, il, iv, ov), h = h0 + (W(t0, l0, v), false) ' + h.drop(firstVolWrite(l0, h) + 1), h = h0 + h1, lsf(t2) = mkFLITPSCls(t2, l3, v0), p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := e.v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, v0), pcf(t2)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h), mkPLIBls(t2, il, iv, ov), apcf(t2)), abs(h, writers0, p), firstVolWrite(l0, h) ≤ # h, pcf(t2) = R1 → l3 = il, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv, pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → (∀ l4. ¬ FO(t2) ∈ p(l4) → ((h | l4) | t2) | false = []), pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → (∀ l4. ((h | l4) | t2) | false = []), pcf(t2) = R2 ∨ pcf(t2) = R3 → (∀ l4. l4 ≠ l3 ∧ ¬ FO(t2) ∈ p(l4) → ((h | l4) | t2) | false = []), pcf(t2) = R2 → ctr(l3) = 0 → ((h | l3) | t2) | false = [], pcf(t2) = W4 → ((h | l3) | t2) | false = (W(t2, l3, v0), false) ' ∨ ((h | l3) | t2) | false = [], pcf(t2) = idle → apcf(t2) = idle, pcf(t2) = ready → apcf(t2) = ready, pcf(t2) = crashed → apcf(t2) = crashed, pcf(t2) = R1 → apcf(t2) = invRead, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite, pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite, ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h), alsf(t), apcf(t)), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h), alsf(t), apcf(t)) ⊦ ( pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → ¬ FO(t2) ∈ (l0 = l ⊃ p(l) -p firstPersistW(p(l));p(l)) → ((h0 | l) | t2) | false = [] ∧ ((l0 = l ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l) | t2) | false = []) ∧ ( pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → ((h0 | l1) | t2) | false = [] ∧ ((l0 = l1 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l1) | t2) | false = []) ∧ ( pcf(t2) = R2 ∨ pcf(t2) = R3 → l2 ≠ l3 ∧ ¬ FO(t2) ∈ (l0 = l2 ⊃ p(l2) -p firstPersistW(p(l2));p(l2)) → ((h0 | l2) | t2) | false = [] ∧ ((l0 = l2 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l2) | t2) | false = []) ∧ ( pcf(t2) = R2 → ctr(l3) = 0 → ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t2) | false = []) ∧ ( pcf(t2) = W4 → (((h0 | l3) | t2) | false) + (((l0 = l3 ⊃ (e, true) ';[]) | t2) | false) + (((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h.drop(firstVolWrite(l0, h) + 1)) | l3) | t2) | false = [])

Heuristic simplifier applied rule simplifier

And obtained the following new goals

Rule argument

Additional information

Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ (x + y).drop(# x + n) = y.drop(n); (s) ⊦ m ≤ m + n; (s) in-14: ⊦ a ' + x = y → a ∈ y; (forward) from specification list ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) ⊦ h + h0 | b = (h | b) + (h0 | b); (s) ⊦ h + h0 | t = (h | t) + (h0 | t); (s) ⊦ h + h0 | l0 = (h | l0) + (h0 | l0); (s) ⊦ #(x + y) = # x + # y; (s) ⊦ # x = # z → (x + y = z + y0 ↔ x = z ∧ y = y0); (ws)

Proof step 27 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l0, h0 + h1), (h0 + h1)[# h0] = (e, boolvar), alsf(t2) = mkPLIBls(t2, il, iv, ov), h1 = (W(t0, l0, v), false) ' + h1.drop(1), lsf(t2) = mkFLITPSCls(t2, l3, v0), p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := e.v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, v0), pcf(t2)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + h1)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + h1), mkPLIBls(t2, il, iv, ov), apcf(t2)), abs(h0 + h1, writers0, p), (W(t0, l0, v), false) ∈ h1, pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → (∀ l4. ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((h1 | l4) | t2) | false = []), pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → (∀ l4. ((h0 | l4) | t2) | false = [] ∧ ((h1 | l4) | t2) | false = []), pcf(t2) = R2 ∨ pcf(t2) = R3 → (∀ l4. l4 ≠ l3 ∧ ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((h1 | l4) | t2) | false = []), pcf(t2) = R2 → ctr(l3) = 0 → ((h0 | l3) | t2) | false = [] ∧ ((h1 | l3) | t2) | false = [], pcf(t2) = W4 → (((h0 | l3) | t2) | false) + (((h1 | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h0 | l3) | t2) | false = [] ∧ ((h1 | l3) | t2) | false = [], pcf(t2) = R1 → l3 = il, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv, pcf(t2) = idle → apcf(t2) = idle, pcf(t2) = ready → apcf(t2) = ready, pcf(t2) = crashed → apcf(t2) = crashed, pcf(t2) = R1 → apcf(t2) = invRead, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite, pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite, ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + h1), alsf(t), apcf(t)), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + h1), alsf(t), apcf(t)) ⊦ ( pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → ¬ FO(t2) ∈ (l0 = l ⊃ p(l) -p firstPersistW(p(l));p(l)) → ((h0 | l) | t2) | false = [] ∧ ((l0 = l ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h1.drop(1)) | l) | t2) | false = []) ∧ ( pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → ((h0 | l1) | t2) | false = [] ∧ ((l0 = l1 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h1.drop(1)) | l1) | t2) | false = []) ∧ ( pcf(t2) = R2 ∨ pcf(t2) = R3 → l2 ≠ l3 ∧ ¬ FO(t2) ∈ (l0 = l2 ⊃ p(l2) -p firstPersistW(p(l2));p(l2)) → ((h0 | l2) | t2) | false = [] ∧ ((l0 = l2 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h1.drop(1)) | l2) | t2) | false = []) ∧ ( pcf(t2) = R2 → ctr(l3) = 0 → ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h1.drop(1)) | l3) | t2) | false = []) ∧ ( pcf(t2) = W4 → (((h0 | l3) | t2) | false) + (((l0 = l3 ⊃ (e, true) ';[]) | t2) | false) + (((persistDependentReads(l0, h1.drop(1)) | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h1.drop(1)) | l3) | t2) | false = [])

User applied rule constructor cut

And obtained the following new goals

Rule argument

var: h1

Additional information

Used simplifier rules: List('a) freely generated by [], +;; ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) ⊦ a ' ≠ []; (s) a: ⊦ (x + y) + z = x + y + z; from specification list

Proof step 28 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l0, h0 + h1), (h0 + h1)[# h0] = (e, boolvar), alsf(t2) = mkPLIBls(t2, il, iv, ov), h1 = (W(t0, l0, v), false) ' + h1.drop(1), h1 = vpe + h, lsf(t2) = mkFLITPSCls(t2, l3, v0), p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := e.v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, v0), pcf(t2)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + h1)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + h1), mkPLIBls(t2, il, iv, ov), apcf(t2)), abs(h0 + h1, writers0, p), (W(t0, l0, v), false) ∈ h1, pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead, pcf(t2) = R1 → apcf(t2) = invRead, pcf(t2) = crashed → apcf(t2) = crashed, pcf(t2) = ready → apcf(t2) = ready, pcf(t2) = idle → apcf(t2) = idle, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov, pcf(t2) = R1 → l3 = il, pcf(t2) = W4 → (((h0 | l3) | t2) | false) + (((h1 | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h0 | l3) | t2) | false = [] ∧ ((h1 | l3) | t2) | false = [], pcf(t2) = R2 → ctr(l3) = 0 → ((h0 | l3) | t2) | false = [] ∧ ((h1 | l3) | t2) | false = [], pcf(t2) = R2 ∨ pcf(t2) = R3 → (∀ l4. l4 ≠ l3 ∧ ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((h1 | l4) | t2) | false = []), pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → (∀ l4. ((h0 | l4) | t2) | false = [] ∧ ((h1 | l4) | t2) | false = []), pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → (∀ l4. ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((h1 | l4) | t2) | false = []), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + h1), alsf(t), apcf(t)), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + h1), alsf(t), apcf(t)) ⊦ ( pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → ¬ FO(t2) ∈ (l0 = l ⊃ p(l) -p firstPersistW(p(l));p(l)) → ((h0 | l) | t2) | false = [] ∧ ((l0 = l ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h1.drop(1)) | l) | t2) | false = []) ∧ ( pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → ((h0 | l1) | t2) | false = [] ∧ ((l0 = l1 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h1.drop(1)) | l1) | t2) | false = []) ∧ ( pcf(t2) = R2 ∨ pcf(t2) = R3 → l2 ≠ l3 ∧ ¬ FO(t2) ∈ (l0 = l2 ⊃ p(l2) -p firstPersistW(p(l2));p(l2)) → ((h0 | l2) | t2) | false = [] ∧ ((l0 = l2 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h1.drop(1)) | l2) | t2) | false = []) ∧ ( pcf(t2) = R2 → ctr(l3) = 0 → ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h1.drop(1)) | l3) | t2) | false = []) ∧ ( pcf(t2) = W4 → (((h0 | l3) | t2) | false) + (((l0 = l3 ⊃ (e, true) ';[]) | t2) | false) + (((persistDependentReads(l0, h1.drop(1)) | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (e, true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h1.drop(1)) | l3) | t2) | false = [])

Heuristic simplifier applied rule simplifier

And obtained the following new goals

Rule argument

Additional information

Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ W(t, l, v).l = l; (s) ⊦ W(t, l, v).v = v; (s) ⊦ (a ' + x).drop(1) = x; (s) ⊦ a + x = a ' + x; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) ⊦ h + h0 | b = (h | b) + (h0 | b); (s) ⊦ h + h0 | t = (h | t) + (h0 | t); (s) ⊦ vpe ' | l = (vpe._1.l = l ⊃ vpe ';[]); (s) ⊦ h + h0 | l0 = (h | l0) + (h0 | l0); (s) ⊦ a ∈ a0 ' + x ↔ a = a0 ∨ a ∈ x; (s) ⊦ (x + a ' + y)[# x] = a; (s) ⊦ a ' = a0 ' ↔ a = a0; (s) ⊦ # y = # y0 → (x + y = z + y0 ↔ x = z ∧ y = y0); (ws)

Proof step 29 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l0, h0 + (W(t0, l0, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), lsf(t2) = mkFLITPSCls(t2, l3, v0), p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, v0), pcf(t2)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), mkPLIBls(t2, il, iv, ov), apcf(t2)), abs(h0 + (W(t0, l0, v), false) ' + h, writers0, p), pcf(t2) = R1 → l3 = il, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv, pcf(t2) = idle → apcf(t2) = idle, pcf(t2) = ready → apcf(t2) = ready, pcf(t2) = crashed → apcf(t2) = crashed, pcf(t2) = R1 → apcf(t2) = invRead, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite, pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite, pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → (∀ l4. ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → (∀ l4. ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = R2 ∨ pcf(t2) = R3 → (∀ l4. l4 ≠ l3 ∧ ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = R2 → ctr(l3) = 0 → ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = W4 → (((h0 | l3) | t2) | false) + (((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false) + (((h | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)) ⊦ ( pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → ¬ FO(t2) ∈ (l0 = l ⊃ p(l) -p firstPersistW(p(l));p(l)) → ((h0 | l) | t2) | false = [] ∧ ((l0 = l ⊃ (W(t0, l, v), true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h) | l) | t2) | false = []) ∧ ( pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → ((h0 | l1) | t2) | false = [] ∧ ((l0 = l1 ⊃ (W(t0, l1, v), true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h) | l1) | t2) | false = []) ∧ ( pcf(t2) = R2 ∨ pcf(t2) = R3 → l2 ≠ l3 ∧ ¬ FO(t2) ∈ (l0 = l2 ⊃ p(l2) -p firstPersistW(p(l2));p(l2)) → ((h0 | l2) | t2) | false = [] ∧ ((l0 = l2 ⊃ (W(t0, l2, v), true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h) | l2) | t2) | false = []) ∧ ( pcf(t2) = R2 → ctr(l3) = 0 → ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h) | l3) | t2) | false = []) ∧ ( pcf(t2) = W4 → (((h0 | l3) | t2) | false) + (((l0 = l3 ⊃ (W(t0, l3, v), true) ';[]) | t2) | false) + (((persistDependentReads(l0, h) | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h) | l3) | t2) | false = [])

User applied rule case distinction

And obtained the following new goals

Rule argument

pos: right 1

Additional information

Proof step 30 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l0, h0 + (W(t0, l0, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), lsf(t2) = mkFLITPSCls(t2, l3, v0), p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, v0), pcf(t2)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), mkPLIBls(t2, il, iv, ov), apcf(t2)), abs(h0 + (W(t0, l0, v), false) ' + h, writers0, p), ¬ FO(t2) ∈ (l0 = l ⊃ p(l) -p firstPersistW(p(l));p(l)), pcf(t2) = W4 → (((h0 | l3) | t2) | false) + (((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false) + (((h | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = R2 → ctr(l3) = 0 → ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = R2 ∨ pcf(t2) = R3 → (∀ l4. l4 ≠ l3 ∧ ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → (∀ l4. ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → (∀ l4. ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead, pcf(t2) = R1 → apcf(t2) = invRead, pcf(t2) = crashed → apcf(t2) = crashed, pcf(t2) = ready → apcf(t2) = ready, pcf(t2) = idle → apcf(t2) = idle, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov, pcf(t2) = R1 → l3 = il, ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 ⊦ ((h0 | l) | t2) | false = [] ∧ ((l0 = l ⊃ (W(t0, l, v), true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h) | l) | t2) | false = []

Heuristic simplifier applied rule simplifier

And obtained the following new goals

Rule argument

Additional information

Proof step 31 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l0, h0 + (W(t0, l0, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), lsf(t2) = mkFLITPSCls(t2, l3, v0), p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, v0), pcf(t2)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), mkPLIBls(t2, il, iv, ov), apcf(t2)), abs(h0 + (W(t0, l0, v), false) ' + h, writers0, p), ¬ FO(t2) ∈ (l0 = l ⊃ p(l) -p firstPersistW(p(l));p(l)), pcf(t2) = R1 → l3 = il, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv, pcf(t2) = idle → apcf(t2) = idle, pcf(t2) = ready → apcf(t2) = ready, pcf(t2) = crashed → apcf(t2) = crashed, pcf(t2) = R1 → apcf(t2) = invRead, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite, pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite, pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → (∀ l4. ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = R2 ∨ pcf(t2) = R3 → (∀ l4. l4 ≠ l3 ∧ ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = R2 → ctr(l3) = 0 → ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = W4 → (((h0 | l3) | t2) | false) + (((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false) + (((h | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ l4. ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = [], pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 ⊦ ((h0 | l) | t2) | false = [] ∧ ((l0 = l ⊃ (W(t0, l, v), true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h) | l) | t2) | false = []

User applied rule all left

And obtained the following new goals

Rule argument

pos: left 30 terms: l abort: F discard: T computed: T

Additional information

Used terms: l

Proof step 32 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l0, h0 + (W(t0, l0, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), lsf(t2) = mkFLITPSCls(t2, l3, v0), p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, v0), pcf(t2)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), mkPLIBls(t2, il, iv, ov), apcf(t2)), abs(h0 + (W(t0, l0, v), false) ' + h, writers0, p), ¬ FO(t2) ∈ (l0 = l ⊃ p(l) -p firstPersistW(p(l));p(l)), pcf(t2) = W4 → (((h0 | l3) | t2) | false) + (((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false) + (((h | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = R2 → ctr(l3) = 0 → ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = R2 ∨ pcf(t2) = R3 → (∀ l4. l4 ≠ l3 ∧ ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → (∀ l4. ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead, pcf(t2) = R1 → apcf(t2) = invRead, pcf(t2) = crashed → apcf(t2) = crashed, pcf(t2) = ready → apcf(t2) = ready, pcf(t2) = idle → apcf(t2) = idle, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov, pcf(t2) = R1 → l3 = il, ¬ FO(t2) ∈ p(l) → ((h0 | l) | t2) | false = [] ∧ ((l0 = l ⊃ (W(t0, l, v), false) ';[]) | t2) | false = [] ∧ ((h | l) | t2) | false = [], ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 ⊦ ((h0 | l) | t2) | false = [] ∧ ((l0 = l ⊃ (W(t0, l, v), true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h) | l) | t2) | false = []

User applied rule case distinction

And obtained the following new goals

Rule argument

pos: left 12

Additional information

Used simplifier rules: ⊦ [] | t = []; (s) ⊦ [] | b = []; (s) ⊦ l ≠ l0 → persistDependentReads(l, h) | l0 = h | l0; (s)

Proof step 33 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l0, h0 + (W(t0, l0, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), l0 = l, lsf(t2) = mkFLITPSCls(t2, l3, v0), p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, v0), pcf(t2)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), mkPLIBls(t2, il, iv, ov), apcf(t2)), abs(h0 + (W(t0, l0, v), false) ' + h, writers0, p), ¬ FO(t2) ∈ p(l) -p firstPersistW(p(l)), ¬ FO(t2) ∈ p(l) → ((h0 | l) | t2) | false = [] ∧ ((l0 = l ⊃ (W(t0, l, v), false) ';[]) | t2) | false = [] ∧ ((h | l) | t2) | false = [], pcf(t2) = R1 → l3 = il, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv, pcf(t2) = idle → apcf(t2) = idle, pcf(t2) = ready → apcf(t2) = ready, pcf(t2) = crashed → apcf(t2) = crashed, pcf(t2) = R1 → apcf(t2) = invRead, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite, pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite, pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → (∀ l4. ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = R2 ∨ pcf(t2) = R3 → (∀ l4. l4 ≠ l3 ∧ ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = R2 → ctr(l3) = 0 → ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = W4 → (((h0 | l3) | t2) | false) + (((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false) + (((h | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 ⊦ ((h0 | l) | t2) | false = [] ∧ ((l0 = l ⊃ (W(t0, l, v), true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h) | l) | t2) | false = []

Heuristic simplifier applied rule simplifier

And obtained the following new goals

Rule argument

Additional information

Used simplifier rules: ⊦ # x = 0 ↔ x = []; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic ⊦ ((h | l) | t) | false = [] → ((persistDependentReads(l, h) | l) | t) | false = []; (s) ⊦ W(t, l, v).t = t; (s) ⊦ (e, b) ' | t = (t = e.t ⊃ (e, b) ';[]); (s) ⊦ FO(t) ∈ fowl -p firstPersistW(fowl) ↔ FO(t) ∈ fowl; (s)

Proof step 34 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l, h0 + (W(t0, l, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), lsf(t2) = mkFLITPSCls(t2, l3, v0), ((h | l) | t2) | false = [], (t2 = t0 ⊃ (W(t0, l, v), false) ';[]) | false = [], ((h0 | l) | t2) | false = [], p(l) ≠ [], (t2 = t0 ⊃ (W(t0, l, v), true) ';[]) | false ≠ [], firstPersistW(p(l)) < # p(l), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l := v), p(l := p(l) -p firstPersistW(p(l))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, v0), pcf(t2)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l, v), false) ' + h), mkPLIBls(t2, il, iv, ov), apcf(t2)), abs(h0 + (W(t0, l, v), false) ' + h, writers0, p), ¬ FO(t2) ∈ p(l), pcf(t2) = R1 → l3 = il, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv, pcf(t2) = idle → apcf(t2) = idle, pcf(t2) = ready → apcf(t2) = ready, pcf(t2) = crashed → apcf(t2) = crashed, pcf(t2) = R1 → apcf(t2) = invRead, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite, pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite, pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → (∀ l4. ((h0 | l4) | t2) | false = [] ∧ ((l = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = R2 ∨ pcf(t2) = R3 → (∀ l4. l4 ≠ l3 ∧ ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = R2 → ctr(l3) = 0 → ((h0 | l3) | t2) | false = [] ∧ ((l = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = W4 → (((h0 | l3) | t2) | false) + (((l = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false) + (((h | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h0 | l3) | t2) | false = [] ∧ ((l = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l, v), false) ' + h), alsf(t), apcf(t)), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l, v), false) ' + h), alsf(t), apcf(t)), pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 ⊦

Heuristic nonsplitting cut applied rule cut formula

And closed the goal!

Rule argument

fma: t2 = t0

Additional information

Used simplifier rules: ⊦ [] | b = []; (s) ⊦ (e, b) ' | b0 = (b ↔ b0 ⊃ (e, b) ';[]); (s) ⊦ a ' ≠ []; (s) Used formulas: t2 = t0

Proof step 35 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l0, h0 + (W(t0, l0, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), lsf(t2) = mkFLITPSCls(t2, l3, v0), p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, v0), pcf(t2)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), mkPLIBls(t2, il, iv, ov), apcf(t2)), abs(h0 + (W(t0, l0, v), false) ' + h, writers0, p), pcf(t2) = W4 → (((h0 | l3) | t2) | false) + (((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false) + (((h | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = R2 → ctr(l3) = 0 → ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = R2 ∨ pcf(t2) = R3 → (∀ l4. l4 ≠ l3 ∧ ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → (∀ l4. ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → (∀ l4. ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead, pcf(t2) = R1 → apcf(t2) = invRead, pcf(t2) = crashed → apcf(t2) = crashed, pcf(t2) = ready → apcf(t2) = ready, pcf(t2) = idle → apcf(t2) = idle, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov, pcf(t2) = R1 → l3 = il, ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 ⊦ ((h0 | l1) | t2) | false = [] ∧ ((l0 = l1 ⊃ (W(t0, l1, v), true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h) | l1) | t2) | false = []

Heuristic simplifier applied rule simplifier

And obtained the following new goals

Rule argument

Additional information

Proof step 36 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l0, h0 + (W(t0, l0, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), lsf(t2) = mkFLITPSCls(t2, l3, v0), p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, v0), pcf(t2)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), mkPLIBls(t2, il, iv, ov), apcf(t2)), abs(h0 + (W(t0, l0, v), false) ' + h, writers0, p), pcf(t2) = R1 → l3 = il, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv, pcf(t2) = idle → apcf(t2) = idle, pcf(t2) = ready → apcf(t2) = ready, pcf(t2) = crashed → apcf(t2) = crashed, pcf(t2) = R1 → apcf(t2) = invRead, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite, pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite, pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → (∀ l4. ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = R2 ∨ pcf(t2) = R3 → (∀ l4. l4 ≠ l3 ∧ ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = R2 → ctr(l3) = 0 → ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = W4 → (((h0 | l3) | t2) | false) + (((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false) + (((h | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ l4. ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = [], pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 ⊦ ((h0 | l1) | t2) | false = [] ∧ ((l0 = l1 ⊃ (W(t0, l1, v), true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h) | l1) | t2) | false = []

User applied rule all left

And obtained the following new goals

Rule argument

pos: left 29 terms: l1 abort: F discard: T computed: T

Additional information

Used terms: l1

Proof step 37 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l0, h0 + (W(t0, l0, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), lsf(t2) = mkFLITPSCls(t2, l3, v0), ((h0 | l1) | t2) | false = [], ((l0 = l1 ⊃ (W(t0, l1, v), false) ';[]) | t2) | false = [], ((h | l1) | t2) | false = [], p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, v0), pcf(t2)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), mkPLIBls(t2, il, iv, ov), apcf(t2)), abs(h0 + (W(t0, l0, v), false) ' + h, writers0, p), pcf(t2) = W4 → (((h0 | l3) | t2) | false) + (((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false) + (((h | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = R2 → ctr(l3) = 0 → ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = R2 ∨ pcf(t2) = R3 → (∀ l4. l4 ≠ l3 ∧ ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → (∀ l4. ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead, pcf(t2) = R1 → apcf(t2) = invRead, pcf(t2) = crashed → apcf(t2) = crashed, pcf(t2) = ready → apcf(t2) = ready, pcf(t2) = idle → apcf(t2) = idle, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov, pcf(t2) = R1 → l3 = il, ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 ⊦ ((h0 | l1) | t2) | false = [] ∧ ((l0 = l1 ⊃ (W(t0, l1, v), true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h) | l1) | t2) | false = []

Heuristic simplifier applied rule simplifier

And obtained the following new goals

Rule argument

Additional information

Proof step 38 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l0, h0 + (W(t0, l0, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), lsf(t2) = mkFLITPSCls(t2, l3, v0), ((h | l1) | t2) | false = [], ((l0 = l1 ⊃ (W(t0, l1, v), false) ';[]) | t2) | false = [], ((h0 | l1) | t2) | false = [], p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, v0), pcf(t2)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), mkPLIBls(t2, il, iv, ov), apcf(t2)), abs(h0 + (W(t0, l0, v), false) ' + h, writers0, p), pcf(t2) = R1 → l3 = il, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv, pcf(t2) = idle → apcf(t2) = idle, pcf(t2) = ready → apcf(t2) = ready, pcf(t2) = crashed → apcf(t2) = crashed, pcf(t2) = R1 → apcf(t2) = invRead, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite, pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite, pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → (∀ l4. ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = R2 ∨ pcf(t2) = R3 → (∀ l4. l4 ≠ l3 ∧ ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = R2 → ctr(l3) = 0 → ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = W4 → (((h0 | l3) | t2) | false) + (((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false) + (((h | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 ⊦ ((l0 = l1 ⊃ (W(t0, l1, v), true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h) | l1) | t2) | false = []

User applied rule case distinction

And obtained the following new goals

Rule argument

pos: right 1

Additional information

Proof step 39 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l0, h0 + (W(t0, l0, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), lsf(t2) = mkFLITPSCls(t2, l3, v0), ((h0 | l1) | t2) | false = [], ((l0 = l1 ⊃ (W(t0, l1, v), false) ';[]) | t2) | false = [], ((h | l1) | t2) | false = [], p(l0) ≠ [], ((l0 = l1 ⊃ (W(t0, l1, v), true) ';[]) | t2) | false ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, v0), pcf(t2)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), mkPLIBls(t2, il, iv, ov), apcf(t2)), abs(h0 + (W(t0, l0, v), false) ' + h, writers0, p), pcf(t2) = W4 → (((h0 | l3) | t2) | false) + (((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false) + (((h | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = R2 → ctr(l3) = 0 → ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = R2 ∨ pcf(t2) = R3 → (∀ l4. l4 ≠ l3 ∧ ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → (∀ l4. ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead, pcf(t2) = R1 → apcf(t2) = invRead, pcf(t2) = crashed → apcf(t2) = crashed, pcf(t2) = ready → apcf(t2) = ready, pcf(t2) = idle → apcf(t2) = idle, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov, pcf(t2) = R1 → l3 = il, ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 ⊦

User applied rule case distinction

And obtained the following new goals

Rule argument

pos: left 8

Additional information

Used simplifier rules: ⊦ [] | t = []; (s) ⊦ [] | b = []; (s)

Proof step 40 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l0, h0 + (W(t0, l0, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), l0 = l1, lsf(t2) = mkFLITPSCls(t2, l3, v0), ((h | l1) | t2) | false = [], ((l0 = l1 ⊃ (W(t0, l1, v), false) ';[]) | t2) | false = [], ((h0 | l1) | t2) | false = [], p(l0) ≠ [], ((W(t0, l1, v), true) ' | t2) | false ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, v0), pcf(t2)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), mkPLIBls(t2, il, iv, ov), apcf(t2)), abs(h0 + (W(t0, l0, v), false) ' + h, writers0, p), pcf(t2) = R1 → l3 = il, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv, pcf(t2) = idle → apcf(t2) = idle, pcf(t2) = ready → apcf(t2) = ready, pcf(t2) = crashed → apcf(t2) = crashed, pcf(t2) = R1 → apcf(t2) = invRead, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite, pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite, pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → (∀ l4. ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = R2 ∨ pcf(t2) = R3 → (∀ l4. l4 ≠ l3 ∧ ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = R2 → ctr(l3) = 0 → ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = W4 → (((h0 | l3) | t2) | false) + (((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false) + (((h | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 ⊦

Heuristic simplifier applied rule simplifier

And obtained the following new goals

Rule argument

Additional information

Used simplifier rules: ⊦ # x = 0 ↔ x = []; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic ⊦ W(t, l, v).t = t; (s) ⊦ (e, b) ' | t = (t = e.t ⊃ (e, b) ';[]); (s)

Proof step 41 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l1, h0 + (W(t0, l1, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), lsf(t2) = mkFLITPSCls(t2, l3, v0), (t2 = t0 ⊃ (W(t0, l1, v), false) ';[]) | false = [], ((h0 | l1) | t2) | false = [], ((h | l1) | t2) | false = [], p(l1) ≠ [], (t2 = t0 ⊃ (W(t0, l1, v), true) ';[]) | false ≠ [], firstPersistW(p(l1)) < # p(l1), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l1 := v), p(l1 := p(l1) -p firstPersistW(p(l1))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, v0), pcf(t2)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l1, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l1, v), false) ' + h), mkPLIBls(t2, il, iv, ov), apcf(t2)), abs(h0 + (W(t0, l1, v), false) ' + h, writers0, p), pcf(t2) = R1 → l3 = il, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv, pcf(t2) = idle → apcf(t2) = idle, pcf(t2) = ready → apcf(t2) = ready, pcf(t2) = crashed → apcf(t2) = crashed, pcf(t2) = R1 → apcf(t2) = invRead, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite, pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite, pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → (∀ l4. ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l1 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = R2 ∨ pcf(t2) = R3 → (∀ l4. l4 ≠ l3 ∧ ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l1 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = R2 → ctr(l3) = 0 → ((h0 | l3) | t2) | false = [] ∧ ((l1 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = W4 → (((h0 | l3) | t2) | false) + (((l1 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false) + (((h | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h0 | l3) | t2) | false = [] ∧ ((l1 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l1, v), false) ' + h), alsf(t), apcf(t)), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l1, v), false) ' + h), alsf(t), apcf(t)), pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 ⊦

User applied rule case distinction

And closed the goal!

Rule argument

pos: left 8

Additional information

Used simplifier rules: ⊦ [] | b = []; (s) ⊦ (e, b) ' | b0 = (b ↔ b0 ⊃ (e, b) ';[]); (s) ⊦ a ' ≠ []; (s)

Proof step 42 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l0, h0 + (W(t0, l0, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), lsf(t2) = mkFLITPSCls(t2, l3, v0), ((h0 | l1) | t2) | false = [], ((l0 = l1 ⊃ (W(t0, l1, v), false) ';[]) | t2) | false = [], ((h | l1) | t2) | false = [], p(l0) ≠ [], ((persistDependentReads(l0, h) | l1) | t2) | false ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, v0), pcf(t2)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), mkPLIBls(t2, il, iv, ov), apcf(t2)), abs(h0 + (W(t0, l0, v), false) ' + h, writers0, p), pcf(t2) = W4 → (((h0 | l3) | t2) | false) + (((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false) + (((h | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = R2 → ctr(l3) = 0 → ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = R2 ∨ pcf(t2) = R3 → (∀ l4. l4 ≠ l3 ∧ ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → (∀ l4. ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead, pcf(t2) = R1 → apcf(t2) = invRead, pcf(t2) = crashed → apcf(t2) = crashed, pcf(t2) = ready → apcf(t2) = ready, pcf(t2) = idle → apcf(t2) = idle, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov, pcf(t2) = R1 → l3 = il, ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 ⊦

User applied rule apply rewrite lemma

And obtained the following new goals

Rule argument

spec: PLIB-preds, name:persistDependentReads-restrict-other-loc, seq: ⊦ l ≠ l0 → persistDependentReads(l, h) | l0 = h | l0, subst:[l, h, l0] → [l0, h, l1], <all paths>

Additional information

Used simplifier rules: ⊦ (e, b) ' | t = (t = e.t ⊃ (e, b) ';[]); (s) ⊦ W(t, l, v).t = t; (s) ⊦ ((h | l) | t) | false = [] → ((persistDependentReads(l, h) | l) | t) | false = []; (s) Used terms: l0, h, l1

Proof step 43 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

⊦ l ≠ l0 → persistDependentReads(l, h) | l0 = h | l0

A spec-lemma

Proof step 44 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l0, h0 + (W(t0, l0, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), lsf(t2) = mkFLITPSCls(t2, l3, v0), l2 ≠ l3, p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, v0), pcf(t2)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), mkPLIBls(t2, il, iv, ov), apcf(t2)), abs(h0 + (W(t0, l0, v), false) ' + h, writers0, p), ¬ FO(t2) ∈ (l0 = l2 ⊃ p(l2) -p firstPersistW(p(l2));p(l2)), pcf(t2) = W4 → (((h0 | l3) | t2) | false) + (((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false) + (((h | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = R2 → ctr(l3) = 0 → ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = R2 ∨ pcf(t2) = R3 → (∀ l4. l4 ≠ l3 ∧ ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → (∀ l4. ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → (∀ l4. ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead, pcf(t2) = R1 → apcf(t2) = invRead, pcf(t2) = crashed → apcf(t2) = crashed, pcf(t2) = ready → apcf(t2) = ready, pcf(t2) = idle → apcf(t2) = idle, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov, pcf(t2) = R1 → l3 = il, ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), pcf(t2) = R2 ∨ pcf(t2) = R3 ⊦ ((h0 | l2) | t2) | false = [] ∧ ((l0 = l2 ⊃ (W(t0, l2, v), true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h) | l2) | t2) | false = []

Heuristic simplifier applied rule simplifier

And obtained the following new goals

Rule argument

Additional information

Proof step 45 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l0, h0 + (W(t0, l0, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), lsf(t2) = mkFLITPSCls(t2, l3, v0), l2 ≠ l3, p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, v0), pcf(t2)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), mkPLIBls(t2, il, iv, ov), apcf(t2)), abs(h0 + (W(t0, l0, v), false) ' + h, writers0, p), ¬ FO(t2) ∈ (l0 = l2 ⊃ p(l2) -p firstPersistW(p(l2));p(l2)), pcf(t2) = R1 → l3 = il, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv, pcf(t2) = idle → apcf(t2) = idle, pcf(t2) = ready → apcf(t2) = ready, pcf(t2) = crashed → apcf(t2) = crashed, pcf(t2) = R1 → apcf(t2) = invRead, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite, pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite, pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → (∀ l4. ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → (∀ l4. ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = R2 → ctr(l3) = 0 → ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = W4 → (((h0 | l3) | t2) | false) + (((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false) + (((h | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ l4. l4 ≠ l3 ∧ ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = [], pcf(t2) = R2 ∨ pcf(t2) = R3 ⊦ ((h0 | l2) | t2) | false = [] ∧ ((l0 = l2 ⊃ (W(t0, l2, v), true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h) | l2) | t2) | false = []

User applied rule all left

And obtained the following new goals

Rule argument

pos: left 31 terms: l2 abort: F discard: T computed: T

Additional information

Used terms: l2

Proof step 46 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l0, h0 + (W(t0, l0, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), lsf(t2) = mkFLITPSCls(t2, l3, v0), l2 ≠ l3, p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, v0), pcf(t2)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), mkPLIBls(t2, il, iv, ov), apcf(t2)), abs(h0 + (W(t0, l0, v), false) ' + h, writers0, p), ¬ FO(t2) ∈ (l0 = l2 ⊃ p(l2) -p firstPersistW(p(l2));p(l2)), pcf(t2) = W4 → (((h0 | l3) | t2) | false) + (((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false) + (((h | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = R2 → ctr(l3) = 0 → ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → (∀ l4. ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → (∀ l4. ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead, pcf(t2) = R1 → apcf(t2) = invRead, pcf(t2) = crashed → apcf(t2) = crashed, pcf(t2) = ready → apcf(t2) = ready, pcf(t2) = idle → apcf(t2) = idle, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov, pcf(t2) = R1 → l3 = il, l2 ≠ l3 ∧ ¬ FO(t2) ∈ p(l2) → ((h0 | l2) | t2) | false = [] ∧ ((l0 = l2 ⊃ (W(t0, l2, v), false) ';[]) | t2) | false = [] ∧ ((h | l2) | t2) | false = [], ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), pcf(t2) = R2 ∨ pcf(t2) = R3 ⊦ ((h0 | l2) | t2) | false = [] ∧ ((l0 = l2 ⊃ (W(t0, l2, v), true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h) | l2) | t2) | false = []

Heuristic simplifier applied rule simplifier

And obtained the following new goals

Rule argument

Additional information

Proof step 47 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l0, h0 + (W(t0, l0, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), lsf(t2) = mkFLITPSCls(t2, l3, v0), l2 ≠ l3, p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, v0), pcf(t2)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), mkPLIBls(t2, il, iv, ov), apcf(t2)), abs(h0 + (W(t0, l0, v), false) ' + h, writers0, p), ¬ FO(t2) ∈ (l0 = l2 ⊃ p(l2) -p firstPersistW(p(l2));p(l2)), pcf(t2) = R1 → l3 = il, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv, pcf(t2) = idle → apcf(t2) = idle, pcf(t2) = ready → apcf(t2) = ready, pcf(t2) = crashed → apcf(t2) = crashed, pcf(t2) = R1 → apcf(t2) = invRead, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite, pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite, pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → (∀ l4. ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → (∀ l4. ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = R2 → ctr(l3) = 0 → ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = W4 → (((h0 | l3) | t2) | false) + (((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false) + (((h | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], ¬ FO(t2) ∈ p(l2) → ((h0 | l2) | t2) | false = [] ∧ ((l0 = l2 ⊃ (W(t0, l2, v), false) ';[]) | t2) | false = [] ∧ ((h | l2) | t2) | false = [], ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), pcf(t2) = R2 ∨ pcf(t2) = R3 ⊦ ((h0 | l2) | t2) | false = [] ∧ ((l0 = l2 ⊃ (W(t0, l2, v), true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h) | l2) | t2) | false = []

User applied rule case distinction

And obtained the following new goals

Rule argument

pos: left 13

Additional information

Used simplifier rules: ⊦ [] | t = []; (s) ⊦ [] | b = []; (s) ⊦ l ≠ l0 → persistDependentReads(l, h) | l0 = h | l0; (s)

Proof step 48 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l0, h0 + (W(t0, l0, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), l0 = l2, lsf(t2) = mkFLITPSCls(t2, l3, v0), l2 ≠ l3, p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, v0), pcf(t2)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), mkPLIBls(t2, il, iv, ov), apcf(t2)), abs(h0 + (W(t0, l0, v), false) ' + h, writers0, p), ¬ FO(t2) ∈ p(l2) -p firstPersistW(p(l2)), ¬ FO(t2) ∈ p(l2) → ((h0 | l2) | t2) | false = [] ∧ ((l0 = l2 ⊃ (W(t0, l2, v), false) ';[]) | t2) | false = [] ∧ ((h | l2) | t2) | false = [], pcf(t2) = W4 → (((h0 | l3) | t2) | false) + (((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false) + (((h | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = R2 → ctr(l3) = 0 → ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → (∀ l4. ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → (∀ l4. ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead, pcf(t2) = R1 → apcf(t2) = invRead, pcf(t2) = crashed → apcf(t2) = crashed, pcf(t2) = ready → apcf(t2) = ready, pcf(t2) = idle → apcf(t2) = idle, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov, pcf(t2) = R1 → l3 = il, ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), pcf(t2) = R2 ∨ pcf(t2) = R3 ⊦ ((h0 | l2) | t2) | false = [] ∧ ((l0 = l2 ⊃ (W(t0, l2, v), true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h) | l2) | t2) | false = []

Heuristic simplifier applied rule simplifier

And obtained the following new goals

Rule argument

Additional information

Used simplifier rules: ⊦ # x = 0 ↔ x = []; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic ⊦ ((h | l) | t) | false = [] → ((persistDependentReads(l, h) | l) | t) | false = []; (s) ⊦ W(t, l, v).t = t; (s) ⊦ (e, b) ' | t = (t = e.t ⊃ (e, b) ';[]); (s) ⊦ [] | b = []; (s) ⊦ [] | t = []; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ [] + x = x; (s) ⊦ FO(t) ∈ fowl -p firstPersistW(fowl) ↔ FO(t) ∈ fowl; (s)

Proof step 49 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l2, h0 + (W(t0, l2, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), lsf(t2) = mkFLITPSCls(t2, l3, v0), ((h | l2) | t2) | false = [], (t2 = t0 ⊃ (W(t0, l2, v), false) ';[]) | false = [], ((h0 | l2) | t2) | false = [], l2 ≠ l3, p(l2) ≠ [], (t2 = t0 ⊃ (W(t0, l2, v), true) ';[]) | false ≠ [], firstPersistW(p(l2)) < # p(l2), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l2 := v), p(l2 := p(l2) -p firstPersistW(p(l2))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, v0), pcf(t2)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l2, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l2, v), false) ' + h), mkPLIBls(t2, il, iv, ov), apcf(t2)), abs(h0 + (W(t0, l2, v), false) ' + h, writers0, p), ¬ FO(t2) ∈ p(l2), pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → (∀ l4. ((h0 | l4) | t2) | false = [] ∧ ((l2 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → (∀ l4. ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l2 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead, pcf(t2) = R1 → apcf(t2) = invRead, pcf(t2) = crashed → apcf(t2) = crashed, pcf(t2) = ready → apcf(t2) = ready, pcf(t2) = idle → apcf(t2) = idle, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov, pcf(t2) = R1 → l3 = il, pcf(t2) = W4 → (((h0 | l3) | t2) | false) + (((h | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h0 | l3) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = R2 → ctr(l3) = 0 → ((h0 | l3) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l2, v), false) ' + h), alsf(t), apcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l2, v), false) ' + h), alsf(t), apcf(t)), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), pcf(t2) = R2 ∨ pcf(t2) = R3 ⊦

User applied rule apply rewrite lemma

And obtained the following new goals

Rule argument

spec: list-del, name:in-get, seq: ⊦ a ∈ x ↔ (∃ n. n < # x ∧ x[n] = a), subst:[a, x] → [FO(t2), p(l2)]; ['a] → [FOW], <all paths>

Additional information

Used terms: FO(t2), p(l2)

Proof step 50 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

⊦ a ∈ x ↔ (∃ n. n < # x ∧ x[n] = a)

A spec-lemma

Proof step 51 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l2, h0 + (W(t0, l2, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), lsf(t2) = mkFLITPSCls(t2, l3, v0), ((h0 | l2) | t2) | false = [], (t2 = t0 ⊃ (W(t0, l2, v), false) ';[]) | false = [], ((h | l2) | t2) | false = [], l2 ≠ l3, p(l2) ≠ [], (t2 = t0 ⊃ (W(t0, l2, v), true) ';[]) | false ≠ [], firstPersistW(p(l2)) < # p(l2), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l2 := v), p(l2 := p(l2) -p firstPersistW(p(l2))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, v0), pcf(t2)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l2, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l2, v), false) ' + h), mkPLIBls(t2, il, iv, ov), apcf(t2)), abs(h0 + (W(t0, l2, v), false) ' + h, writers0, p), pcf(t2) = R2 → ctr(l3) = 0 → ((h0 | l3) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = W4 → (((h0 | l3) | t2) | false) + (((h | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h0 | l3) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = R1 → l3 = il, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv, pcf(t2) = idle → apcf(t2) = idle, pcf(t2) = ready → apcf(t2) = ready, pcf(t2) = crashed → apcf(t2) = crashed, pcf(t2) = R1 → apcf(t2) = invRead, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite, pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite, pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → (∀ l4. ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l2 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → (∀ l4. ((h0 | l4) | t2) | false = [] ∧ ((l2 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l2, v), false) ' + h), alsf(t), apcf(t)), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l2, v), false) ' + h), alsf(t), apcf(t)), ∀ n. ¬(n < # p(l2) ∧ p(l2)[n] = FO(t2)), pcf(t2) = R2 ∨ pcf(t2) = R3 ⊦

Heuristic simplifier applied rule simplifier

And obtained the following new goals

Rule argument

Additional information

Proof step 52 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l2, h0 + (W(t0, l2, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), lsf(t2) = mkFLITPSCls(t2, l3, v0), ((h | l2) | t2) | false = [], (t2 = t0 ⊃ (W(t0, l2, v), false) ';[]) | false = [], ((h0 | l2) | t2) | false = [], l2 ≠ l3, p(l2) ≠ [], (t2 = t0 ⊃ (W(t0, l2, v), true) ';[]) | false ≠ [], firstPersistW(p(l2)) < # p(l2), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l2 := v), p(l2 := p(l2) -p firstPersistW(p(l2))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, v0), pcf(t2)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l2, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l2, v), false) ' + h), mkPLIBls(t2, il, iv, ov), apcf(t2)), abs(h0 + (W(t0, l2, v), false) ' + h, writers0, p), pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → (∀ l4. ((h0 | l4) | t2) | false = [] ∧ ((l2 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → (∀ l4. ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l2 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead, pcf(t2) = R1 → apcf(t2) = invRead, pcf(t2) = crashed → apcf(t2) = crashed, pcf(t2) = ready → apcf(t2) = ready, pcf(t2) = idle → apcf(t2) = idle, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov, pcf(t2) = R1 → l3 = il, pcf(t2) = W4 → (((h0 | l3) | t2) | false) + (((h | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h0 | l3) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = R2 → ctr(l3) = 0 → ((h0 | l3) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l2, v), false) ' + h), alsf(t), apcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l2, v), false) ' + h), alsf(t), apcf(t)), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ n. ¬ n < # p(l2) ∨ p(l2)[n] ≠ FO(t2), pcf(t2) = R2 ∨ pcf(t2) = R3 ⊦

User applied rule case distinction

And closed the goal!

Rule argument

pos: left 9

Additional information

Used simplifier rules: ⊦ [] | b = []; (s) ⊦ (e, b) ' | b0 = (b ↔ b0 ⊃ (e, b) ';[]); (s) ⊦ a ' ≠ []; (s)

Proof step 53 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l0, h0 + (W(t0, l0, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), ctr(l3) = 0, lsf(t2) = mkFLITPSCls(t2, l3, v0), pcf(t2) = R2, p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, v0), pcf(t2)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), mkPLIBls(t2, il, iv, ov), apcf(t2)), abs(h0 + (W(t0, l0, v), false) ' + h, writers0, p), pcf(t2) = W4 → (((h0 | l3) | t2) | false) + (((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false) + (((h | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = R2 → ctr(l3) = 0 → ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = R2 ∨ pcf(t2) = R3 → (∀ l4. l4 ≠ l3 ∧ ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → (∀ l4. ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → (∀ l4. ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead, pcf(t2) = R1 → apcf(t2) = invRead, pcf(t2) = crashed → apcf(t2) = crashed, pcf(t2) = ready → apcf(t2) = ready, pcf(t2) = idle → apcf(t2) = idle, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov, pcf(t2) = R1 → l3 = il, ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)) ⊦ ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h) | l3) | t2) | false = []

Heuristic simplifier applied rule simplifier

And obtained the following new goals

Rule argument

Additional information

Used simplifier rules: ⊦ R1 ≠ R2; (s) ⊦ R2 ≠ W7; (s) ⊦ R2 ≠ W6; (s) ⊦ R2 ≠ W5; (s) ⊦ R2 ≠ W4; (s) ⊦ R2 ≠ W3; (s) ⊦ R2 ≠ W2; (s) ⊦ R2 ≠ W1; (s) ⊦ R2 ≠ idle; (s) ⊦ R2 ≠ ready; (s) ⊦ R2 ≠ crashed; (s) ⊦ R2 ≠ R4; (s)

Proof step 54 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l0, h0 + (W(t0, l0, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), apcf(t2) = resRead, ctr(l3) = 0, lsf(t2) = mkFLITPSCls(t2, l3, ov), pcf(t2) = R2, ((h | l3) | t2) | false = [], ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [], ((h0 | l3) | t2) | false = [], p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, ov), R2), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), mkPLIBls(t2, il, iv, ov), resRead), abs(h0 + (W(t0, l0, v), false) ' + h, writers0, p), ∀ l4. l4 ≠ l3 ∧ ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = [], ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)) ⊦ ((l0 = l3 ⊃ (W(t0, l3, v), true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h) | l3) | t2) | false = []

User applied rule case distinction

And obtained the following new goals

Rule argument

pos: left 8

Additional information

Used simplifier rules: ⊦ [] | t = []; (s) ⊦ [] | b = []; (s) ⊦ l ≠ l0 → persistDependentReads(l, h) | l0 = h | l0; (s)

Proof step 55 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l0, h0 + (W(t0, l0, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), apcf(t2) = resRead, ctr(l3) = 0, l0 = l3, lsf(t2) = mkFLITPSCls(t2, l3, ov), pcf(t2) = R2, ((h0 | l3) | t2) | false = [], ((h | l3) | t2) | false = [], ((W(t0, l3, v), false) ' | t2) | false = [], p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, ov), R2), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), mkPLIBls(t2, il, iv, ov), resRead), abs(h0 + (W(t0, l0, v), false) ' + h, writers0, p), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ l4. l4 ≠ l3 ∧ ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = [] ⊦ ((l0 = l3 ⊃ (W(t0, l3, v), true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h) | l3) | t2) | false = []

Heuristic simplifier applied rule simplifier

And obtained the following new goals

Rule argument

Additional information

Used simplifier rules: ⊦ # x = 0 ↔ x = []; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic ⊦ ((h | l) | t) | false = [] → ((persistDependentReads(l, h) | l) | t) | false = []; (s) ⊦ W(t, l, v).t = t; (s) ⊦ (e, b) ' | t = (t = e.t ⊃ (e, b) ';[]); (s) ⊦ [] | b = []; (s) ⊦ [] | t = []; (s)

Proof step 56 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l3, h0 + (W(t0, l3, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), apcf(t2) = resRead, ctr(l3) = 0, lsf(t2) = mkFLITPSCls(t2, l3, ov), pcf(t2) = R2, (t2 = t0 ⊃ (W(t0, l3, v), false) ';[]) | false = [], ((h0 | l3) | t2) | false = [], ((h | l3) | t2) | false = [], p(l3) ≠ [], (t2 = t0 ⊃ (W(t0, l3, v), true) ';[]) | false ≠ [], firstPersistW(p(l3)) < # p(l3), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l3 := v), p(l3 := p(l3) -p firstPersistW(p(l3))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, ov), R2), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l3, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l3, v), false) ' + h), mkPLIBls(t2, il, iv, ov), resRead), abs(h0 + (W(t0, l3, v), false) ' + h, writers0, p), ∀ l4. l4 ≠ l3 ∧ ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((h | l4) | t2) | false = [], ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l3, v), false) ' + h), alsf(t), apcf(t)), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l3, v), false) ' + h), alsf(t), apcf(t)) ⊦

User applied rule case distinction

And closed the goal!

Rule argument

pos: left 11

Additional information

Used simplifier rules: ⊦ [] | b = []; (s) ⊦ (e, b) ' | b0 = (b ↔ b0 ⊃ (e, b) ';[]); (s) ⊦ a ' ≠ []; (s)

Proof step 57 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l0, h0 + (W(t0, l0, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), lsf(t2) = mkFLITPSCls(t2, l3, v0), pcf(t2) = W4, (((h0 | l3) | t2) | false) + (((l0 = l3 ⊃ (W(t0, l3, v), true) ';[]) | t2) | false) + (((persistDependentReads(l0, h) | l3) | t2) | false) ≠ (W(t2, l3, v0), false) ', p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, l3, v0), pcf(t2)), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), mkPLIBls(t2, il, iv, ov), apcf(t2)), abs(h0 + (W(t0, l0, v), false) ' + h, writers0, p), pcf(t2) = W4 → (((h0 | l3) | t2) | false) + (((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false) + (((h | l3) | t2) | false) = (W(t2, l3, v0), false) ' ∨ ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = R2 → ctr(l3) = 0 → ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), false) ';[]) | t2) | false = [] ∧ ((h | l3) | t2) | false = [], pcf(t2) = R2 ∨ pcf(t2) = R3 → (∀ l4. l4 ≠ l3 ∧ ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → (∀ l4. ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = idle ∨ pcf(t2) = ready ∨ pcf(t2) = R1 ∨ pcf(t2) = R4 ∨ pcf(t2) = W1 ∨ pcf(t2) = W5 → (∀ l4. ¬ FO(t2) ∈ p(l4) → ((h0 | l4) | t2) | false = [] ∧ ((l0 = l4 ⊃ (W(t0, l4, v), false) ';[]) | t2) | false = [] ∧ ((h | l4) | t2) | false = []), pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → apcf(t2) = resWrite, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 → apcf(t2) = invWrite, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → apcf(t2) = resRead, pcf(t2) = R1 → apcf(t2) = invRead, pcf(t2) = crashed → apcf(t2) = crashed, pcf(t2) = ready → apcf(t2) = ready, pcf(t2) = idle → apcf(t2) = idle, pcf(t2) = W1 ∨ pcf(t2) = W2 ∨ pcf(t2) = W3 ∨ pcf(t2) = W4 ∨ pcf(t2) = W5 ∨ pcf(t2) = W6 ∨ pcf(t2) = W7 → l3 = il ∧ v0 = iv, pcf(t2) = R2 ∨ pcf(t2) = R3 ∨ pcf(t2) = R4 → v0 = ov, pcf(t2) = R1 → l3 = il, ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)) ⊦ ((h0 | l3) | t2) | false = [] ∧ ((l0 = l3 ⊃ (W(t0, l3, v), true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h) | l3) | t2) | false = []

Heuristic simplifier applied rule simplifier

And obtained the following new goals

Rule argument

Additional information

Used simplifier rules: ⊦ W4 ≠ W5; (s) ⊦ W1 ≠ W4; (s) ⊦ R4 ≠ W4; (s) ⊦ R1 ≠ W4; (s) ⊦ W4 ≠ ready; (s) ⊦ W4 ≠ idle; (s) ⊦ W4 ≠ W7; (s) ⊦ W4 ≠ W6; (s) ⊦ W3 ≠ W4; (s) ⊦ W2 ≠ W4; (s) ⊦ R3 ≠ W4; (s) ⊦ R2 ≠ W4; (s) ⊦ W4 ≠ crashed; (s)

Proof step 58 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l0, h0 + (W(t0, l0, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), apcf(t2) = resWrite, lsf(t2) = mkFLITPSCls(t2, il, iv), pcf(t2) = W4, (((h0 | il) | t2) | false) + (((l0 = il ⊃ (W(t0, il, v), true) ';[]) | t2) | false) + (((persistDependentReads(l0, h) | il) | t2) | false) ≠ (W(t2, il, iv), false) ', p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, il, iv), W4), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), mkPLIBls(t2, il, iv, ov), resWrite), abs(h0 + (W(t0, l0, v), false) ' + h, writers0, p), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), (((h0 | il) | t2) | false) + (((l0 = il ⊃ (W(t0, il, v), false) ';[]) | t2) | false) + (((h | il) | t2) | false) = (W(t2, il, iv), false) ' ∨ ((h0 | il) | t2) | false = [] ∧ ((l0 = il ⊃ (W(t0, il, v), false) ';[]) | t2) | false = [] ∧ ((h | il) | t2) | false = [] ⊦ ((h0 | il) | t2) | false = [] ∧ ((l0 = il ⊃ (W(t0, il, v), true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h) | il) | t2) | false = []

User applied rule case distinction

And obtained the following new goals

Rule argument

pos: left 6

Additional information

Used simplifier rules: ⊦ [] + x = x; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ [] | t = []; (s) ⊦ [] | b = []; (s) ⊦ l ≠ l0 → persistDependentReads(l, h) | l0 = h | l0; (s)

Proof step 59 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(l0, h0 + (W(t0, l0, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), apcf(t2) = resWrite, l0 = il, lsf(t2) = mkFLITPSCls(t2, il, iv), pcf(t2) = W4, (((h0 | il) | t2) | false) + (((W(t0, il, v), true) ' | t2) | false) + (((persistDependentReads(l0, h) | il) | t2) | false) ≠ (W(t2, il, iv), false) ', p(l0) ≠ [], firstPersistW(p(l0)) < # p(l0), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(l0 := v), p(l0 := p(l0) -p firstPersistW(p(l0))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, il, iv), W4), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), mkPLIBls(t2, il, iv, ov), resWrite), abs(h0 + (W(t0, l0, v), false) ' + h, writers0, p), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, l0, v), false) ' + h), alsf(t), apcf(t)), (((h0 | il) | t2) | false) + (((l0 = il ⊃ (W(t0, il, v), false) ';[]) | t2) | false) + (((h | il) | t2) | false) = (W(t2, il, iv), false) ' ∨ ((h0 | il) | t2) | false = [] ∧ ((l0 = il ⊃ (W(t0, il, v), false) ';[]) | t2) | false = [] ∧ ((h | il) | t2) | false = [] ⊦ ((h0 | il) | t2) | false = [] ∧ ((l0 = il ⊃ (W(t0, il, v), true) ';[]) | t2) | false = [] ∧ ((persistDependentReads(l0, h) | il) | t2) | false = []

Heuristic simplifier applied rule simplifier

And obtained the following new goals

Rule argument

Additional information

Used simplifier rules: ⊦ # x = 0 ↔ x = []; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic ⊦ W(t, l, v).t = t; (s) ⊦ (e, b) ' | t = (t = e.t ⊃ (e, b) ';[]); (s) a: ⊦ (x + y) + z = x + y + z; from specification list

Proof step 60 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(il, h0 + (W(t0, il, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), apcf(t2) = resWrite, lsf(t2) = mkFLITPSCls(t2, il, iv), pcf(t2) = W4, (((h0 | il) | t2) | false) + ((t2 = t0 ⊃ (W(t0, il, v), true) ';[]) | false) + (((persistDependentReads(il, h) | il) | t2) | false) ≠ (W(t2, il, iv), false) ', p(il) ≠ [], firstPersistW(p(il)) < # p(il), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(il := v), p(il := p(il) -p firstPersistW(p(il))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, il, iv), W4), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), mkPLIBls(t2, il, iv, ov), resWrite), abs(h0 + (W(t0, il, v), false) ' + h, writers0, p), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), alsf(t), apcf(t)), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), alsf(t), apcf(t)), (((h0 | il) | t2) | false) + ((t2 = t0 ⊃ (W(t0, il, v), false) ';[]) | false) + (((h | il) | t2) | false) = (W(t2, il, iv), false) ' ∨ ((h0 | il) | t2) | false = [] ∧ (t2 = t0 ⊃ (W(t0, il, v), false) ';[]) | false = [] ∧ ((h | il) | t2) | false = [] ⊦ ((h0 | il) | t2) | false = [] ∧ (t2 = t0 ⊃ (W(t0, il, v), true) ';[]) | false = [] ∧ ((persistDependentReads(il, h) | il) | t2) | false = []

User applied rule cut formula

And obtained the following new goals

Rule argument

fma: (t2 = t0 ⊃ (W(t0, il, v), true) ';[]) | false = []

Additional information

Used formulas: (t2 = t0 ⊃ (W(t0, il, v), true) ';[]) | false = []

Proof step 61 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(il, h0 + (W(t0, il, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), apcf(t2) = resWrite, lsf(t2) = mkFLITPSCls(t2, il, iv), pcf(t2) = W4, (t2 = t0 ⊃ (W(t0, il, v), true) ';[]) | false = [], (((h0 | il) | t2) | false) + ((t2 = t0 ⊃ (W(t0, il, v), true) ';[]) | false) + (((persistDependentReads(il, h) | il) | t2) | false) ≠ (W(t2, il, iv), false) ', p(il) ≠ [], firstPersistW(p(il)) < # p(il), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(il := v), p(il := p(il) -p firstPersistW(p(il))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, il, iv), W4), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), mkPLIBls(t2, il, iv, ov), resWrite), abs(h0 + (W(t0, il, v), false) ' + h, writers0, p), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), alsf(t), apcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), alsf(t), apcf(t)), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), (((h0 | il) | t2) | false) + ((t2 = t0 ⊃ (W(t0, il, v), false) ';[]) | false) + (((h | il) | t2) | false) = (W(t2, il, iv), false) ' ∨ ((h0 | il) | t2) | false = [] ∧ (t2 = t0 ⊃ (W(t0, il, v), false) ';[]) | false = [] ∧ ((h | il) | t2) | false = [] ⊦ ((h0 | il) | t2) | false = [] ∧ (t2 = t0 ⊃ (W(t0, il, v), true) ';[]) | false = [] ∧ ((persistDependentReads(il, h) | il) | t2) | false = []

Heuristic simplifier applied rule simplifier

And obtained the following new goals

Rule argument

Additional information

Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ [] + x = x; (s)

Proof step 62 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(il, h0 + (W(t0, il, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), apcf(t2) = resWrite, lsf(t2) = mkFLITPSCls(t2, il, iv), pcf(t2) = W4, (t2 = t0 ⊃ (W(t0, il, v), true) ';[]) | false = [], (((h0 | il) | t2) | false) + (((persistDependentReads(il, h) | il) | t2) | false) ≠ (W(t2, il, iv), false) ', p(il) ≠ [], firstPersistW(p(il)) < # p(il), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(il := v), p(il := p(il) -p firstPersistW(p(il))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, il, iv), W4), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), mkPLIBls(t2, il, iv, ov), resWrite), abs(h0 + (W(t0, il, v), false) ' + h, writers0, p), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), alsf(t), apcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), alsf(t), apcf(t)), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), (((h0 | il) | t2) | false) + ((t2 = t0 ⊃ (W(t0, il, v), false) ';[]) | false) + (((h | il) | t2) | false) = (W(t2, il, iv), false) ' ∨ ((h0 | il) | t2) | false = [] ∧ (t2 = t0 ⊃ (W(t0, il, v), false) ';[]) | false = [] ∧ ((h | il) | t2) | false = [] ⊦ ((h0 | il) | t2) | false = [] ∧ ((persistDependentReads(il, h) | il) | t2) | false = []

User applied rule apply rewrite lemma

And obtained the following new goals

Rule argument

spec: list, name:one-01, seq: ⊦ y ≠ [] → (a ' = x + y ↔ x = [] ∧ a ' = y), subst:[a, x, y] → [(W(t2, il, iv), false), ((h0 | il) | t2) | false, ((persistDependentReads(il, h) | il) | t2) | false]; ['a] → [(RWevent, Bool)], <all paths>

Additional information

Used terms: (W(t2, il, iv), false), ((h0 | il) | t2) | false, ((persistDependentReads(il, h) | il) | t2) | false

Proof step 63 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

⊦ y ≠ [] → (a ' = x + y ↔ x = [] ∧ a ' = y)

A spec-lemma

Proof step 64 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(il, h0 + (W(t0, il, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), apcf(t2) = resWrite, lsf(t2) = mkFLITPSCls(t2, il, iv), pcf(t2) = W4, ((persistDependentReads(il, h) | il) | t2) | false = [], (t2 = t0 ⊃ (W(t0, il, v), true) ';[]) | false = [], (((h0 | il) | t2) | false) + (((persistDependentReads(il, h) | il) | t2) | false) ≠ (W(t2, il, iv), false) ', p(il) ≠ [], firstPersistW(p(il)) < # p(il), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(il := v), p(il := p(il) -p firstPersistW(p(il))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, il, iv), W4), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), mkPLIBls(t2, il, iv, ov), resWrite), abs(h0 + (W(t0, il, v), false) ' + h, writers0, p), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), alsf(t), apcf(t)), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), alsf(t), apcf(t)), (((h0 | il) | t2) | false) + ((t2 = t0 ⊃ (W(t0, il, v), false) ';[]) | false) + (((h | il) | t2) | false) = (W(t2, il, iv), false) ' ∨ ((h0 | il) | t2) | false = [] ∧ (t2 = t0 ⊃ (W(t0, il, v), false) ';[]) | false = [] ∧ ((h | il) | t2) | false = [] ⊦ ((h0 | il) | t2) | false = [] ∧ ((persistDependentReads(il, h) | il) | t2) | false = []

Heuristic simplifier applied rule simplifier

And obtained the following new goals

Rule argument

Additional information

Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ x + [] = x; (s)

Proof step 65 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(il, h0 + (W(t0, il, v), false) ' + h), (((h0 | il) | t2) | false) + ((t2 = t0 ⊃ (W(t0, il, v), false) ';[]) | false) + (((h | il) | t2) | false) = (W(t2, il, iv), false) ', alsf(t2) = mkPLIBls(t2, il, iv, ov), apcf(t2) = resWrite, lsf(t2) = mkFLITPSCls(t2, il, iv), pcf(t2) = W4, ((persistDependentReads(il, h) | il) | t2) | false = [], (t2 = t0 ⊃ (W(t0, il, v), true) ';[]) | false = [], p(il) ≠ [], ((h0 | il) | t2) | false ≠ [], ((h0 | il) | t2) | false ≠ (W(t2, il, iv), false) ', firstPersistW(p(il)) < # p(il), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(il := v), p(il := p(il) -p firstPersistW(p(il))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, il, iv), W4), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), mkPLIBls(t2, il, iv, ov), resWrite), abs(h0 + (W(t0, il, v), false) ' + h, writers0, p), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), alsf(t), apcf(t)), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), alsf(t), apcf(t)) ⊦

User applied rule case distinction

And obtained the following new goals

Rule argument

pos: left 2

Additional information

Used simplifier rules: ⊦ (e, b) ' | b0 = (b ↔ b0 ⊃ (e, b) ';[]); (s) ⊦ x + a ' + y = a0 ' ↔ x = [] ∧ a = a0 ∧ y = []; (ws) a: ⊦ (x + y) + z = x + y + z; from specification list

Proof step 66 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(il, h0 + (W(t0, il, v), false) ' + h), (((h0 | il) | t2) | false) + ([] | false) + (((h | il) | t2) | false) = (W(t2, il, iv), false) ', alsf(t2) = mkPLIBls(t2, il, iv, ov), apcf(t2) = resWrite, lsf(t2) = mkFLITPSCls(t2, il, iv), pcf(t2) = W4, (t2 = t0 ⊃ (W(t0, il, v), true) ';[]) | false = [], ((persistDependentReads(il, h) | il) | t2) | false = [], p(il) ≠ [], t2 ≠ t0, ((h0 | il) | t2) | false ≠ [], ((h0 | il) | t2) | false ≠ (W(t2, il, iv), false) ', firstPersistW(p(il)) < # p(il), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(il := v), p(il := p(il) -p firstPersistW(p(il))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, il, iv), W4), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), mkPLIBls(t2, il, iv, ov), resWrite), abs(h0 + (W(t0, il, v), false) ' + h, writers0, p), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), alsf(t), apcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), alsf(t), apcf(t)), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)) ⊦

Heuristic simplifier applied rule simplifier

And obtained the following new goals

Rule argument

Additional information

Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ [] + x = x; (s) ⊦ [] | b = []; (s)

Proof step 67 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(il, h0 + (W(t0, il, v), false) ' + h), (((h0 | il) | t2) | false) + (((h | il) | t2) | false) = (W(t2, il, iv), false) ', alsf(t2) = mkPLIBls(t2, il, iv, ov), apcf(t2) = resWrite, lsf(t2) = mkFLITPSCls(t2, il, iv), pcf(t2) = W4, ((persistDependentReads(il, h) | il) | t2) | false = [], p(il) ≠ [], t2 ≠ t0, ((h0 | il) | t2) | false ≠ [], ((h0 | il) | t2) | false ≠ (W(t2, il, iv), false) ', firstPersistW(p(il)) < # p(il), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(il := v), p(il := p(il) -p firstPersistW(p(il))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, il, iv), W4), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), mkPLIBls(t2, il, iv, ov), resWrite), abs(h0 + (W(t0, il, v), false) ' + h, writers0, p), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), alsf(t), apcf(t)), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), alsf(t), apcf(t)) ⊦

User applied rule apply rewrite lemma

And obtained the following new goals

Rule argument

spec: list, name:one-01, seq: ⊦ y ≠ [] → (a ' = x + y ↔ x = [] ∧ a ' = y), subst:[a, x, y] → [(W(t2, il, iv), false), ((h0 | il) | t2) | false, ((h | il) | t2) | false]; ['a] → [(RWevent, Bool)], <all paths>

Additional information

Used simplifier rules: ⊦ ((h | l) | t) | false = [] → ((persistDependentReads(l, h) | l) | t) | false = []; (s) ⊦ x + [] = x; (s) a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: (W(t2, il, iv), false), ((h0 | il) | t2) | false, ((h | il) | t2) | false

Proof step 68 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

⊦ y ≠ [] → (a ' = x + y ↔ x = [] ∧ a ' = y)

A spec-lemma

Proof step 69 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(il, h0 + (W(t0, il, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), apcf(t2) = resWrite, lsf(t2) = mkFLITPSCls(t2, il, iv), pcf(t2) = W4, (t2 = t0 ⊃ (W(t0, il, v), true) ';[]) | false = [], p(il) ≠ [], ((persistDependentReads(il, h) | il) | t2) | false ≠ [], firstPersistW(p(il)) < # p(il), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(il := v), p(il := p(il) -p firstPersistW(p(il))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, il, iv), W4), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), mkPLIBls(t2, il, iv, ov), resWrite), abs(h0 + (W(t0, il, v), false) ' + h, writers0, p), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), alsf(t), apcf(t)), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), alsf(t), apcf(t)), (((h0 | il) | t2) | false) + ((t2 = t0 ⊃ (W(t0, il, v), false) ';[]) | false) + (((h | il) | t2) | false) = (W(t2, il, iv), false) ' ∨ ((h0 | il) | t2) | false = [] ∧ (t2 = t0 ⊃ (W(t0, il, v), false) ';[]) | false = [] ∧ ((h | il) | t2) | false = [], ((h0 | il) | t2) | false ≠ [] ∨ (W(t2, il, iv), false) ' ≠ ((persistDependentReads(il, h) | il) | t2) | false ⊦ ((h0 | il) | t2) | false = [] ∧ ((persistDependentReads(il, h) | il) | t2) | false = []

Heuristic simplifier applied rule simplifier

And obtained the following new goals

Rule argument

Additional information

Proof step 70 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(il, h0 + (W(t0, il, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), apcf(t2) = resWrite, lsf(t2) = mkFLITPSCls(t2, il, iv), pcf(t2) = W4, (t2 = t0 ⊃ (W(t0, il, v), true) ';[]) | false = [], p(il) ≠ [], ((persistDependentReads(il, h) | il) | t2) | false ≠ [], firstPersistW(p(il)) < # p(il), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(il := v), p(il := p(il) -p firstPersistW(p(il))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, il, iv), W4), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), mkPLIBls(t2, il, iv, ov), resWrite), abs(h0 + (W(t0, il, v), false) ' + h, writers0, p), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), alsf(t), apcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), alsf(t), apcf(t)), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ((h0 | il) | t2) | false ≠ [] ∨ (W(t2, il, iv), false) ' ≠ ((persistDependentReads(il, h) | il) | t2) | false, (((h0 | il) | t2) | false) + ((t2 = t0 ⊃ (W(t0, il, v), false) ';[]) | false) + (((h | il) | t2) | false) = (W(t2, il, iv), false) ' ∨ ((h0 | il) | t2) | false = [] ∧ (t2 = t0 ⊃ (W(t0, il, v), false) ';[]) | false = [] ∧ ((h | il) | t2) | false = [] ⊦

User applied rule case distinction

And obtained the following new goals

Rule argument

pos: left 20

Additional information

Used simplifier rules: ⊦ ((h | l) | t) | false = [] → ((persistDependentReads(l, h) | l) | t) | false = []; (s)

Proof step 71 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(il, h0 + (W(t0, il, v), false) ' + h), (((h0 | il) | t2) | false) + ((t2 = t0 ⊃ (W(t0, il, v), false) ';[]) | false) + (((h | il) | t2) | false) = (W(t2, il, iv), false) ', alsf(t2) = mkPLIBls(t2, il, iv, ov), apcf(t2) = resWrite, lsf(t2) = mkFLITPSCls(t2, il, iv), pcf(t2) = W4, (t2 = t0 ⊃ (W(t0, il, v), true) ';[]) | false = [], p(il) ≠ [], ((persistDependentReads(il, h) | il) | t2) | false ≠ [], firstPersistW(p(il)) < # p(il), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(il := v), p(il := p(il) -p firstPersistW(p(il))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, il, iv), W4), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), mkPLIBls(t2, il, iv, ov), resWrite), abs(h0 + (W(t0, il, v), false) ' + h, writers0, p), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), alsf(t), apcf(t)), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), alsf(t), apcf(t)), ((h0 | il) | t2) | false ≠ [] ∨ (W(t2, il, iv), false) ' ≠ ((persistDependentReads(il, h) | il) | t2) | false ⊦

User applied rule case distinction

And obtained the following new goals

Rule argument

pos: left 2

Additional information

Used simplifier rules: ⊦ (e, b) ' | b0 = (b ↔ b0 ⊃ (e, b) ';[]); (s) ⊦ x + a ' + y = a0 ' ↔ x = [] ∧ a = a0 ∧ y = []; (ws) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ W(t, l, v) = W(t0, l0, v0) ↔ t = t0 ∧ l = l0 ∧ v = v0; (ws) ⊦ ((h | l) | t) | false = [] → ((persistDependentReads(l, h) | l) | t) | false = []; (s)

Proof step 72 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(il, h0 + (W(t0, il, v), false) ' + h), (((h0 | il) | t2) | false) + ([] | false) + (((h | il) | t2) | false) = (W(t2, il, iv), false) ', alsf(t2) = mkPLIBls(t2, il, iv, ov), apcf(t2) = resWrite, lsf(t2) = mkFLITPSCls(t2, il, iv), pcf(t2) = W4, (t2 = t0 ⊃ (W(t0, il, v), true) ';[]) | false = [], p(il) ≠ [], t2 ≠ t0, ((persistDependentReads(il, h) | il) | t2) | false ≠ [], firstPersistW(p(il)) < # p(il), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(il := v), p(il := p(il) -p firstPersistW(p(il))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, il, iv), W4), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), mkPLIBls(t2, il, iv, ov), resWrite), abs(h0 + (W(t0, il, v), false) ' + h, writers0, p), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), alsf(t), apcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), alsf(t), apcf(t)), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ((h0 | il) | t2) | false ≠ [] ∨ (W(t2, il, iv), false) ' ≠ ((persistDependentReads(il, h) | il) | t2) | false ⊦

Heuristic simplifier applied rule simplifier

And obtained the following new goals

Rule argument

Additional information

Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ [] + x = x; (s) ⊦ [] | b = []; (s)

Proof step 73 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(il, h0 + (W(t0, il, v), false) ' + h), (((h0 | il) | t2) | false) + (((h | il) | t2) | false) = (W(t2, il, iv), false) ', alsf(t2) = mkPLIBls(t2, il, iv, ov), apcf(t2) = resWrite, lsf(t2) = mkFLITPSCls(t2, il, iv), pcf(t2) = W4, p(il) ≠ [], t2 ≠ t0, ((persistDependentReads(il, h) | il) | t2) | false ≠ [], firstPersistW(p(il)) < # p(il), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(il := v), p(il := p(il) -p firstPersistW(p(il))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, il, iv), W4), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), mkPLIBls(t2, il, iv, ov), resWrite), abs(h0 + (W(t0, il, v), false) ' + h, writers0, p), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), alsf(t), apcf(t)), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), alsf(t), apcf(t)), ((h0 | il) | t2) | false ≠ [] ∨ (W(t2, il, iv), false) ' ≠ ((persistDependentReads(il, h) | il) | t2) | false ⊦

User applied rule apply rewrite lemma

And obtained the following new goals

Rule argument

spec: list, name:one-01, seq: ⊦ y ≠ [] → (a ' = x + y ↔ x = [] ∧ a ' = y), subst:[a, x, y] → [(W(t2, il, iv), false), ((h0 | il) | t2) | false, ((h | il) | t2) | false]; ['a] → [(RWevent, Bool)], <all paths>

Additional information

Used simplifier rules: ⊦ a ' ≠ []; (s) ⊦ ((h | l) | t) | false = (W(t0, l0, v0), b) ' → ((persistDependentReads(l, h) | l) | t) | false = (W(t0, l0, v0), b) '; (s) ⊦ a ' = a0 ' ↔ a = a0; (s) ⊦ ((h | l) | t) | false = [] → ((persistDependentReads(l, h) | l) | t) | false = []; (s) Used terms: (W(t2, il, iv), false), ((h0 | il) | t2) | false, ((h | il) | t2) | false

Proof step 74 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

⊦ y ≠ [] → (a ' = x + y ↔ x = [] ∧ a ' = y)

A spec-lemma

Proof step 75 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(il, h0 + (W(t0, il, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), apcf(t2) = resWrite, lsf(t2) = mkFLITPSCls(t2, il, iv), pcf(t2) = W4, (((h0 | il) | t2) | false) + ((t2 = t0 ⊃ (W(t0, il, v), true) ';[]) | false) + (((persistDependentReads(il, h) | il) | t2) | false) ≠ (W(t2, il, iv), false) ', p(il) ≠ [], (t2 = t0 ⊃ (W(t0, il, v), true) ';[]) | false ≠ [], firstPersistW(p(il)) < # p(il), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(il := v), p(il := p(il) -p firstPersistW(p(il))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, il, iv), W4), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), mkPLIBls(t2, il, iv, ov), resWrite), abs(h0 + (W(t0, il, v), false) ' + h, writers0, p), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), alsf(t), apcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), alsf(t), apcf(t)), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), (((h0 | il) | t2) | false) + ((t2 = t0 ⊃ (W(t0, il, v), false) ';[]) | false) + (((h | il) | t2) | false) = (W(t2, il, iv), false) ' ∨ ((h0 | il) | t2) | false = [] ∧ (t2 = t0 ⊃ (W(t0, il, v), false) ';[]) | false = [] ∧ ((h | il) | t2) | false = [] ⊦ ((h0 | il) | t2) | false = [] ∧ (t2 = t0 ⊃ (W(t0, il, v), true) ';[]) | false = [] ∧ ((persistDependentReads(il, h) | il) | t2) | false = []

Heuristic simplifier applied rule simplifier

And obtained the following new goals

Rule argument

Additional information

Proof step 76 from proof step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (previous step) (back to tree)

# h0 = firstVolWrite(il, h0 + (W(t0, il, v), false) ' + h), alsf(t2) = mkPLIBls(t2, il, iv, ov), apcf(t2) = resWrite, lsf(t2) = mkFLITPSCls(t2, il, iv), pcf(t2) = W4, (((h0 | il) | t2) | false) + ((t2 = t0 ⊃ (W(t0, il, v), true) ';[]) | false) + (((persistDependentReads(il, h) | il) | t2) | false) ≠ (W(t2, il, iv), false) ', p(il) ≠ [], (t2 = t0 ⊃ (W(t0, il, v), true) ';[]) | false ≠ [], firstPersistW(p(il)) < # p(il), FLITPSCGInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0)), FLITPSCInv(mkFLITPSCgs(mem0(il := v), p(il := p(il) -p firstPersistW(p(il))), ctr, writers, writers0), lsf, pcf), FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), mkFLITPSCls(t2, il, iv), W4), PLIBGInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h)), PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), mkPLIBls(t2, il, iv, ov), resWrite), abs(h0 + (W(t0, il, v), false) ' + h, writers0, p), ∀ t. lsf(t).t = t ∧ FLITPSCLInv(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t)), ∀ t. alsf(t).t = t ∧ PLIBLInv(mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), alsf(t), apcf(t)), ∀ t. labs(mkFLITPSCgs(mem0, p, ctr, writers, writers0), lsf(t), pcf(t), mkPLIBgs(mem0 ⊕ p, mem0, h0 + (W(t0, il, v), false) ' + h), alsf(t), apcf(t)), (((h0 | il) | t2) | false) + ((t2 = t0 ⊃ (W(t0, il, v), false) ';[]) | false) + (((h | il) | t2) | false) = (W(t2, il, iv), false) ' ∨ ((h0 | il) | t2) | false = [] ∧ (t2 = t0 ⊃ (W(t0, il, v), false) ';[]) | false = [] ∧ ((h | il) | t2) | false = [] ⊦

User applied rule case distinction

And closed the goal!

Rule argument

pos: left 8

Additional information

Used simplifier rules: ⊦ [] + x = x; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ [] | b = []; (s) ⊦ (e, b) ' | b0 = (b ↔ b0 ⊃ (e, b) ';[]); (s)

Proof Tree for step-absstep-PSCPERSIST_W-globalPSCPERSIST_W (View conclusion)

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.

the proof tree