| ⊦ allWritesOKInd(pending, persisted, h) → #((h |W | t) | false) ≤ 1 |
allWritesOKInd(pending, persisted, h), ¬ #((h |W | t) | false) ≤ 1 ⊦
| allWritesOKInd(pending, persisted, h), ¬ #((h |W | t) | false) ≤ 1 ⊦ |
h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 1, allWritesOKInd(pending, persisted, h) ⊦
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); ⊦ 1 < m ↔ ¬(m = 0 ∨ m = 1); (s) ⊦ m ≤ n ↔ ¬ n < m; (ss) ⊦ # x.filter(p) = x.count(p); (s)
| h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 1, allWritesOKInd(pending, persisted, h) ⊦ |
(vpe + h0).filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, (vpe + h0).filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 1, allWritesOKInd(pending, persisted, vpe + h0), ∀ t, pending, persisted. ¬ ( h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0 ∧ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 1 ∧ allWritesOKInd(pending, persisted, h0)) ⊦
Used simplifier rules: List('a) freely generated by [], +;; ⊦ [].filter(p) = []; (s) ⊦ [].count(p) = 0; (s)
| (vpe + h0).filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, (vpe + h0).filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 1, allWritesOKInd(pending, persisted, vpe + h0), ∀ t, pending, persisted. ¬ ( h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0 ∧ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 1 ∧ allWritesOKInd(pending, persisted, h0)) ⊦ |
(vpe._1.W? ⊃ vpe ';[]).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) + h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, allWritesOKInd(pending, persisted, vpe ' + h0), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ (vpe._1.W? ⊃ vpe ';[]).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 0 ∧ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 1, h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 0 ∧ (vpe._1.t = t ⊃ vpe ';[]).count(λ vpe. ¬ vpe._2) = 1
Used simplifier rules: ⊦ a '.filter(p) = (p(a) ⊃ a ';[]); (s) c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ n + 0 = n; (s) ⊦ [].count(p) = 0; (s) ⊦ [].filter(p) = []; (s) ⊦ a + x = a ' + x; (s) ⊦ m + n = 1 ↔ m = 0 ∧ n = 1 ∨ n = 0 ∧ m = 1; (ws) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (x + y).count(p) = x.count(p) + y.count(p); (s) ⊦ (x + y).filter(p) = x.filter(p) + y.filter(p); (s) ⊦ (a ' + x).filter(p) = (p(a) ⊃ a ';[]) + x.filter(p); (s)
| (vpe._1.W? ⊃ vpe ';[]).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) + h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, allWritesOKInd(pending, persisted, vpe ' + h0), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ (vpe._1.W? ⊃ vpe ';[]).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 0 ∧ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 1, h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 0 ∧ (vpe._1.t = t ⊃ vpe ';[]).count(λ vpe. ¬ vpe._2) = 1 |
vpe = (e, boolvar), (e.W? ⊃ vpe ';[]).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) + h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, allWritesOKInd(pending, persisted, vpe ' + h0), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 0 ∧ (e.t = t ⊃ vpe ';[]).count(λ vpe. ¬ vpe._2) = 1, (e.W? ⊃ vpe ';[]).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 0 ∧ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 1
Used terms: e, boolvar
| vpe = (e, boolvar), (e.W? ⊃ vpe ';[]).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) + h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, allWritesOKInd(pending, persisted, vpe ' + h0), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 0 ∧ (e.t = t ⊃ vpe ';[]).count(λ vpe. ¬ vpe._2) = 1, (e.W? ⊃ vpe ';[]).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 0 ∧ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 1 |
(e.W? ⊃ (e, boolvar) ';[]).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) + h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, allWritesOKInd(pending, persisted, (e, boolvar) ' + h0), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ (e.W? ⊃ (e, boolvar) ';[]).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 0 ∧ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 1, h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 0 ∧ (e.t = t ⊃ (e, boolvar) ';[]).count(λ vpe. ¬ vpe._2) = 1
| (e.W? ⊃ (e, boolvar) ';[]).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) + h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, allWritesOKInd(pending, persisted, (e, boolvar) ' + h0), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ (e.W? ⊃ (e, boolvar) ';[]).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 0 ∧ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 1, h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 0 ∧ (e.t = t ⊃ (e, boolvar) ';[]).count(λ vpe. ¬ vpe._2) = 1 |
e = R(t1, l, v), (e.W? ⊃ (e, boolvar) ';[]).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) + h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, allWritesOKInd(pending, persisted, (e, boolvar) ' + h0), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 0 ∧ (e.t = t ⊃ (e, boolvar) ';[]).count(λ vpe. ¬ vpe._2) = 1, (e.W? ⊃ (e, boolvar) ';[]).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 0 ∧ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 1
e = W(t1, l, v), (e.W? ⊃ (e, boolvar) ';[]).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) + h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, allWritesOKInd(pending, persisted, (e, boolvar) ' + h0), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 0 ∧ (e.t = t ⊃ (e, boolvar) ';[]).count(λ vpe. ¬ vpe._2) = 1, (e.W? ⊃ (e, boolvar) ';[]).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 0 ∧ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 1
Used simplifier rules: RWevent freely generated by R, W;;
| e = R(t1, l, v), (e.W? ⊃ (e, boolvar) ';[]).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) + h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, allWritesOKInd(pending, persisted, (e, boolvar) ' + h0), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 0 ∧ (e.t = t ⊃ (e, boolvar) ';[]).count(λ vpe. ¬ vpe._2) = 1, (e.W? ⊃ (e, boolvar) ';[]).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 0 ∧ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 1 |
h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 1, allWritesOKInd(pending, persisted, h0), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦
Used simplifier rules: allWritesOKInd-recR: ⊦ allWritesOKInd(pending, persisted, (R(t, l, v), b) ' + h) ↔ allWritesOKInd(pending, persisted, h); ⊦ [].count(p) = 0; (s) ⊦ [].filter(p) = []; (s) ⊦ ¬ R(t, l, v).W?; (s) a: ⊦ (x + y) + z = x + y + z; from specification list c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ n + 0 = n; (s)
| h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 1, allWritesOKInd(pending, persisted, h0), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ |
Used terms: t, pending, persisted
| e = W(t1, l, v), (e.W? ⊃ (e, boolvar) ';[]).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) + h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, allWritesOKInd(pending, persisted, (e, boolvar) ' + h0), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 0 ∧ (e.t = t ⊃ (e, boolvar) ';[]).count(λ vpe. ¬ vpe._2) = 1, (e.W? ⊃ (e, boolvar) ';[]).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 0 ∧ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 1 |
(t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) + h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, allWritesOKInd(pending(t1 := ¬ boolvar), persisted(l := boolvar), h0), ¬ pending(t1), boolvar → persisted(l), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ (t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) = 0 ∧ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 1, h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 0 ∧ (t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) = 1
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); ⊦ W(t, l, v).t = t; (s) ⊦ a '.filter(p) = (p(a) ⊃ a ';[]); (s) ⊦ W(t, l, v).W?; (s) a: ⊦ (x + y) + z = x + y + z; from specification list
| (t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) + h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, allWritesOKInd(pending(t1 := ¬ boolvar), persisted(l := boolvar), h0), ¬ pending(t1), boolvar → persisted(l), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ (t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) = 0 ∧ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 1, h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 0 ∧ (t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) = 1 |
(t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) + h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, (t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) ≠ 0, allWritesOKInd(pending(t1 := ¬ boolvar), persisted(l := boolvar), h0), ¬ pending(t1), boolvar → persisted(l), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 0 ∧ (t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) = 1
(t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) + h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 1, allWritesOKInd(pending(t1 := ¬ boolvar), persisted(l := boolvar), h0), ¬ pending(t1), boolvar → persisted(l), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 0 ∧ (t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) = 1
| (t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) + h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, (t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) ≠ 0, allWritesOKInd(pending(t1 := ¬ boolvar), persisted(l := boolvar), h0), ¬ pending(t1), boolvar → persisted(l), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 0 ∧ (t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) = 1 |
t1 = t, (t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) + h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, (t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) ≠ 0, allWritesOKInd(pending(t1 := ¬ boolvar), persisted(l := boolvar), h0), ¬ pending(t1), boolvar → persisted(l), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 0 ∧ (t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) = 1
Used simplifier rules: ⊦ n + 0 = n; (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic ⊦ [].count(p) = 0; (s) Used formulas: t1 = t
| t1 = t, (t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) + h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, (t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) ≠ 0, allWritesOKInd(pending(t1 := ¬ boolvar), persisted(l := boolvar), h0), ¬ pending(t1), boolvar → persisted(l), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 0 ∧ (t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) = 1 |
h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, allWritesOKInd(pending(t := true), persisted(l := false), h0), ¬ pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦
Used simplifier rules: ⊦ a '.count(p) = (p(a) ⊃ 1;0); (s) c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ m + 1 ≠ 0; (s)
| h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, allWritesOKInd(pending(t := true), persisted(l := false), h0), ¬ pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ |
⊦ x.count(p) = 0 ↔ x.filter(p) = []
h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) ≠ [], allWritesOKInd(pending(t := true), persisted(l := false), h0), ¬ pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦
Used terms: h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t), λ vpe. ¬ vpe._2
| ⊦ x.count(p) = 0 ↔ x.filter(p) = [] |
| h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) ≠ [], allWritesOKInd(pending(t := true), persisted(l := false), h0), ¬ pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ |
⊦ x = [] ↔ ¬(∃ a. a ∈ x)
allWritesOKInd(pending(t := true), persisted(l := false), h0), ¬ pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0), ∃ a. a ∈ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) ⊦
Used terms: h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2)
| ⊦ x = [] ↔ ¬(∃ a. a ∈ x) |
| allWritesOKInd(pending(t := true), persisted(l := false), h0), ¬ pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0), ∃ a. a ∈ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).filter(λ vpe. ¬ vpe._2) ⊦ |
vpe._1.W?, allWritesOKInd(pending(vpe._1.t := true), persisted(l := false), h0), vpe ∈ h0, ¬ pending(vpe._1.t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ vpe._2
Used simplifier rules: ⊦ a ∈ x.filter(p) ↔ a ∈ x ∧ p(a); (s)
| vpe._1.W?, allWritesOKInd(pending(vpe._1.t := true), persisted(l := false), h0), vpe ∈ h0, ¬ pending(vpe._1.t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ vpe._2 |
¬ boolvar, vpe = (e, boolvar), e.W?, allWritesOKInd(pending(e.t := true), persisted(l := false), h0), vpe ∈ h0, ¬ pending(e.t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦
Used terms: e, boolvar
| ¬ boolvar, vpe = (e, boolvar), e.W?, allWritesOKInd(pending(e.t := true), persisted(l := false), h0), vpe ∈ h0, ¬ pending(e.t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ |
e.W?, allWritesOKInd(pending(e.t := true), persisted(l := false), h0), (e, false) ∈ h0, ¬ pending(e.t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦
| e.W?, allWritesOKInd(pending(e.t := true), persisted(l := false), h0), (e, false) ∈ h0, ¬ pending(e.t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ |
e = W(t, l0, v), e.W?, allWritesOKInd(pending(t := true), persisted(l := false), h0), (e, false) ∈ h0, ¬ pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦
Used simplifier rules: ⊦ e.W? → ((t = e.t ∧ l = e.l) ∧ v = e.v ↔ e = W(t, l, v)); (elim) Used terms: e, t, l0, v
| e = W(t, l0, v), e.W?, allWritesOKInd(pending(t := true), persisted(l := false), h0), (e, false) ∈ h0, ¬ pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ |
allWritesOKInd(pending(t := true), persisted(l := false), h0), (W(t, l0, v), false) ∈ h0, ¬ pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦
Used simplifier rules: ⊦ W(t, l, v).W?; (s)
| allWritesOKInd(pending(t := true), persisted(l := false), h0), (W(t, l0, v), false) ∈ h0, ¬ pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ |
⊦ pending(t) ∧ allWritesOKInd(pending, persisted, h) → ¬ (W(t, l, v), false) ∈ h
Used terms: persisted(l := false), v, pending(t := true), l0, t, h0
| ⊦ pending(t) ∧ allWritesOKInd(pending, persisted, h) → ¬ (W(t, l, v), false) ∈ h |
| (t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) + h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 1, allWritesOKInd(pending(t1 := ¬ boolvar), persisted(l := boolvar), h0), ¬ pending(t1), boolvar → persisted(l), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) = 0 ∧ (t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) = 1 |
(t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) + h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 1, allWritesOKInd(pending(t1 := ¬ boolvar), persisted(l := boolvar), h0), ¬ pending(t1), boolvar → persisted(l), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦
(t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) + h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, (t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) ≠ 1, h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 1, allWritesOKInd(pending(t1 := ¬ boolvar), persisted(l := boolvar), h0), ¬ pending(t1), boolvar → persisted(l), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦
| (t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) + h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 1, allWritesOKInd(pending(t1 := ¬ boolvar), persisted(l := boolvar), h0), ¬ pending(t1), boolvar → persisted(l), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ |
Used terms: t, pending(t1 := ¬ boolvar), persisted(l := boolvar)
| (t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) + h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, (t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) ≠ 1, h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 1, allWritesOKInd(pending(t1 := ¬ boolvar), persisted(l := boolvar), h0), ¬ pending(t1), boolvar → persisted(l), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ |
t1 = t, (W(t, l, v), boolvar) '.count(λ vpe. ¬ vpe._2) + h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, (t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) ≠ 1, h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 1, allWritesOKInd(pending(t1 := ¬ boolvar), persisted(l := boolvar), h0), ¬ pending(t1), boolvar → persisted(l), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦
[].count(λ vpe. ¬ vpe._2) + h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, (t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) ≠ 1, h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 1, t1 ≠ t, allWritesOKInd(pending(t1 := ¬ boolvar), persisted(l := boolvar), h0), ¬ pending(t1), boolvar → persisted(l), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦
| t1 = t, (W(t, l, v), boolvar) '.count(λ vpe. ¬ vpe._2) + h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, (t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) ≠ 1, h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 1, allWritesOKInd(pending(t1 := ¬ boolvar), persisted(l := boolvar), h0), ¬ pending(t1), boolvar → persisted(l), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ |
h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 1, h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, allWritesOKInd(pending(t := false), persisted(l := true), h0), persisted(l), ¬ pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦
Used simplifier rules: c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ n + 0 = n; (s) ⊦ a '.count(p) = (p(a) ⊃ 1;0); (s)
| h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 1, h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, allWritesOKInd(pending(t := false), persisted(l := true), h0), persisted(l), ¬ pending(t), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ |
Used terms: t, pending(t := false), persisted(l := true)
| [].count(λ vpe. ¬ vpe._2) + h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, (t1 = t ⊃ (W(t, l, v), boolvar) ';[]).count(λ vpe. ¬ vpe._2) ≠ 1, h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 1, t1 ≠ t, allWritesOKInd(pending(t1 := ¬ boolvar), persisted(l := boolvar), h0), ¬ pending(t1), boolvar → persisted(l), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ |
h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 1, h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, t1 ≠ t, allWritesOKInd(pending(t1 := ¬ boolvar), persisted(l := boolvar), h0), ¬ pending(t1), boolvar → persisted(l), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦
Used simplifier rules: ⊦ [].count(p) = 0; (s) c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ n + 0 = n; (s)
| h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 1, h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t).count(λ vpe. ¬ vpe._2) ≠ 0, t1 ≠ t, allWritesOKInd(pending(t1 := ¬ boolvar), persisted(l := boolvar), h0), ¬ pending(t1), boolvar → persisted(l), ∀ t0, pending0, persisted0. h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 0 ∨ h0.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.t = t0).count(λ vpe. ¬ vpe._2) = 1 ∨ ¬ allWritesOKInd(pending0, persisted0, h0) ⊦ |
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.