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