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