| ⊦ pending(t) ∧ allWritesOKInd(pending, persisted, h) → (h |W | t) | false = [] |
(h |W | t) | false ≠ [], allWritesOKInd(pending, persisted, h), pending(t) ⊦
| (h |W | t) | false ≠ [], allWritesOKInd(pending, persisted, h), pending(t) ⊦ |
h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) ≠ [], allWritesOKInd(pending, persisted, h), pending(t) ⊦
Used simplifier rules: restrict-W: ⊦ h |W = h.filter(λ vpe. vpe._1.W?); restrict-thread: ⊦ h | t = h.filter(λ vpe. vpe._1.t = t); restrict-vp: ⊦ h | b = h.filter(λ vpe. vpe._2 ↔ b);
| h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) ≠ [], allWritesOKInd(pending, persisted, h), pending(t) ⊦ |
(vpe + h0).filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) ≠ [], allWritesOKInd(pending, persisted, vpe + h0), pending(t), ∀ t, pending, persisted. ¬(h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) ≠ [] ∧ allWritesOKInd(pending, persisted, h0) ∧ pending(t)) ⊦
Used simplifier rules: List('a) freely generated by [], +;; ⊦ [].filter(p) = []; (s)
| (vpe + h0).filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) ≠ [], allWritesOKInd(pending, persisted, vpe + h0), pending(t), ∀ t, pending, persisted. ¬(h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) ≠ [] ∧ allWritesOKInd(pending, persisted, h0) ∧ pending(t)) ⊦ |
allWritesOKInd(pending, persisted, vpe ' + h0), pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).filter(λ vpe. ¬ vpe._2) = [] ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ∨ ¬ pending0(t0) ⊦ (vpe._1.W? ⊃ vpe ';[]).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) = [] ∧ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) = []
Used simplifier rules: ⊦ a + x = a ' + x; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) ⊦ (x + y).filter(p) = x.filter(p) + y.filter(p); (s) ⊦ (a ' + x).filter(p) = (p(a) ⊃ a ';[]) + x.filter(p); (s)
| allWritesOKInd(pending, persisted, vpe ' + h0), pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).filter(λ vpe. ¬ vpe._2) = [] ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ∨ ¬ pending0(t0) ⊦ (vpe._1.W? ⊃ vpe ';[]).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) = [] ∧ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) = [] |
vpe = (e, boolvar), allWritesOKInd(pending, persisted, vpe ' + h0), pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).filter(λ vpe. ¬ vpe._2) = [] ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ∨ ¬ pending0(t0) ⊦ (e.W? ⊃ vpe ';[]).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) = [] ∧ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) = []
Used terms: e, boolvar
| vpe = (e, boolvar), allWritesOKInd(pending, persisted, vpe ' + h0), pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).filter(λ vpe. ¬ vpe._2) = [] ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ∨ ¬ pending0(t0) ⊦ (e.W? ⊃ vpe ';[]).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) = [] ∧ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) = [] |
allWritesOKInd(pending, persisted, (e, boolvar) ' + h0), pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).filter(λ vpe. ¬ vpe._2) = [] ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ∨ ¬ pending0(t0) ⊦ (e.W? ⊃ (e, boolvar) ';[]).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) = [] ∧ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) = []
| allWritesOKInd(pending, persisted, (e, boolvar) ' + h0), pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).filter(λ vpe. ¬ vpe._2) = [] ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ∨ ¬ pending0(t0) ⊦ (e.W? ⊃ (e, boolvar) ';[]).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) = [] ∧ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) = [] |
(e.W? ⊃ (e, boolvar) ';[]).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) ≠ [], allWritesOKInd(pending, persisted, (e, boolvar) ' + h0), pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).filter(λ vpe. ¬ vpe._2) = [] ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ∨ ¬ pending0(t0) ⊦
h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) ≠ [], allWritesOKInd(pending, persisted, (e, boolvar) ' + h0), pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).filter(λ vpe. ¬ vpe._2) = [] ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ∨ ¬ pending0(t0) ⊦
| (e.W? ⊃ (e, boolvar) ';[]).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) ≠ [], allWritesOKInd(pending, persisted, (e, boolvar) ' + h0), pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).filter(λ vpe. ¬ vpe._2) = [] ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ∨ ¬ pending0(t0) ⊦ |
(e.W? ⊃ (e, boolvar) ';[]).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) ≠ [], e.W?, allWritesOKInd(pending, persisted, (e, boolvar) ' + h0), pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).filter(λ vpe. ¬ vpe._2) = [] ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ∨ ¬ pending0(t0) ⊦
Used simplifier rules: ⊦ [].filter(p) = []; (s) Used formulas: e.W?
| (e.W? ⊃ (e, boolvar) ';[]).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) ≠ [], e.W?, allWritesOKInd(pending, persisted, (e, boolvar) ' + h0), pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).filter(λ vpe. ¬ vpe._2) = [] ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ∨ ¬ pending0(t0) ⊦ |
(e.t = t ⊃ (e, boolvar) ';[]).filter(λ vpe. ¬ vpe._2) ≠ [], e.W?, allWritesOKInd(pending, persisted, (e, boolvar) ' + h0), pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).filter(λ vpe. ¬ vpe._2) = [] ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ∨ ¬ pending0(t0) ⊦
Used simplifier rules: ⊦ a '.filter(p) = (p(a) ⊃ a ';[]); (s)
| (e.t = t ⊃ (e, boolvar) ';[]).filter(λ vpe. ¬ vpe._2) ≠ [], e.W?, allWritesOKInd(pending, persisted, (e, boolvar) ' + h0), pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).filter(λ vpe. ¬ vpe._2) = [] ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ∨ ¬ pending0(t0) ⊦ |
Used simplifier rules: allWritesOKInd-recW: ⊦ allWritesOKInd(pending, persisted, (W(t, l, v), b) ' + h) ↔ ¬ pending(t) ∧ (b → persisted(l)) ∧ allWritesOKInd(pending(t := ¬ b), persisted(l := b), h); a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ [].filter(p) = []; (s) ⊦ e.W? → ((t = e.t ∧ l = e.l) ∧ v = e.v ↔ e = W(t, l, v)); (elim) Used terms: e, t1, l, v
| h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) ≠ [], allWritesOKInd(pending, persisted, (e, boolvar) ' + h0), pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).filter(λ vpe. ¬ vpe._2) = [] ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ∨ ¬ pending0(t0) ⊦ |
e = R(t1, l, v), h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) ≠ [], allWritesOKInd(pending, persisted, (e, boolvar) ' + h0), pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).filter(λ vpe. ¬ vpe._2) = [] ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ∨ ¬ pending0(t0) ⊦
e = W(t1, l, v), h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) ≠ [], allWritesOKInd(pending, persisted, (e, boolvar) ' + h0), pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).filter(λ vpe. ¬ vpe._2) = [] ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ∨ ¬ pending0(t0) ⊦
Used simplifier rules: RWevent freely generated by R, W;;
| e = R(t1, l, v), h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) ≠ [], allWritesOKInd(pending, persisted, (e, boolvar) ' + h0), pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).filter(λ vpe. ¬ vpe._2) = [] ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ∨ ¬ pending0(t0) ⊦ |
h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) ≠ [], allWritesOKInd(pending, persisted, h0), pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).filter(λ vpe. ¬ vpe._2) = [] ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ∨ ¬ pending0(t0) ⊦
Used simplifier rules: allWritesOKInd-recR: ⊦ allWritesOKInd(pending, persisted, (R(t, l, v), b) ' + h) ↔ allWritesOKInd(pending, persisted, h); a: ⊦ (x + y) + z = x + y + z; from specification list
| h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) ≠ [], allWritesOKInd(pending, persisted, h0), pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).filter(λ vpe. ¬ vpe._2) = [] ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ∨ ¬ pending0(t0) ⊦ |
Used terms: t, pending, persisted
| e = W(t1, l, v), h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) ≠ [], allWritesOKInd(pending, persisted, (e, boolvar) ' + h0), pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).filter(λ vpe. ¬ vpe._2) = [] ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ∨ ¬ pending0(t0) ⊦ |
h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) ≠ [], allWritesOKInd(pending(t1 := ¬ boolvar), persisted(l := boolvar), h0), pending(t), ¬ pending(t1), boolvar → persisted(l), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).filter(λ vpe. ¬ vpe._2) = [] ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ∨ ¬ pending0(t0) ⊦
Used simplifier rules: allWritesOKInd-recW: ⊦ allWritesOKInd(pending, persisted, (W(t, l, v), b) ' + h) ↔ ¬ pending(t) ∧ (b → persisted(l)) ∧ allWritesOKInd(pending(t := ¬ b), persisted(l := b), h); a: ⊦ (x + y) + z = x + y + z; from specification list
| h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) ≠ [], allWritesOKInd(pending(t1 := ¬ boolvar), persisted(l := boolvar), h0), pending(t), ¬ pending(t1), boolvar → persisted(l), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).filter(λ vpe. ¬ vpe._2) = [] ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ∨ ¬ pending0(t0) ⊦ |
Used terms: t, pending(t1 := ¬ boolvar), persisted(l := boolvar)
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.