| ⊦ (ctrok(gs.ctr, gs.writers) ∧ writersOk(gs.p, gs.writers) ∧ pendingOk(gs.p)) ∧ (∃ n. isPersistFO(n, gs.p(l))) ∧ ⟨p := gs.p; PSCPERSIST_FO(l; p); gs.p := p⟩ (gs0 = gs) → (∀ t0. relyws(t0, gs.readers, gs0.readers) ∧ relyws(t0, gs.writers, gs0.writers) ∧ rely(t0, gs.p, gs0.p)) |
⟨p := gs.p; PSCPERSIST_FO(l; p); gs.p := p⟩ (gs0 = gs), ctrok(gs.ctr, gs.writers), pendingOk(gs.p), writersOk(gs.p, gs.writers), ∃ n. isPersistFO(n, gs.p(l)) ⊦ ∀ t0. relyws(t0, gs.readers, gs0.readers) ∧ relyws(t0, gs.writers, gs0.writers) ∧ rely(t0, gs.p, gs0.p)
| ⟨p := gs.p; PSCPERSIST_FO(l; p); gs.p := p⟩ (gs0 = gs), ctrok(gs.ctr, gs.writers), pendingOk(gs.p), writersOk(gs.p, gs.writers), ∃ n. isPersistFO(n, gs.p(l)) ⊦ ∀ t0. relyws(t0, gs.readers, gs0.readers) ∧ relyws(t0, gs.writers, gs0.writers) ∧ rely(t0, gs.p, gs0.p) |
⟨p := gs.p; PSCPERSIST_FO(l; p); gs.p := p⟩ (gs0 = gs), ctrok(gs.ctr, gs.writers), isPersistFO(n, gs.p(l)), pendingOk(gs.p), writersOk(gs.p, gs.writers) ⊦ relyws(t0, gs.readers, gs0.readers) ∧ relyws(t0, gs.writers, gs0.writers) ∧ rely(t0, gs.p, gs0.p)
| ⟨p := gs.p; PSCPERSIST_FO(l; p); gs.p := p⟩ (gs0 = gs), ctrok(gs.ctr, gs.writers), isPersistFO(n, gs.p(l)), pendingOk(gs.p), writersOk(gs.p, gs.writers) ⊦ relyws(t0, gs.readers, gs0.readers) ∧ relyws(t0, gs.writers, gs0.writers) ∧ rely(t0, gs.p, gs0.p) |
⟨PSCPERSIST_FO(l; p); gs.p := p⟩ (gs0 = gs), p = gs.p, ctrok(gs.ctr, gs.writers), isPersistFO(n, gs.p(l)), pendingOk(gs.p), writersOk(gs.p, gs.writers) ⊦ relyws(t0, gs.readers, gs0.readers) ∧ relyws(t0, gs.writers, gs0.writers) ∧ rely(t0, gs.p, gs0.p)
| ⟨PSCPERSIST_FO(l; p); gs.p := p⟩ (gs0 = gs), p = gs.p, ctrok(gs.ctr, gs.writers), isPersistFO(n, gs.p(l)), pendingOk(gs.p), writersOk(gs.p, gs.writers) ⊦ relyws(t0, gs.readers, gs0.readers) ∧ relyws(t0, gs.writers, gs0.writers) ∧ rely(t0, gs.p, gs0.p) |
⟨gs.p := p0⟩ (gs0 = gs), ⟨PSCPERSIST_FO(l; p)⟩ (p = p0), p = gs.p, ctrok(gs.ctr, gs.writers), isPersistFO(n, gs.p(l)), pendingOk(gs.p), writersOk(gs.p, gs.writers) ⊦ relyws(t0, gs.readers, gs0.readers) ∧ relyws(t0, gs.writers, gs0.writers) ∧ rely(t0, gs.p, gs0.p)
| ⟨gs.p := p0⟩ (gs0 = gs), ⟨PSCPERSIST_FO(l; p)⟩ (p = p0), p = gs.p, ctrok(gs.ctr, gs.writers), isPersistFO(n, gs.p(l)), pendingOk(gs.p), writersOk(gs.p, gs.writers) ⊦ relyws(t0, gs.readers, gs0.readers) ∧ relyws(t0, gs.writers, gs0.writers) ∧ rely(t0, gs.p, gs0.p) |
⟨PSCPERSIST_FO(l; p)⟩ (p = p0), gs0 = gs.p:= p0, p = gs.p, ctrok(gs.ctr, gs.writers), isPersistFO(n, gs.p(l)), pendingOk(gs.p), writersOk(gs.p, gs.writers) ⊦ relyws(t0, gs.readers, gs0.readers) ∧ relyws(t0, gs.writers, gs0.writers) ∧ rely(t0, gs.p, gs0.p)
| ⟨PSCPERSIST_FO(l; p)⟩ (p = p0), gs0 = gs.p:= p0, p = gs.p, ctrok(gs.ctr, gs.writers), isPersistFO(n, gs.p(l)), pendingOk(gs.p), writersOk(gs.p, gs.writers) ⊦ relyws(t0, gs.readers, gs0.readers) ∧ relyws(t0, gs.writers, gs0.writers) ∧ rely(t0, gs.p, gs0.p) |
⟨PSCPERSIST_FO(l; p)⟩ (p = p0), p = gs.p, ctrok(gs.ctr, gs.writers), isPersistFO(n, gs.p(l)), pendingOk(gs.p), writersOk(gs.p, gs.writers), ¬ rely(t0, gs.p, p0) ⊦
Used simplifier rules: ⊦ (gs.p:= p).p = p; (s) ⊦ relyws(t, tsf, tsf); (s) ⊦ (gs.p:= p).writers = gs.writers; (s) ⊦ (gs.p:= p).readers = gs.readers; (s)
| ⟨PSCPERSIST_FO(l; p)⟩ (p = p0), p = gs.p, ctrok(gs.ctr, gs.writers), isPersistFO(n, gs.p(l)), pendingOk(gs.p), writersOk(gs.p, gs.writers), ¬ rely(t0, gs.p, p0) ⊦ |
⟨choose n with isPersistFO(n, p(l)) in p(l) := p(l) -p n ifnone skip⟩ (p = p0), p = gs.p, ctrok(gs.ctr, gs.writers), isPersistFO(n, gs.p(l)), pendingOk(gs.p), writersOk(gs.p, gs.writers), ¬ rely(t0, gs.p, p0) ⊦
Used simplifier rules: decl: PSCPERSIST_FO(l; p){choose n with isPersistFO(n, p(l)) in p(l) := p(l) -p n ifnone skip};
| ⟨choose n with isPersistFO(n, p(l)) in p(l) := p(l) -p n ifnone skip⟩ (p = p0), p = gs.p, ctrok(gs.ctr, gs.writers), isPersistFO(n, gs.p(l)), pendingOk(gs.p), writersOk(gs.p, gs.writers), ¬ rely(t0, gs.p, p0) ⊦ |
⟨p(l) := p(l) -p n⟩ (p = p0), p = gs.p, ctrok(gs.ctr, gs.writers), isPersistFO(n0, gs.p(l)), isPersistFO(n, p(l)), pendingOk(gs.p), writersOk(gs.p, gs.writers), ¬ rely(t0, gs.p, p0) ⊦
⟨skip⟩ (p = p0), p = gs.p, ctrok(gs.ctr, gs.writers), isPersistFO(n, gs.p(l)), pendingOk(gs.p), writersOk(gs.p, gs.writers), ¬ rely(t0, gs.p, p0), ∀ n. ¬ isPersistFO(n, p(l)) ⊦
| ⟨p(l) := p(l) -p n⟩ (p = p0), p = gs.p, ctrok(gs.ctr, gs.writers), isPersistFO(n0, gs.p(l)), isPersistFO(n, p(l)), pendingOk(gs.p), writersOk(gs.p, gs.writers), ¬ rely(t0, gs.p, p0) ⊦ |
Used simplifier rules: ⊦ isPersistFO(n, p(l)) → rely(t, p, p(l := p(l) -p n)); (ss)
| ⟨skip⟩ (p = p0), p = gs.p, ctrok(gs.ctr, gs.writers), isPersistFO(n, gs.p(l)), pendingOk(gs.p), writersOk(gs.p, gs.writers), ¬ rely(t0, gs.p, p0), ∀ n. ¬ isPersistFO(n, p(l)) ⊦ |
Used simplifier rules: ⊦ rely(t, p, p); (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.