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