| ⊦ allWritesOKInd(pending, persisted, h1 + (W(t, l, v), false) ' + h2) → (allWritesOKInd(pending, persisted, h1 + (W(t, l, v), true) ' + h2) ↔ persisted(l) ∧ (h1 |W | l) | false = []) |
¬(allWritesOKInd(pending, persisted, h1 + (W(t, l, v), true) ' + h2) ↔ persisted(l) ∧ (h1 |W | l) | false = []), allWritesOKInd(pending, persisted, h1 + (W(t, l, v), false) ' + h2) ⊦
| ¬(allWritesOKInd(pending, persisted, h1 + (W(t, l, v), true) ' + h2) ↔ persisted(l) ∧ (h1 |W | l) | false = []), allWritesOKInd(pending, persisted, h1 + (W(t, l, v), false) ' + h2) ⊦ |
¬(allWritesOKInd(pending, persisted, (vpe + h) + (W(t, l, v), true) ' + h2) ↔ persisted(l) ∧ ((vpe + h)|W | l) | false = []), allWritesOKInd(pending, persisted, (vpe + h) + (W(t, l, v), false) ' + h2), ∀ pending, persisted, t, l, v, h2. ¬ ( ¬(allWritesOKInd(pending, persisted, h + (W(t, l, v), true) ' + h2) ↔ persisted(l) ∧ (h |W | l) | false = []) ∧ allWritesOKInd(pending, persisted, h + (W(t, l, v), false) ' + h2)) ⊦
Used simplifier rules: restrict-W-empty: ⊦ [] |W = []; restrict-l-empty: ⊦ [] | l = []; restrict-b-empty: ⊦ [] | b = []; allWritesOKInd-recW: ⊦ allWritesOKInd(pending, persisted, (W(t, l, v), b) ' + h) ↔ ¬ pending(t) ∧ (b → persisted(l)) ∧ allWritesOKInd(pending(t := ¬ b), persisted(l := b), h); allwritesOK-ind-swap-flags-persist-one-write: ⊦ allWritesOKInd(pending(t := true), persisted(l := false), h) → allWritesOKInd(pending(t := false), persisted(l := true), h); List('a) freely generated by [], +;; ⊦ [] + x = x; (s) a: ⊦ (x + y) + z = x + y + z; from specification list
| ¬(allWritesOKInd(pending, persisted, (vpe + h) + (W(t, l, v), true) ' + h2) ↔ persisted(l) ∧ ((vpe + h)|W | l) | false = []), allWritesOKInd(pending, persisted, (vpe + h) + (W(t, l, v), false) ' + h2), ∀ pending, persisted, t, l, v, h2. ¬ ( ¬(allWritesOKInd(pending, persisted, h + (W(t, l, v), true) ' + h2) ↔ persisted(l) ∧ (h |W | l) | false = []) ∧ allWritesOKInd(pending, persisted, h + (W(t, l, v), false) ' + h2)) ⊦ |
¬ ( allWritesOKInd(pending, persisted, (vpe ' + h) + (W(t, l, v), true) ' + h2) ↔ persisted(l) ∧ (vpe._1.W? ⊃ vpe ';[]).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = [] ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = []), allWritesOKInd(pending, persisted, (vpe ' + h) + (W(t, l, v), false) ' + h2), ∀ pending0, persisted0, t0, l0, v0, h0. ( allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), true) ' + h0) ↔ persisted0(l0) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l0).filter(λ vpe0. ¬ vpe0._2) = []) ∨ ¬ allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), false) ' + h0) ⊦
Used simplifier rules: restrict-W-append: ⊦ (h + h0)|W = h |W + h0 |W; restrict-write-one: ⊦ vpe ' |W = (vpe._1.W? ⊃ vpe ';[]); restrict-l-append: ⊦ h + h0 | l0 = (h | l0) + (h0 | l0); restrict-b-append: ⊦ h + h0 | b = (h | b) + (h0 | b); 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); a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a + x = a ' + x; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s)
| ¬ ( allWritesOKInd(pending, persisted, (vpe ' + h) + (W(t, l, v), true) ' + h2) ↔ persisted(l) ∧ (vpe._1.W? ⊃ vpe ';[]).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = [] ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = []), allWritesOKInd(pending, persisted, (vpe ' + h) + (W(t, l, v), false) ' + h2), ∀ pending0, persisted0, t0, l0, v0, h0. ( allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), true) ' + h0) ↔ persisted0(l0) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l0).filter(λ vpe0. ¬ vpe0._2) = []) ∨ ¬ allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), false) ' + h0) ⊦ |
vpe = (e, b), ¬ ( allWritesOKInd(pending, persisted, (vpe ' + h) + (W(t, l, v), true) ' + h2) ↔ persisted(l) ∧ (vpe._1.W? ⊃ vpe ';[]).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = [] ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = []), allWritesOKInd(pending, persisted, (vpe ' + h) + (W(t, l, v), false) ' + h2), ∀ pending0, persisted0, t0, l0, v0, h0. ( allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), true) ' + h0) ↔ persisted0(l0) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l0).filter(λ vpe0. ¬ vpe0._2) = []) ∨ ¬ allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), false) ' + h0) ⊦
| vpe = (e, b), ¬ ( allWritesOKInd(pending, persisted, (vpe ' + h) + (W(t, l, v), true) ' + h2) ↔ persisted(l) ∧ (vpe._1.W? ⊃ vpe ';[]).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = [] ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = []), allWritesOKInd(pending, persisted, (vpe ' + h) + (W(t, l, v), false) ' + h2), ∀ pending0, persisted0, t0, l0, v0, h0. ( allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), true) ' + h0) ↔ persisted0(l0) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l0).filter(λ vpe0. ¬ vpe0._2) = []) ∨ ¬ allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), false) ' + h0) ⊦ |
¬ ( allWritesOKInd(pending, persisted, ((e, b) ' + h) + (W(t, l, v), true) ' + h2) ↔ persisted(l) ∧ (e.W? ⊃ (e, b) ';[]).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = [] ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = []), allWritesOKInd(pending, persisted, ((e, b) ' + h) + (W(t, l, v), false) ' + h2), ∀ pending0, persisted0, t0, l0, v0, h0. ( allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), true) ' + h0) ↔ persisted0(l0) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l0).filter(λ vpe0. ¬ vpe0._2) = []) ∨ ¬ allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), false) ' + h0) ⊦
| ¬ ( allWritesOKInd(pending, persisted, ((e, b) ' + h) + (W(t, l, v), true) ' + h2) ↔ persisted(l) ∧ (e.W? ⊃ (e, b) ';[]).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = [] ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = []), allWritesOKInd(pending, persisted, ((e, b) ' + h) + (W(t, l, v), false) ' + h2), ∀ pending0, persisted0, t0, l0, v0, h0. ( allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), true) ' + h0) ↔ persisted0(l0) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l0).filter(λ vpe0. ¬ vpe0._2) = []) ∨ ¬ allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), false) ' + h0) ⊦ |
e = R(t1, l1, v1), ¬ ( allWritesOKInd(pending, persisted, ((e, b) ' + h) + (W(t, l, v), true) ' + h2) ↔ persisted(l) ∧ (e.W? ⊃ (e, b) ';[]).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = [] ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = []), allWritesOKInd(pending, persisted, ((e, b) ' + h) + (W(t, l, v), false) ' + h2), ∀ pending0, persisted0, t0, l0, v0, h0. ( allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), true) ' + h0) ↔ persisted0(l0) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l0).filter(λ vpe0. ¬ vpe0._2) = []) ∨ ¬ allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), false) ' + h0) ⊦
e = W(t1, l1, v1), ¬ ( allWritesOKInd(pending, persisted, ((e, b) ' + h) + (W(t, l, v), true) ' + h2) ↔ persisted(l) ∧ (e.W? ⊃ (e, b) ';[]).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = [] ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = []), allWritesOKInd(pending, persisted, ((e, b) ' + h) + (W(t, l, v), false) ' + h2), ∀ pending0, persisted0, t0, l0, v0, h0. ( allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), true) ' + h0) ↔ persisted0(l0) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l0).filter(λ vpe0. ¬ vpe0._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), ¬ ( allWritesOKInd(pending, persisted, ((e, b) ' + h) + (W(t, l, v), true) ' + h2) ↔ persisted(l) ∧ (e.W? ⊃ (e, b) ';[]).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = [] ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = []), allWritesOKInd(pending, persisted, ((e, b) ' + h) + (W(t, l, v), false) ' + h2), ∀ pending0, persisted0, t0, l0, v0, h0. ( allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), true) ' + h0) ↔ persisted0(l0) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l0).filter(λ vpe0. ¬ vpe0._2) = []) ∨ ¬ allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), false) ' + h0) ⊦ |
¬ ( allWritesOKInd(pending, persisted, h + (W(t, l, v), true) ' + h2) ↔ persisted(l) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = []), allWritesOKInd(pending, persisted, h + (W(t, l, v), false) ' + h2), ∀ pending0, persisted0, t0, l0, v0, h0. ( allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), true) ' + h0) ↔ persisted0(l0) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l0).filter(λ vpe0. ¬ vpe0._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 ⊦ [].filter(p) = []; (s) ⊦ ¬ R(t, l, v).W?; (s)
| ¬ ( allWritesOKInd(pending, persisted, h + (W(t, l, v), true) ' + h2) ↔ persisted(l) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = []), allWritesOKInd(pending, persisted, h + (W(t, l, v), false) ' + h2), ∀ pending0, persisted0, t0, l0, v0, h0. ( allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), true) ' + h0) ↔ persisted0(l0) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l0).filter(λ vpe0. ¬ vpe0._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: pending, persisted, t, l, v, h2
| e = W(t1, l1, v1), ¬ ( allWritesOKInd(pending, persisted, ((e, b) ' + h) + (W(t, l, v), true) ' + h2) ↔ persisted(l) ∧ (e.W? ⊃ (e, b) ';[]).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = [] ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = []), allWritesOKInd(pending, persisted, ((e, b) ' + h) + (W(t, l, v), false) ' + h2), ∀ pending0, persisted0, t0, l0, v0, h0. ( allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), true) ' + h0) ↔ persisted0(l0) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l0).filter(λ vpe0. ¬ vpe0._2) = []) ∨ ¬ allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), false) ' + h0) ⊦ |
¬ ( allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), true) ' + h2) ↔ persisted(l) ∧ (l1 = l ⊃ (W(t1, l, v1), b) ';[]).filter(λ vpe0. ¬ vpe0._2) = [] ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = []), allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), false) ' + h2), ¬ pending(t1), b → persisted(l1), ∀ pending0, persisted0, t0, l0, v0, h0. ( allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), true) ' + h0) ↔ persisted0(l0) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l0).filter(λ vpe0. ¬ vpe0._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 ⊦ W(t, l, v).l = l; (s) ⊦ a '.filter(p) = (p(a) ⊃ a ';[]); (s) ⊦ W(t, l, v).W?; (s)
| ¬ ( allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), true) ' + h2) ↔ persisted(l) ∧ (l1 = l ⊃ (W(t1, l, v1), b) ';[]).filter(λ vpe0. ¬ vpe0._2) = [] ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = []), allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), false) ' + h2), ¬ pending(t1), b → persisted(l1), ∀ pending0, persisted0, t0, l0, v0, h0. ( allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), true) ' + h0) ↔ persisted0(l0) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l0).filter(λ vpe0. ¬ vpe0._2) = []) ∨ ¬ allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), false) ' + h0) ⊦ |
¬ ( allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), true) ' + h2) ↔ persisted(l) ∧ (l1 = l ⊃ (W(t1, l, v1), b) ';[]).filter(λ vpe0. ¬ vpe0._2) = [] ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = []), allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), false) ' + h2), ¬ pending(t1), b → persisted(l1), ∀ pending0, persisted0, t0, l0, v0, h0. ( allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), true) ' + h0) ↔ persisted0(l0) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l0).filter(λ vpe0. ¬ vpe0._2) = []) ∨ ¬ allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), false) ' + h0), ( allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), true) ' + h2) ↔ persisted(l1 := b)(l) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = []) ∨ ¬ allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), false) ' + h2) ⊦
Used terms: pending(t1 := ¬ b), persisted(l1 := b), t, l, v, h2
| ¬ ( allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), true) ' + h2) ↔ persisted(l) ∧ (l1 = l ⊃ (W(t1, l, v1), b) ';[]).filter(λ vpe0. ¬ vpe0._2) = [] ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = []), allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), false) ' + h2), ¬ pending(t1), b → persisted(l1), ∀ pending0, persisted0, t0, l0, v0, h0. ( allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), true) ' + h0) ↔ persisted0(l0) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l0).filter(λ vpe0. ¬ vpe0._2) = []) ∨ ¬ allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), false) ' + h0), ( allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), true) ' + h2) ↔ persisted(l1 := b)(l) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = []) ∨ ¬ allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), false) ' + h2) ⊦ |
allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), true) ' + h2) ↔ (l1 = l ⊃ b;persisted(l)) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = [], ¬ ( allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), true) ' + h2) ↔ persisted(l) ∧ (l1 = l ⊃ (W(t1, l, v1), b) ';[]).filter(λ vpe0. ¬ vpe0._2) = [] ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = []), allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), false) ' + h2), ¬ pending(t1), b → persisted(l1), ∀ pending0, persisted0, t0, l0, v0, h0. ( allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), true) ' + h0) ↔ persisted0(l0) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l0).filter(λ vpe0. ¬ vpe0._2) = []) ∨ ¬ allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), false) ' + h0) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list
| allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), true) ' + h2) ↔ (l1 = l ⊃ b;persisted(l)) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = [], ¬ ( allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), true) ' + h2) ↔ persisted(l) ∧ (l1 = l ⊃ (W(t1, l, v1), b) ';[]).filter(λ vpe0. ¬ vpe0._2) = [] ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = []), allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), false) ' + h2), ¬ pending(t1), b → persisted(l1), ∀ pending0, persisted0, t0, l0, v0, h0. ( allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), true) ' + h0) ↔ persisted0(l0) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l0).filter(λ vpe0. ¬ vpe0._2) = []) ∨ ¬ allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), false) ' + h0) ⊦ |
allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), true) ' + h2) ↔ (l1 = l ⊃ b;persisted(l)) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = [], ¬ ( allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), true) ' + h2) ↔ persisted(l) ∧ (l1 = l ⊃ (W(t1, l, v1), b) ';[]).filter(λ vpe0. ¬ vpe0._2) = [] ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = []), allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), false) ' + h2), allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), true) ' + h2), ¬ pending(t1), b → persisted(l1), ∀ pending0, persisted0, t0, l0, v0, h0. ( allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), true) ' + h0) ↔ persisted0(l0) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l0).filter(λ vpe0. ¬ vpe0._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 '.filter(p) = (p(a) ⊃ a ';[]); (s) ⊦ a ' ≠ []; (s) Used formulas: allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), true) ' + h2)
| allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), true) ' + h2) ↔ (l1 = l ⊃ b;persisted(l)) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = [], ¬ ( allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), true) ' + h2) ↔ persisted(l) ∧ (l1 = l ⊃ (W(t1, l, v1), b) ';[]).filter(λ vpe0. ¬ vpe0._2) = [] ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = []), allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), false) ' + h2), allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), true) ' + h2), ¬ pending(t1), b → persisted(l1), ∀ pending0, persisted0, t0, l0, v0, h0. ( allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), true) ' + h0) ↔ persisted0(l0) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l0).filter(λ vpe0. ¬ vpe0._2) = []) ∨ ¬ allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), false) ' + h0) ⊦ |
h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = [], allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), true) ' + h2), allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), false) ' + h2), ¬ pending(t1), b → persisted(l1), (l1 = l ⊃ b;persisted(l)), ∀ pending0, persisted0, t0, l0, v0, h0. ( allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), true) ' + h0) ↔ persisted0(l0) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l0).filter(λ vpe0. ¬ vpe0._2) = []) ∨ ¬ allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), false) ' + h0) ⊦ persisted(l) ∧ (l1 = l ⊃ (W(t1, l, v1), b) ';[]).filter(λ vpe0. ¬ vpe0._2) = []
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list
| h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = [], allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), true) ' + h2), allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), false) ' + h2), ¬ pending(t1), b → persisted(l1), (l1 = l ⊃ b;persisted(l)), ∀ pending0, persisted0, t0, l0, v0, h0. ( allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), true) ' + h0) ↔ persisted0(l0) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l0).filter(λ vpe0. ¬ vpe0._2) = []) ∨ ¬ allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), false) ' + h0) ⊦ persisted(l) ∧ (l1 = l ⊃ (W(t1, l, v1), b) ';[]).filter(λ vpe0. ¬ vpe0._2) = [] |
h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = [], b, allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), false) ' + h2), allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), true) ' + h2), ¬ pending(t1), b → persisted(l1), (l1 = l ⊃ b;persisted(l)), ∀ pending0, persisted0, t0, l0, v0, h0. ( allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), true) ' + h0) ↔ persisted0(l0) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l0).filter(λ vpe0. ¬ vpe0._2) = []) ∨ ¬ allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), false) ' + h0) ⊦ persisted(l) ∧ (l1 = l ⊃ (W(t1, l, v1), b) ';[]).filter(λ vpe0. ¬ vpe0._2) = []
Used simplifier rules: ⊦ [].filter(p) = []; (s) Used formulas: ¬ b
| h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = [], b, allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), false) ' + h2), allWritesOKInd(pending(t1 := ¬ b), persisted(l1 := b), h + (W(t, l, v), true) ' + h2), ¬ pending(t1), b → persisted(l1), (l1 = l ⊃ b;persisted(l)), ∀ pending0, persisted0, t0, l0, v0, h0. ( allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), true) ' + h0) ↔ persisted0(l0) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l0).filter(λ vpe0. ¬ vpe0._2) = []) ∨ ¬ allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), false) ' + h0) ⊦ persisted(l) ∧ (l1 = l ⊃ (W(t1, l, v1), b) ';[]).filter(λ vpe0. ¬ vpe0._2) = [] |
h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = [], (l1 = l ⊃ (W(t1, l, v1), true) ';[]).filter(λ vpe0. ¬ vpe0._2) ≠ [], allWritesOKInd(pending(t1 := false), persisted(l1 := true), h + (W(t, l, v), true) ' + h2), allWritesOKInd(pending(t1 := false), persisted(l1 := true), h + (W(t, l, v), false) ' + h2), persisted(l1), persisted(l), ¬ pending(t1), ∀ pending0, persisted0, t0, l0, v0, h0. ( allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), true) ' + h0) ↔ persisted0(l0) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l0).filter(λ vpe0. ¬ vpe0._2) = []) ∨ ¬ allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), false) ' + h0) ⊦
| h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l).filter(λ vpe0. ¬ vpe0._2) = [], (l1 = l ⊃ (W(t1, l, v1), true) ';[]).filter(λ vpe0. ¬ vpe0._2) ≠ [], allWritesOKInd(pending(t1 := false), persisted(l1 := true), h + (W(t, l, v), true) ' + h2), allWritesOKInd(pending(t1 := false), persisted(l1 := true), h + (W(t, l, v), false) ' + h2), persisted(l1), persisted(l), ¬ pending(t1), ∀ pending0, persisted0, t0, l0, v0, h0. ( allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), true) ' + h0) ↔ persisted0(l0) ∧ h.filter(λ vpe. vpe._1.W?).filter(λ vpe. vpe._1.l = l0).filter(λ vpe0. ¬ vpe0._2) = []) ∨ ¬ allWritesOKInd(pending0, persisted0, h + (W(t0, l0, v0), false) ' + h0) ⊦ |
Used simplifier rules: ⊦ [].filter(p) = []; (s) ⊦ a '.filter(p) = (p(a) ⊃ a ';[]); (s) Used formulas: l1 = l
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.