| ⊦ (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⟫ (ctrok(gs.ctr, gs.writers) ∧ writersOk(gs.p, gs.writers) ∧ pendingOk(gs.p)) |
ctrok(gs.ctr, gs.writers), pendingOk(gs.p), writersOk(gs.p, gs.writers), ∃ n. isPersistFO(n, gs.p(l)) ⊦ ⟪p := gs.p; PSCPERSIST_FO(l; p); gs.p := p⟫ (ctrok(gs.ctr, gs.writers) ∧ writersOk(gs.p, gs.writers) ∧ pendingOk(gs.p))
| ctrok(gs.ctr, gs.writers), pendingOk(gs.p), writersOk(gs.p, gs.writers), ∃ n. isPersistFO(n, gs.p(l)) ⊦ ⟪p := gs.p; PSCPERSIST_FO(l; p); gs.p := p⟫ (ctrok(gs.ctr, gs.writers) ∧ writersOk(gs.p, gs.writers) ∧ pendingOk(gs.p)) |
ctrok(gs.ctr, gs.writers), isPersistFO(n, gs.p(l)), pendingOk(gs.p), writersOk(gs.p, gs.writers) ⊦ ⟪p := gs.p; PSCPERSIST_FO(l; p); gs.p := p⟫ (ctrok(gs.ctr, gs.writers) ∧ writersOk(gs.p, gs.writers) ∧ pendingOk(gs.p))
| ctrok(gs.ctr, gs.writers), isPersistFO(n, gs.p(l)), pendingOk(gs.p), writersOk(gs.p, gs.writers) ⊦ ⟪p := gs.p; PSCPERSIST_FO(l; p); gs.p := p⟫ (ctrok(gs.ctr, gs.writers) ∧ writersOk(gs.p, gs.writers) ∧ pendingOk(gs.p)) |
p = gs.p, ctrok(gs.ctr, gs.writers), isPersistFO(n, gs.p(l)), pendingOk(gs.p), writersOk(gs.p, gs.writers) ⊦ ⟪PSCPERSIST_FO(l; p); gs.p := p⟫ (ctrok(gs.ctr, gs.writers) ∧ writersOk(gs.p, gs.writers) ∧ pendingOk(gs.p))
| p = gs.p, ctrok(gs.ctr, gs.writers), isPersistFO(n, gs.p(l)), pendingOk(gs.p), writersOk(gs.p, gs.writers) ⊦ ⟪PSCPERSIST_FO(l; p); gs.p := p⟫ (ctrok(gs.ctr, gs.writers) ∧ writersOk(gs.p, gs.writers) ∧ pendingOk(gs.p)) |
p = gs.p, ctrok(gs.ctr, gs.writers), isPersistFO(n, gs.p(l)), pendingOk(gs.p), writersOk(gs.p, gs.writers) ⊦ ⟪choose n with isPersistFO(n, p(l)) in p(l) := p(l) -p n ifnone skip; gs.p := p⟫ (ctrok(gs.ctr, gs.writers) ∧ writersOk(gs.p, gs.writers) ∧ pendingOk(gs.p))
Used simplifier rules: decl: PSCPERSIST_FO(l; p){choose n with isPersistFO(n, p(l)) in p(l) := p(l) -p n ifnone skip};
| p = gs.p, ctrok(gs.ctr, gs.writers), isPersistFO(n, gs.p(l)), pendingOk(gs.p), writersOk(gs.p, gs.writers) ⊦ ⟪choose n with isPersistFO(n, p(l)) in p(l) := p(l) -p n ifnone skip; gs.p := p⟫ (ctrok(gs.ctr, gs.writers) ∧ writersOk(gs.p, gs.writers) ∧ pendingOk(gs.p)) |
p = gs.p, ctrok(gs.ctr, gs.writers), isPersistFO(n, p(l)), isPersistFO(n0, gs.p(l)), pendingOk(gs.p), writersOk(gs.p, gs.writers) ⊦ ⟪p(l) := p(l) -p n; gs.p := p⟫ (ctrok(gs.ctr, gs.writers) ∧ writersOk(gs.p, gs.writers) ∧ pendingOk(gs.p))
p = gs.p, ctrok(gs.ctr, gs.writers), isPersistFO(n, gs.p(l)), pendingOk(gs.p), writersOk(gs.p, gs.writers), ∀ n. ¬ isPersistFO(n, p(l)) ⊦ ⟪skip; gs.p := p⟫ (ctrok(gs.ctr, gs.writers) ∧ writersOk(gs.p, gs.writers) ∧ pendingOk(gs.p))
| p = gs.p, ctrok(gs.ctr, gs.writers), isPersistFO(n, p(l)), isPersistFO(n0, gs.p(l)), pendingOk(gs.p), writersOk(gs.p, gs.writers) ⊦ ⟪p(l) := p(l) -p n; gs.p := p⟫ (ctrok(gs.ctr, gs.writers) ∧ writersOk(gs.p, gs.writers) ∧ pendingOk(gs.p)) |
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) ⊦ ⟪gs.p := p(l := p(l) -p n)⟫ (ctrok(gs.ctr, gs.writers) ∧ writersOk(gs.p, gs.writers) ∧ pendingOk(gs.p))
| 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) ⊦ ⟪gs.p := p(l := p(l) -p n)⟫ (ctrok(gs.ctr, gs.writers) ∧ writersOk(gs.p, gs.writers) ∧ pendingOk(gs.p)) |
Used simplifier rules: ⊦ (gs.p:= p).ctr = gs.ctr; (s) ⊦ (gs.p:= p).writers = gs.writers; (s) ⊦ writersOk(p, writers) → writersOk(p(l := p(l) -p n), writers); (ss) ⊦ (gs.p:= p).p = p; (s) ⊦ pendingOk(p) → pendingOk(p(l := p(l) -p n)); (ss)
| p = gs.p, ctrok(gs.ctr, gs.writers), isPersistFO(n, gs.p(l)), pendingOk(gs.p), writersOk(gs.p, gs.writers), ∀ n. ¬ isPersistFO(n, p(l)) ⊦ ⟪skip; gs.p := p⟫ (ctrok(gs.ctr, gs.writers) ∧ writersOk(gs.p, gs.writers) ∧ pendingOk(gs.p)) |
p = gs.p, ctrok(gs.ctr, gs.writers), isPersistFO(n, gs.p(l)), pendingOk(gs.p), writersOk(gs.p, gs.writers), ∀ n. ¬ isPersistFO(n, p(l)) ⊦ ⟪gs.p := p⟫ (ctrok(gs.ctr, gs.writers) ∧ writersOk(gs.p, gs.writers) ∧ pendingOk(gs.p))
| p = gs.p, ctrok(gs.ctr, gs.writers), isPersistFO(n, gs.p(l)), pendingOk(gs.p), writersOk(gs.p, gs.writers), ∀ n. ¬ isPersistFO(n, p(l)) ⊦ ⟪gs.p := p⟫ (ctrok(gs.ctr, gs.writers) ∧ writersOk(gs.p, gs.writers) ∧ pendingOk(gs.p)) |
Used simplifier rules: ⊦ (gs.p:= p).ctr = gs.ctr; (s) ⊦ (gs.p:= p).writers = gs.writers; (s) ⊦ (gs.p:= p).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.