| ⊦ ( (ctrok(gs.ctr, gs.writers) ∧ writersOk(gs.p, gs.writers) ∧ pendingOk(gs.p)) ∧ notMember(ls.t, gs.writers) ∧ notMember(ls.t, gs.readers) ∧ noPendingW(ls.t, gs.p)) ∧ pre(gs, ls, ready, a) ∧ pcstepf(gs, ls, ready, a) = W1 → ( ctrok(gstepf(gs, ls, ready, a).ctr, gstepf(gs, ls, ready, a).writers) ∧ writersOk(gstepf(gs, ls, ready, a).p, gstepf(gs, ls, ready, a).writers) ∧ pendingOk(gstepf(gs, ls, ready, a).p)) ∧ notMember(lstepf(gs, ls, ready, a).t, gstepf(gs, ls, ready, a).readers) ∧ notMember(lstepf(gs, ls, ready, a).t, gstepf(gs, ls, ready, a).writers) ∧ noPendingW(lstepf(gs, ls, ready, a).t, gstepf(gs, ls, ready, a).p) |
pcstepf(gs, ls, ready, a) = W1, ctrok(gs.ctr, gs.writers), noPendingW(ls.t, gs.p), notMember(ls.t, gs.writers), notMember(ls.t, gs.readers), pendingOk(gs.p), pre(gs, ls, ready, a), writersOk(gs.p, gs.writers) ⊦ ( ctrok(gstepf(gs, ls, ready, a).ctr, gstepf(gs, ls, ready, a).writers) ∧ writersOk(gstepf(gs, ls, ready, a).p, gstepf(gs, ls, ready, a).writers) ∧ pendingOk(gstepf(gs, ls, ready, a).p)) ∧ notMember(lstepf(gs, ls, ready, a).t, gstepf(gs, ls, ready, a).readers) ∧ notMember(lstepf(gs, ls, ready, a).t, gstepf(gs, ls, ready, a).writers) ∧ noPendingW(lstepf(gs, ls, ready, a).t, gstepf(gs, ls, ready, a).p)
| pcstepf(gs, ls, ready, a) = W1, ctrok(gs.ctr, gs.writers), noPendingW(ls.t, gs.p), notMember(ls.t, gs.writers), notMember(ls.t, gs.readers), pendingOk(gs.p), pre(gs, ls, ready, a), writersOk(gs.p, gs.writers) ⊦ ( ctrok(gstepf(gs, ls, ready, a).ctr, gstepf(gs, ls, ready, a).writers) ∧ writersOk(gstepf(gs, ls, ready, a).p, gstepf(gs, ls, ready, a).writers) ∧ pendingOk(gstepf(gs, ls, ready, a).p)) ∧ notMember(lstepf(gs, ls, ready, a).t, gstepf(gs, ls, ready, a).readers) ∧ notMember(lstepf(gs, ls, ready, a).t, gstepf(gs, ls, ready, a).writers) ∧ noPendingW(lstepf(gs, ls, ready, a).t, gstepf(gs, ls, ready, a).p) |
pcstepf(gs, ls, ready, a) = W1, a ≠ invFLITPSCREAD(ls.t, l), ctrok(gs.ctr, gs.writers), noPendingW(ls.t, gs.p), notMember(ls.t, gs.writers), notMember(ls.t, gs.readers), pendingOk(gs.p), writersOk(gs.p, gs.writers), a = callPSCCOMPLETE(ls.t) ∧ (∀ l. ¬ FO(ls.t) ∈ gs.p(l)) ∨ a = invFLITPSCWRITE(ls.t, l0, v0) ⊦ notMember(lstepf(gs, ls, ready, a).t, gs.readers) ∧ notMember(lstepf(gs, ls, ready, a).t, gs.writers) ∧ noPendingW(lstepf(gs, ls, ready, a).t, gs.p)
Used simplifier rules: ⊦ R1 ≠ W1; (s) ⊦ ls.t = t → pcstepf(gs, ls, ready, invFLITPSCREAD(t, l0)) = R1; (s) ⊦ gstepf(gs, ls, ready, a) = gs; (s) ⊦ pre(gs, ls, ready, a) ↔ (∃ l0, v0. a = invFLITPSCWRITE(ls.t, l0, v0)) ∨ (∃ l0. a = invFLITPSCREAD(ls.t, l0)) ∨ a = callPSCCOMPLETE(ls.t) ∧ (∀ l. ¬ FO(ls.t) ∈ gs.p(l)); (s)
| pcstepf(gs, ls, ready, a) = W1, a ≠ invFLITPSCREAD(ls.t, l), ctrok(gs.ctr, gs.writers), noPendingW(ls.t, gs.p), notMember(ls.t, gs.writers), notMember(ls.t, gs.readers), pendingOk(gs.p), writersOk(gs.p, gs.writers), a = callPSCCOMPLETE(ls.t) ∧ (∀ l. ¬ FO(ls.t) ∈ gs.p(l)) ∨ a = invFLITPSCWRITE(ls.t, l0, v0) ⊦ notMember(lstepf(gs, ls, ready, a).t, gs.readers) ∧ notMember(lstepf(gs, ls, ready, a).t, gs.writers) ∧ noPendingW(lstepf(gs, ls, ready, a).t, gs.p) |
Used simplifier rules: ⊦ ls.t = t → pcstepf(gs, ls, ready, invFLITPSCWRITE(t, l0, v0)) = W1; (s) ⊦ invFLITPSCREAD(t, l) ≠ invFLITPSCWRITE(t0, l0, v); (s) ⊦ ls.t = t → lstepf(gs, ls, ready, invFLITPSCWRITE(t, l0, v0)) = (ls.l:= l0).v:= v0; (s) ⊦ (ls.v:= v).t = ls.t; (s) ⊦ (ls.l:= l).t = ls.t; (s) ⊦ ls.t = t → pcstepf(gs, ls, ready, callPSCCOMPLETE(t)) = ready; (s) ⊦ W1 ≠ ready; (s)
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.