| ⊦ allReadsOKInd(mem, persisted, h) ∧ persisted(l) → events((h | l) | false) ≠ R(t0, l0, v0) ' + el |
events((h | l) | false) = R(t0, l0, v0) ' + el, allReadsOKInd(mem, persisted, h), persisted(l) ⊦
| events((h | l) | false) = R(t0, l0, v0) ' + el, allReadsOKInd(mem, persisted, h), persisted(l) ⊦ |
h.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, allReadsOKInd(mem, persisted, h), persisted(l) ⊦
Used simplifier rules: restrict-loc: ⊦ h | l = h.filter(λ vpe. vpe._1.l = l); restrict-vp: ⊦ h | b = h.filter(λ vpe. vpe._2 ↔ b); restrict-events: ⊦ events(h) = h.map(λ vpe. vpe._1); a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a ∈ a0 ' + x ↔ a = a0 ∨ a ∈ x; (s) in-14: ⊦ a ' + x = y → a ∈ y; (forward) from specification list
| h.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, allReadsOKInd(mem, persisted, h), persisted(l) ⊦ |
(vpe + h0).filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, allReadsOKInd(mem, persisted, vpe + h0), persisted(l), ∀ l, t0, l0, v0, el, mem, persisted. ¬(h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el ∧ allReadsOKInd(mem, persisted, h0) ∧ persisted(l)) ⊦
Used simplifier rules: List('a) freely generated by [], +;; ⊦ [].filter(p) = []; (s) ⊦ [].map(f) = []; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) ⊦ a ' ≠ []; (s) a: ⊦ (x + y) + z = x + y + z; from specification list
| (vpe + h0).filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, allReadsOKInd(mem, persisted, vpe + h0), persisted(l), ∀ l, t0, l0, v0, el, mem, persisted. ¬(h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el ∧ allReadsOKInd(mem, persisted, h0) ∧ persisted(l)) ⊦ |
(vpe._1.l = l ⊃ vpe ';[]).filter(λ vpe. ¬ vpe._2).map(._1) + h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, allReadsOKInd(mem, persisted, vpe ' + h0), persisted(l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1), R(t0, l0, v0) ∈ (vpe._1.l = l ⊃ vpe ';[]).filter(λ vpe. ¬ vpe._2).map(._1) ∨ R(t0, l0, v0) ∈ h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a ∈ x + y ↔ a ∈ x ∨ a ∈ y; (s) in-14: ⊦ a ' + x = y → a ∈ y; (forward) from specification list ⊦ a + x = a ' + x; (s) ⊦ (x + y).map(f) = x.map(f) + y.map(f); (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.l = l ⊃ vpe ';[]).filter(λ vpe. ¬ vpe._2).map(._1) + h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, allReadsOKInd(mem, persisted, vpe ' + h0), persisted(l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1), R(t0, l0, v0) ∈ (vpe._1.l = l ⊃ vpe ';[]).filter(λ vpe. ¬ vpe._2).map(._1) ∨ R(t0, l0, v0) ∈ h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) ⊦ |
(e.l = l ⊃ vpe ';[]).filter(λ vpe. ¬ vpe._2).map(._1) + h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, vpe = (e, boolvar), allReadsOKInd(mem, persisted, vpe ' + h0), persisted(l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1), R(t0, l0, v0) ∈ (e.l = l ⊃ vpe ';[]).filter(λ vpe. ¬ vpe._2).map(._1) ∨ R(t0, l0, v0) ∈ h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) ⊦
Used terms: e, boolvar
| (e.l = l ⊃ vpe ';[]).filter(λ vpe. ¬ vpe._2).map(._1) + h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, vpe = (e, boolvar), allReadsOKInd(mem, persisted, vpe ' + h0), persisted(l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1), R(t0, l0, v0) ∈ (e.l = l ⊃ vpe ';[]).filter(λ vpe. ¬ vpe._2).map(._1) ∨ R(t0, l0, v0) ∈ h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) ⊦ |
(e.l = l ⊃ (e, boolvar) ';[]).filter(λ vpe. ¬ vpe._2).map(._1) + h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, allReadsOKInd(mem, persisted, (e, boolvar) ' + h0), persisted(l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1), R(t0, l0, v0) ∈ (e.l = l ⊃ (e, boolvar) ';[]).filter(λ vpe. ¬ vpe._2).map(._1) ∨ R(t0, l0, v0) ∈ h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a ∈ x + y ↔ a ∈ x ∨ a ∈ y; (s) in-14: ⊦ a ' + x = y → a ∈ y; (forward) from specification list
| (e.l = l ⊃ (e, boolvar) ';[]).filter(λ vpe. ¬ vpe._2).map(._1) + h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, allReadsOKInd(mem, persisted, (e, boolvar) ' + h0), persisted(l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1), R(t0, l0, v0) ∈ (e.l = l ⊃ (e, boolvar) ';[]).filter(λ vpe. ¬ vpe._2).map(._1) ∨ R(t0, l0, v0) ∈ h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) ⊦ |
(e, boolvar) '.filter(λ vpe. ¬ vpe._2).map(._1) + h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, e.l = l, allReadsOKInd(mem, persisted, (e, boolvar) ' + h0), persisted(l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1), R(t0, l0, v0) ∈ (e.l = l ⊃ (e, boolvar) ';[]).filter(λ vpe. ¬ vpe._2).map(._1) ∨ R(t0, l0, v0) ∈ h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) ⊦
[].filter(λ vpe. ¬ vpe._2).map(._1) + h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, e.l ≠ l, allReadsOKInd(mem, persisted, (e, boolvar) ' + h0), persisted(l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1), R(t0, l0, v0) ∈ (e.l = l ⊃ (e, boolvar) ';[]).filter(λ vpe. ¬ vpe._2).map(._1) ∨ R(t0, l0, v0) ∈ h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) ⊦
| (e, boolvar) '.filter(λ vpe. ¬ vpe._2).map(._1) + h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, e.l = l, allReadsOKInd(mem, persisted, (e, boolvar) ' + h0), persisted(l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1), R(t0, l0, v0) ∈ (e.l = l ⊃ (e, boolvar) ';[]).filter(λ vpe. ¬ vpe._2).map(._1) ∨ R(t0, l0, v0) ∈ h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) ⊦ |
(¬ boolvar ⊃ (e, false) ';[]).map(._1) + h0.filter(λ vpe. vpe._1.l = e.l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, allReadsOKInd(mem, persisted, (e, boolvar) ' + h0), persisted(e.l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1), R(t0, l0, v0) ∈ (¬ boolvar ⊃ (e, false) ';[]).map(._1) ∨ R(t0, l0, v0) ∈ h0.filter(λ vpe. vpe._1.l = e.l).filter(λ vpe. ¬ vpe._2).map(._1) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a ∈ x + y ↔ a ∈ x ∨ a ∈ y; (s) in-14: ⊦ a ' + x = y → a ∈ y; (forward) from specification list ⊦ a '.filter(p) = (p(a) ⊃ a ';[]); (s)
| (¬ boolvar ⊃ (e, false) ';[]).map(._1) + h0.filter(λ vpe. vpe._1.l = e.l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, allReadsOKInd(mem, persisted, (e, boolvar) ' + h0), persisted(e.l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1), R(t0, l0, v0) ∈ (¬ boolvar ⊃ (e, false) ';[]).map(._1) ∨ R(t0, l0, v0) ∈ h0.filter(λ vpe. vpe._1.l = e.l).filter(λ vpe. ¬ vpe._2).map(._1) ⊦ |
[].map(._1) + h0.filter(λ vpe. vpe._1.l = e.l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, boolvar, allReadsOKInd(mem, persisted, (e, boolvar) ' + h0), persisted(e.l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1), R(t0, l0, v0) ∈ (¬ boolvar ⊃ (e, false) ';[]).map(._1) ∨ R(t0, l0, v0) ∈ h0.filter(λ vpe. vpe._1.l = e.l).filter(λ vpe. ¬ vpe._2).map(._1) ⊦
Used simplifier rules: allReadsOKInd-recR: ⊦ allReadsOKInd(mem, persisted, (R(t, l, v), b) ' + h) ↔ v = mem(l) ∧ (b ↔ persisted(l)) ∧ allReadsOKInd(mem, persisted, h); ⊦ a ' + x = a0 ' + y ↔ a = a0 ∧ x = y; (ws) ⊦ a '.map(f) = f(a) '; (s) ⊦ a ∈ a0 ' ↔ a = a0; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ R(t, l, v).l = l; (s)
| [].map(._1) + h0.filter(λ vpe. vpe._1.l = e.l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, boolvar, allReadsOKInd(mem, persisted, (e, boolvar) ' + h0), persisted(e.l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1), R(t0, l0, v0) ∈ (¬ boolvar ⊃ (e, false) ';[]).map(._1) ∨ R(t0, l0, v0) ∈ h0.filter(λ vpe. vpe._1.l = e.l).filter(λ vpe. ¬ vpe._2).map(._1) ⊦ |
h0.filter(λ vpe. vpe._1.l = e.l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, allReadsOKInd(mem, persisted, (e, true) ' + h0), persisted(e.l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a ∈ a0 ' + x ↔ a = a0 ∨ a ∈ x; (s) in-14: ⊦ a ' + x = y → a ∈ y; (forward) from specification list ⊦ ¬ a ∈ []; (s) ⊦ [].map(f) = []; (s) ⊦ [] + x = x; (s)
| h0.filter(λ vpe. vpe._1.l = e.l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, allReadsOKInd(mem, persisted, (e, true) ' + h0), persisted(e.l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1) ⊦ |
h0.filter(λ vpe. vpe._1.l = e.l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, e = R(t1, l, v1), allReadsOKInd(mem, persisted, (e, true) ' + h0), persisted(e.l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1) ⊦
h0.filter(λ vpe. vpe._1.l = e.l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, e = W(t1, l, v1), allReadsOKInd(mem, persisted, (e, true) ' + h0), persisted(e.l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1) ⊦
Used simplifier rules: RWevent freely generated by R, W;;
| h0.filter(λ vpe. vpe._1.l = e.l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, e = R(t1, l, v1), allReadsOKInd(mem, persisted, (e, true) ' + h0), persisted(e.l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1) ⊦ |
h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, allReadsOKInd(mem, persisted, h0), persisted(l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1) ⊦
Used simplifier rules: allReadsOKInd-recR: ⊦ allReadsOKInd(mem, persisted, (R(t, l, v), b) ' + h) ↔ v = mem(l) ∧ (b ↔ persisted(l)) ∧ allReadsOKInd(mem, persisted, h); a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a ∈ a0 ' + x ↔ a = a0 ∨ a ∈ x; (s) in-14: ⊦ a ' + x = y → a ∈ y; (forward) from specification list ⊦ R(t, l, v).l = l; (s)
| h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, allReadsOKInd(mem, persisted, h0), persisted(l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1) ⊦ |
Used terms: l, t0, l0, v0, el, mem, persisted
| h0.filter(λ vpe. vpe._1.l = e.l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, e = W(t1, l, v1), allReadsOKInd(mem, persisted, (e, true) ' + h0), persisted(e.l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1) ⊦ |
h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, allReadsOKInd(mem(l := v1), persisted(l := true), h0), persisted(l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1) ⊦
Used simplifier rules: allReadsOKInd-recW: ⊦ allReadsOKInd(mem, persisted, (W(t, l, v), b) ' + h) ↔ allReadsOKInd(mem(l := v), persisted(l := b), h); a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a ∈ a0 ' + x ↔ a = a0 ∨ a ∈ x; (s) in-14: ⊦ a ' + x = y → a ∈ y; (forward) from specification list ⊦ W(t, l, v).l = l; (s)
| h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, allReadsOKInd(mem(l := v1), persisted(l := true), h0), persisted(l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1) ⊦ |
Used terms: l, t0, l0, v0, el, mem(l := v1), persisted(l := true)
| [].filter(λ vpe. ¬ vpe._2).map(._1) + h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, e.l ≠ l, allReadsOKInd(mem, persisted, (e, boolvar) ' + h0), persisted(l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1), R(t0, l0, v0) ∈ (e.l = l ⊃ (e, boolvar) ';[]).filter(λ vpe. ¬ vpe._2).map(._1) ∨ R(t0, l0, v0) ∈ h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) ⊦ |
h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, e.l ≠ l, allReadsOKInd(mem, persisted, (e, boolvar) ' + h0), persisted(l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a ∈ a0 ' + x ↔ a = a0 ∨ a ∈ x; (s) in-14: ⊦ a ' + x = y → a ∈ y; (forward) from specification list ⊦ ¬ a ∈ []; (s) ⊦ [].map(f) = []; (s) ⊦ [].filter(p) = []; (s) ⊦ [] + x = x; (s)
| h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, e.l ≠ l, allReadsOKInd(mem, persisted, (e, boolvar) ' + h0), persisted(l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1) ⊦ |
h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, e = R(t1, l3, v1), e.l ≠ l, allReadsOKInd(mem, persisted, (e, boolvar) ' + h0), persisted(l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1) ⊦
h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, e = W(t1, l3, v1), e.l ≠ l, allReadsOKInd(mem, persisted, (e, boolvar) ' + h0), persisted(l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1) ⊦
Used simplifier rules: RWevent freely generated by R, W;;
| h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, e = R(t1, l3, v1), e.l ≠ l, allReadsOKInd(mem, persisted, (e, boolvar) ' + h0), persisted(l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1) ⊦ |
h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, l3 ≠ l, allReadsOKInd(mem, persisted, h0), persisted(l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1) ⊦
Used simplifier rules: allReadsOKInd-recR: ⊦ allReadsOKInd(mem, persisted, (R(t, l, v), b) ' + h) ↔ v = mem(l) ∧ (b ↔ persisted(l)) ∧ allReadsOKInd(mem, persisted, h); a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ R(t, l, v).l = l; (s)
| h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, l3 ≠ l, allReadsOKInd(mem, persisted, h0), persisted(l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1) ⊦ |
Used terms: l, t0, l0, v0, el, mem, persisted
| h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, e = W(t1, l3, v1), e.l ≠ l, allReadsOKInd(mem, persisted, (e, boolvar) ' + h0), persisted(l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1) ⊦ |
h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, l3 ≠ l, allReadsOKInd(mem(l3 := v1), persisted(l3 := boolvar), h0), persisted(l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1) ⊦
Used simplifier rules: allReadsOKInd-recW: ⊦ allReadsOKInd(mem, persisted, (W(t, l, v), b) ' + h) ↔ allReadsOKInd(mem(l := v), persisted(l := b), h); a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ W(t, l, v).l = l; (s)
| h0.filter(λ vpe. vpe._1.l = l).filter(λ vpe. ¬ vpe._2).map(._1) = R(t0, l0, v0) ' + el, l3 ≠ l, allReadsOKInd(mem(l3 := v1), persisted(l3 := boolvar), h0), persisted(l), ∀ l1, t, l2, v, el0, mem0, persisted0. h0.filter(λ vpe. vpe._1.l = l1).filter(λ vpe. ¬ vpe._2).map(._1) ≠ R(t, l2, v) ' + el0 ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ persisted0(l1) ⊦ |
Used terms: l, t0, l0, v0, el, mem(l3 := v1), persisted(l3 := 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.