| ⊦ ( (ctrok(gs.ctr, gs.writers) ∧ writersOk(gs.p, gs.writers) ∧ pendingOk(gs.p)) ∧ notMember(ls.t, gs.readers) ∧ notMember(ls.t, gs.writers) ∧ noPendingW(ls.t, gs.p)) ∧ pre(gs, ls, W1, a) ∧ pcstepf(gs, ls, W1, a) = W2 → ( ctrok(gstepf(gs, ls, W1, a).ctr, gstepf(gs, ls, W1, a).writers) ∧ writersOk(gstepf(gs, ls, W1, a).p, gstepf(gs, ls, W1, a).writers) ∧ pendingOk(gstepf(gs, ls, W1, a).p)) ∧ notMember(lstepf(gs, ls, W1, a).t, gstepf(gs, ls, W1, a).readers) ∧ notMember(lstepf(gs, ls, W1, a).t, gstepf(gs, ls, W1, a).writers) ∧ noPendingW(lstepf(gs, ls, W1, a).t, gstepf(gs, ls, W1, a).p) ∧ noPending(lstepf(gs, ls, W1, a).t, gstepf(gs, ls, W1, a).p) |
pcstepf(gs, ls, W1, a) = W2, ctrok(gs.ctr, gs.writers), noPendingW(ls.t, gs.p), notMember(ls.t, gs.readers), notMember(ls.t, gs.writers), pendingOk(gs.p), pre(gs, ls, W1, a), writersOk(gs.p, gs.writers) ⊦ ( ctrok(gstepf(gs, ls, W1, a).ctr, gstepf(gs, ls, W1, a).writers) ∧ writersOk(gstepf(gs, ls, W1, a).p, gstepf(gs, ls, W1, a).writers) ∧ pendingOk(gstepf(gs, ls, W1, a).p)) ∧ notMember(lstepf(gs, ls, W1, a).t, gstepf(gs, ls, W1, a).readers) ∧ notMember(lstepf(gs, ls, W1, a).t, gstepf(gs, ls, W1, a).writers) ∧ noPendingW(lstepf(gs, ls, W1, a).t, gstepf(gs, ls, W1, a).p) ∧ noPending(lstepf(gs, ls, W1, a).t, gstepf(gs, ls, W1, a).p)
| pcstepf(gs, ls, W1, a) = W2, ctrok(gs.ctr, gs.writers), noPendingW(ls.t, gs.p), notMember(ls.t, gs.readers), notMember(ls.t, gs.writers), pendingOk(gs.p), pre(gs, ls, W1, a), writersOk(gs.p, gs.writers) ⊦ ( ctrok(gstepf(gs, ls, W1, a).ctr, gstepf(gs, ls, W1, a).writers) ∧ writersOk(gstepf(gs, ls, W1, a).p, gstepf(gs, ls, W1, a).writers) ∧ pendingOk(gstepf(gs, ls, W1, a).p)) ∧ notMember(lstepf(gs, ls, W1, a).t, gstepf(gs, ls, W1, a).readers) ∧ notMember(lstepf(gs, ls, W1, a).t, gstepf(gs, ls, W1, a).writers) ∧ noPendingW(lstepf(gs, ls, W1, a).t, gstepf(gs, ls, W1, a).p) ∧ noPending(lstepf(gs, ls, W1, a).t, gstepf(gs, ls, W1, a).p) |
ctrok(gs.ctr, gs.writers), noPendingW(ls.t, gs.p), notMember(ls.t, gs.readers), notMember(ls.t, gs.writers), pendingOk(gs.p), writersOk(gs.p, gs.writers), ¬ noPending(ls.t, gs.p), ∀ l. ¬ FO(ls.t) ∈ gs.p(l) ⊦
Used simplifier rules: ⊦ gstepf(gs, ls, W1, a) = gs; (s) ⊦ lstepf(gs, ls, W1, a) = ls; (s) ⊦ pre(gs, ls, W1, a) ↔ (∀ l. ¬ FO(ls.t) ∈ gs.p(l)) ∧ a = sfencePSC(ls.t); (s) ⊦ pcstepf(gs, ls, W1, a) = W2; (s)
| ctrok(gs.ctr, gs.writers), noPendingW(ls.t, gs.p), notMember(ls.t, gs.readers), notMember(ls.t, gs.writers), pendingOk(gs.p), writersOk(gs.p, gs.writers), ¬ noPending(ls.t, gs.p), ∀ l. ¬ FO(ls.t) ∈ gs.p(l) ⊦ |
⊦ noPending(t, p) ↔ (∀ l. p(l) | t = [])
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), ∀ l. ¬ FO(ls.t) ∈ gs.p(l), ∃ l. gs.p(l) | ls.t ≠ [] ⊦
Used terms: ls.t, gs.p
| ⊦ noPending(t, p) ↔ (∀ l. p(l) | t = []) |
| 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), ∀ l. ¬ FO(ls.t) ∈ gs.p(l), ∃ l. gs.p(l) | ls.t ≠ [] ⊦ |
gs.p(l) | ls.t ≠ [], ctrok(gs.ctr, gs.writers), noPendingW(ls.t, gs.p), notMember(ls.t, gs.readers), notMember(ls.t, gs.writers), pendingOk(gs.p), writersOk(gs.p, gs.writers), ∀ l. ¬ FO(ls.t) ∈ gs.p(l) ⊦
| gs.p(l) | ls.t ≠ [], ctrok(gs.ctr, gs.writers), noPendingW(ls.t, gs.p), notMember(ls.t, gs.readers), notMember(ls.t, gs.writers), pendingOk(gs.p), writersOk(gs.p, gs.writers), ∀ l. ¬ FO(ls.t) ∈ gs.p(l) ⊦ |
⊦ x = [] ↔ ¬(∃ a. a ∈ x)
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), ∀ l. ¬ FO(ls.t) ∈ gs.p(l), ∃ fow. fow ∈ gs.p(l) | ls.t ⊦
Used terms: gs.p(l) | ls.t
| ⊦ x = [] ↔ ¬(∃ a. a ∈ x) |
| 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), ∀ l. ¬ FO(ls.t) ∈ gs.p(l), ∃ fow. fow ∈ gs.p(l) | ls.t ⊦ |
fow.tid = ls.t, ctrok(gs.ctr, gs.writers), noPendingW(ls.t, gs.p), notMember(ls.t, gs.readers), notMember(ls.t, gs.writers), pendingOk(gs.p), writersOk(gs.p, gs.writers), fow ∈ gs.p(l), ∀ l. ¬ FO(ls.t) ∈ gs.p(l) ⊦
Used simplifier rules: ⊦ fow ∈ fowl | t ↔ fow ∈ fowl ∧ fow.tid = t; (s)
| fow.tid = ls.t, ctrok(gs.ctr, gs.writers), noPendingW(ls.t, gs.p), notMember(ls.t, gs.readers), notMember(ls.t, gs.writers), pendingOk(gs.p), writersOk(gs.p, gs.writers), fow ∈ gs.p(l), ∀ l. ¬ FO(ls.t) ∈ gs.p(l) ⊦ |
fow.tid = ls.t, fow = FO(t), 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), fow ∈ gs.p(l), ∀ l. ¬ FO(ls.t) ∈ gs.p(l) ⊦
fow.tid = ls.t, fow = W(v, t), 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), fow ∈ gs.p(l), ∀ l. ¬ FO(ls.t) ∈ gs.p(l) ⊦
Used simplifier rules: FOW freely generated by FO, W;;
| fow.tid = ls.t, fow = FO(t), 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), fow ∈ gs.p(l), ∀ l. ¬ FO(ls.t) ∈ gs.p(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), FO(ls.t) ∈ gs.p(l), ∀ l. ¬ FO(ls.t) ∈ gs.p(l) ⊦
Used simplifier rules: ⊦ FO(tid).tid = tid; (s)
| 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), FO(ls.t) ∈ gs.p(l), ∀ l. ¬ FO(ls.t) ∈ gs.p(l) ⊦ |
gs = mkFLITPSCgs(mem, p, ctr, writers, readers), ctrok(ctr, writers), noPendingW(ls.t, p), notMember(ls.t, readers), notMember(ls.t, writers), pendingOk(p), writersOk(p, writers), FO(ls.t) ∈ p(l), ∀ l. ¬ FO(ls.t) ∈ p(l) ⊦
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, readers, p
| gs = mkFLITPSCgs(mem, p, ctr, writers, readers), ctrok(ctr, writers), noPendingW(ls.t, p), notMember(ls.t, readers), notMember(ls.t, writers), pendingOk(p), writersOk(p, writers), FO(ls.t) ∈ p(l), ∀ l. ¬ FO(ls.t) ∈ p(l) ⊦ |
ctrok(ctr, writers), noPendingW(ls.t, p), notMember(ls.t, writers), notMember(ls.t, readers), pendingOk(p), writersOk(p, writers), FO(ls.t) ∈ p(l), ∀ l. ¬ FO(ls.t) ∈ p(l) ⊦
| ctrok(ctr, writers), noPendingW(ls.t, p), notMember(ls.t, writers), notMember(ls.t, readers), pendingOk(p), writersOk(p, writers), FO(ls.t) ∈ p(l), ∀ l. ¬ FO(ls.t) ∈ p(l) ⊦ |
ls = mkFLITPSCls(t, l0, v), ctrok(ctr, writers), noPendingW(t, p), notMember(t, readers), notMember(t, writers), pendingOk(p), writersOk(p, writers), FO(t) ∈ p(l), ∀ l. ¬ FO(t) ∈ p(l) ⊦
Used simplifier rules: ⊦ (t = ls.t ∧ l = ls.l) ∧ v = ls.v ↔ ls = mkFLITPSCls(t, l, v); (elim) Used terms: ls, t, l0, v
| ls = mkFLITPSCls(t, l0, v), ctrok(ctr, writers), noPendingW(t, p), notMember(t, readers), notMember(t, writers), pendingOk(p), writersOk(p, writers), FO(t) ∈ p(l), ∀ l. ¬ FO(t) ∈ p(l) ⊦ |
ctrok(ctr, writers), noPendingW(t, p), notMember(t, writers), notMember(t, readers), pendingOk(p), writersOk(p, writers), FO(t) ∈ p(l), ∀ l. ¬ FO(t) ∈ p(l) ⊦
| ctrok(ctr, writers), noPendingW(t, p), notMember(t, writers), notMember(t, readers), pendingOk(p), writersOk(p, writers), FO(t) ∈ p(l), ∀ l. ¬ FO(t) ∈ p(l) ⊦ |
Used terms: l
| fow.tid = ls.t, fow = W(v, t), 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), fow ∈ gs.p(l), ∀ l. ¬ FO(ls.t) ∈ gs.p(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), W(v, ls.t) ∈ gs.p(l), ∀ l. ¬ FO(ls.t) ∈ gs.p(l) ⊦
Used simplifier rules: ⊦ W(v, tid).tid = tid; (s)
| 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), W(v, ls.t) ∈ gs.p(l), ∀ l. ¬ FO(ls.t) ∈ gs.p(l) ⊦ |
gs = mkFLITPSCgs(mem, p, ctr, writers, readers), ctrok(ctr, writers), noPendingW(ls.t, p), notMember(ls.t, readers), notMember(ls.t, writers), pendingOk(p), writersOk(p, writers), W(v, ls.t) ∈ p(l), ∀ l. ¬ FO(ls.t) ∈ p(l) ⊦
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, readers, p
| gs = mkFLITPSCgs(mem, p, ctr, writers, readers), ctrok(ctr, writers), noPendingW(ls.t, p), notMember(ls.t, readers), notMember(ls.t, writers), pendingOk(p), writersOk(p, writers), W(v, ls.t) ∈ p(l), ∀ l. ¬ FO(ls.t) ∈ p(l) ⊦ |
ctrok(ctr, writers), noPendingW(ls.t, p), notMember(ls.t, writers), notMember(ls.t, readers), pendingOk(p), writersOk(p, writers), W(v, ls.t) ∈ p(l), ∀ l. ¬ FO(ls.t) ∈ p(l) ⊦
| ctrok(ctr, writers), noPendingW(ls.t, p), notMember(ls.t, writers), notMember(ls.t, readers), pendingOk(p), writersOk(p, writers), W(v, ls.t) ∈ p(l), ∀ l. ¬ FO(ls.t) ∈ p(l) ⊦ |
ls = mkFLITPSCls(t, l0, v0), ctrok(ctr, writers), noPendingW(t, p), notMember(t, readers), notMember(t, writers), pendingOk(p), writersOk(p, writers), W(v, t) ∈ p(l), ∀ l. ¬ FO(t) ∈ p(l) ⊦
Used simplifier rules: ⊦ (t = ls.t ∧ l = ls.l) ∧ v = ls.v ↔ ls = mkFLITPSCls(t, l, v); (elim) Used terms: ls, t, l0, v0
| ls = mkFLITPSCls(t, l0, v0), ctrok(ctr, writers), noPendingW(t, p), notMember(t, readers), notMember(t, writers), pendingOk(p), writersOk(p, writers), W(v, t) ∈ p(l), ∀ l. ¬ FO(t) ∈ p(l) ⊦ |
ctrok(ctr, writers), noPendingW(t, p), notMember(t, writers), notMember(t, readers), pendingOk(p), writersOk(p, writers), W(v, t) ∈ p(l), ∀ l. ¬ FO(t) ∈ p(l) ⊦
| ctrok(ctr, writers), noPendingW(t, p), notMember(t, writers), notMember(t, readers), pendingOk(p), writersOk(p, writers), W(v, t) ∈ p(l), ∀ l. ¬ FO(t) ∈ p(l) ⊦ |
⊦ noPendingW(t, p) ↔ (∀ l. p(l) |W | t = [])
ctrok(ctr, writers), notMember(t, readers), notMember(t, writers), pendingOk(p), writersOk(p, writers), W(v, t) ∈ p(l), ∀ l. ¬ FO(t) ∈ p(l), ∀ l. p(l) |W | t = [] ⊦
Used terms: t, p
| ⊦ noPendingW(t, p) ↔ (∀ l. p(l) |W | t = []) |
| ctrok(ctr, writers), notMember(t, readers), notMember(t, writers), pendingOk(p), writersOk(p, writers), W(v, t) ∈ p(l), ∀ l. ¬ FO(t) ∈ p(l), ∀ l. p(l) |W | t = [] ⊦ |
p(l) |W | t = [], ctrok(ctr, writers), notMember(t, writers), notMember(t, readers), pendingOk(p), writersOk(p, writers), W(v, t) ∈ p(l), ∀ l. ¬ FO(t) ∈ p(l) ⊦
Used terms: l
| p(l) |W | t = [], ctrok(ctr, writers), notMember(t, writers), notMember(t, readers), pendingOk(p), writersOk(p, writers), W(v, t) ∈ p(l), ∀ l. ¬ FO(t) ∈ p(l) ⊦ |
⊦ fowl | t = fowl.filter(λ fow. fow.tid = t)
p(l) |W.filter(λ fow. fow.tid = t) = [], ctrok(ctr, writers), notMember(t, readers), notMember(t, writers), pendingOk(p), writersOk(p, writers), W(v, t) ∈ p(l), ∀ l. ¬ FO(t) ∈ p(l) ⊦
Used terms: p(l) |W, t
| ⊦ fowl | t = fowl.filter(λ fow. fow.tid = t) |
| p(l) |W.filter(λ fow. fow.tid = t) = [], ctrok(ctr, writers), notMember(t, readers), notMember(t, writers), pendingOk(p), writersOk(p, writers), W(v, t) ∈ p(l), ∀ l. ¬ FO(t) ∈ p(l) ⊦ |
⊦ fowl |W = fowl.filter(λ fow. fow.W?)
p(l).filter(λ fow. fow.W?).filter(λ fow. fow.tid = t) = [], ctrok(ctr, writers), notMember(t, writers), notMember(t, readers), pendingOk(p), writersOk(p, writers), W(v, t) ∈ p(l), ∀ l. ¬ FO(t) ∈ p(l) ⊦
Used terms: p(l)
| ⊦ fowl |W = fowl.filter(λ fow. fow.W?) |
| p(l).filter(λ fow. fow.W?).filter(λ fow. fow.tid = t) = [], ctrok(ctr, writers), notMember(t, writers), notMember(t, readers), pendingOk(p), writersOk(p, writers), W(v, t) ∈ p(l), ∀ l. ¬ FO(t) ∈ p(l) ⊦ |
p(l).filter(.W?).filter(λ fow. fow.tid = t) = [], ctrok(ctr, writers), notMember(t, readers), notMember(t, writers), pendingOk(p), writersOk(p, writers), W(v, t) ∈ p(l), ∀ l. ¬ FO(t) ∈ p(l) ⊦
| p(l).filter(.W?).filter(λ fow. fow.tid = t) = [], ctrok(ctr, writers), notMember(t, readers), notMember(t, writers), pendingOk(p), writersOk(p, writers), W(v, t) ∈ p(l), ∀ l. ¬ FO(t) ∈ p(l) ⊦ |
⊦ x = [] ↔ ¬(∃ a. a ∈ x)
ctrok(ctr, writers), notMember(t, writers), notMember(t, readers), pendingOk(p), writersOk(p, writers), W(v, t) ∈ p(l), ∀ l. ¬ FO(t) ∈ p(l), ∀ fow. ¬ fow ∈ p(l).filter(.W?).filter(λ fow. fow.tid = t) ⊦
Used terms: p(l).filter(.W?).filter(λ fow. fow.tid = t)
| ⊦ x = [] ↔ ¬(∃ a. a ∈ x) |
| ctrok(ctr, writers), notMember(t, writers), notMember(t, readers), pendingOk(p), writersOk(p, writers), W(v, t) ∈ p(l), ∀ l. ¬ FO(t) ∈ p(l), ∀ fow. ¬ fow ∈ p(l).filter(.W?).filter(λ fow. fow.tid = t) ⊦ |
ctrok(ctr, writers), notMember(t, readers), notMember(t, writers), pendingOk(p), writersOk(p, writers), W(v, t) ∈ p(l), ∀ l. ¬ FO(t) ∈ p(l), ∀ fow. ¬ fow ∈ p(l) ∨ ¬ fow.W? ∨ fow.tid ≠ t ⊦
Used simplifier rules: ⊦ a ∈ x.filter(p) ↔ a ∈ x ∧ p(a); (s)
| ctrok(ctr, writers), notMember(t, readers), notMember(t, writers), pendingOk(p), writersOk(p, writers), W(v, t) ∈ p(l), ∀ l. ¬ FO(t) ∈ p(l), ∀ fow. ¬ fow ∈ p(l) ∨ ¬ fow.W? ∨ fow.tid ≠ t ⊦ |
Used simplifier rules: ⊦ W(v, tid).W?; (s) ⊦ W(v, tid).tid = tid; (s) Used terms: W(v, t)
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.