| ⊦ abs(h, rs, p) ∧ firstPersistW(p(l)) < # p(l) ∧ h[firstVolWrite(l, h)] = (e, bv) → abs (h.take(firstVolWrite(l, h)) + (e, true) ' + persistDependentReads(l, h.drop(firstVolWrite(l, h) + 1)), rs, p(l := p(l) -p firstPersistW(p(l)))) |
h[firstVolWrite(l, h)] = (e, bv), firstPersistW(p(l)) < # p(l), abs(h, rs, p), ¬ abs(h.take(firstVolWrite(l, h)) + (e, true) ' + persistDependentReads(l, h.drop(firstVolWrite(l, h) + 1)), rs, p(l := p(l) -p firstPersistW(p(l)))) ⊦
| h[firstVolWrite(l, h)] = (e, bv), firstPersistW(p(l)) < # p(l), abs(h, rs, p), ¬ abs(h.take(firstVolWrite(l, h)) + (e, true) ' + persistDependentReads(l, h.drop(firstVolWrite(l, h) + 1)), rs, p(l := p(l) -p firstPersistW(p(l)))) ⊦ |
h[firstVolWrite(l, h)] = (e, bv), p(l) ≠ [], firstPersistW(p(l)) < # p(l), abs(h, rs, p), ¬ abs(h.take(firstVolWrite(l, h)) + (e, true) ' + persistDependentReads(l, h.drop(firstVolWrite(l, h) + 1)), rs, p(l := p(l) -p firstPersistW(p(l)))) ⊦
Used simplifier rules: ⊦ # x = 0 ↔ x = []; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic
| h[firstVolWrite(l, h)] = (e, bv), p(l) ≠ [], firstPersistW(p(l)) < # p(l), abs(h, rs, p), ¬ abs(h.take(firstVolWrite(l, h)) + (e, true) ' + persistDependentReads(l, h.drop(firstVolWrite(l, h) + 1)), rs, p(l := p(l) -p firstPersistW(p(l)))) ⊦ |
⊦ abs(h, rs, p) → (abs(h0, rs0, p0) ↔ (∀ l. absloc(events((h | l) | false), rs(l), p(l)) → absloc(events((h0 | l) | false), rs0(l), p0(l))))
h[firstVolWrite(l, h)] = (e, bv), p(l) ≠ [], firstPersistW(p(l)) < # p(l), abs(h, rs, p), ∃ l0. ¬ ( absloc(events((h | l0) | false), rs(l0), p(l0)) → absloc (events((h.take(firstVolWrite(l, h)) + (e, true) ' + persistDependentReads(l, h.drop(firstVolWrite(l, h) + 1)) | l0) | false), rs(l0), p(l := p(l) -p firstPersistW(p(l)))(l0))) ⊦
Used terms: p(l := p(l) -p firstPersistW(p(l))), rs, h.take(firstVolWrite(l, h)) + (e, true) ' + persistDependentReads(l, h.drop(firstVolWrite(l, h) + 1)), rs, p, h
| ⊦ abs(h, rs, p) → (abs(h0, rs0, p0) ↔ (∀ l. absloc(events((h | l) | false), rs(l), p(l)) → absloc(events((h0 | l) | false), rs0(l), p0(l)))) |
| h[firstVolWrite(l, h)] = (e, bv), p(l) ≠ [], firstPersistW(p(l)) < # p(l), abs(h, rs, p), ∃ l0. ¬ ( absloc(events((h | l0) | false), rs(l0), p(l0)) → absloc (events((h.take(firstVolWrite(l, h)) + (e, true) ' + persistDependentReads(l, h.drop(firstVolWrite(l, h) + 1)) | l0) | false), rs(l0), p(l := p(l) -p firstPersistW(p(l)))(l0))) ⊦ |
h[firstVolWrite(l, h)] = (e, bv), p(l) ≠ [], firstPersistW(p(l)) < # p(l), abs(h, rs, p), absloc(events((h | l0) | false), rs(l0), p(l0)), ¬ absloc ( events((h.take(firstVolWrite(l, h)) | l0) | false) + events((l = l0 ⊃ (e, true) ';[]) | false) + events((persistDependentReads(l, h.drop(firstVolWrite(l, h) + 1)) | l0) | false), rs(l0), (l = l0 ⊃ p(l0) -p firstPersistW(p(l0));p(l0))) ⊦
Used simplifier rules: abs-firstPersistW-firstVolWrite-correct-loc: ⊦ abs(h, rs, p) ∧ firstPersistW(p(l)) < # p(l) ∧ h[firstVolWrite(l, h)] = (e, bv) → e.l = l; a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ events(h1 + h2) = events(h1) + events(h2); (s) ⊦ h + h0 | b = (h | b) + (h0 | b); (s) ⊦ vpe ' | l = (vpe._1.l = l ⊃ vpe ';[]); (s) ⊦ h + h0 | l0 = (h | l0) + (h0 | l0); (s)
| h[firstVolWrite(l, h)] = (e, bv), p(l) ≠ [], firstPersistW(p(l)) < # p(l), abs(h, rs, p), absloc(events((h | l0) | false), rs(l0), p(l0)), ¬ absloc ( events((h.take(firstVolWrite(l, h)) | l0) | false) + events((l = l0 ⊃ (e, true) ';[]) | false) + events((persistDependentReads(l, h.drop(firstVolWrite(l, h) + 1)) | l0) | false), rs(l0), (l = l0 ⊃ p(l0) -p firstPersistW(p(l0));p(l0))) ⊦ |
⊦ firstVolWrite(l, h) < # h → (∃ t, v. h = h.take(firstVolWrite(l, h)) + ((W(t, l, v), false) + h.drop(firstVolWrite(l, h) + 1)))
h[firstVolWrite(l, h)] = (e, bv), p(l) ≠ [], firstPersistW(p(l)) < # p(l), abs(h, rs, p), absloc(events((h | l0) | false), rs(l0), p(l0)), ¬ absloc ( events((h.take(firstVolWrite(l, h)) | l0) | false) + events((l = l0 ⊃ (e, true) ';[]) | false) + events((persistDependentReads(l, h.drop(firstVolWrite(l, h) + 1)) | l0) | false), rs(l0), (l = l0 ⊃ p(l0) -p firstPersistW(p(l0));p(l0))), firstVolWrite(l, h) < # h → (∃ t, v. h = h.take(firstVolWrite(l, h)) + ((W(t, l, v), false) + h.drop(firstVolWrite(l, h) + 1))) ⊦
Used terms: l, h
| ⊦ firstVolWrite(l, h) < # h → (∃ t, v. h = h.take(firstVolWrite(l, h)) + ((W(t, l, v), false) + h.drop(firstVolWrite(l, h) + 1))) |
| h[firstVolWrite(l, h)] = (e, bv), p(l) ≠ [], firstPersistW(p(l)) < # p(l), abs(h, rs, p), absloc(events((h | l0) | false), rs(l0), p(l0)), ¬ absloc ( events((h.take(firstVolWrite(l, h)) | l0) | false) + events((l = l0 ⊃ (e, true) ';[]) | false) + events((persistDependentReads(l, h.drop(firstVolWrite(l, h) + 1)) | l0) | false), rs(l0), (l = l0 ⊃ p(l0) -p firstPersistW(p(l0));p(l0))), firstVolWrite(l, h) < # h → (∃ t, v. h = h.take(firstVolWrite(l, h)) + ((W(t, l, v), false) + h.drop(firstVolWrite(l, h) + 1))) ⊦ |
h[firstVolWrite(l, h)] = (e, bv), h = h.take(firstVolWrite(l, h)) + (W(t, l, v), false) ' + h.drop(firstVolWrite(l, h) + 1), p(l) ≠ [], firstPersistW(p(l)) < # p(l), abs(h, rs, p), absloc(events((h | l0) | false), rs(l0), p(l0)), ¬ absloc ( events((h.take(firstVolWrite(l, h)) | l0) | false) + events((l = l0 ⊃ (e, true) ';[]) | false) + events((persistDependentReads(l, h.drop(firstVolWrite(l, h) + 1)) | l0) | false), rs(l0), (l = l0 ⊃ p(l0) -p firstPersistW(p(l0));p(l0))) ⊦
Used simplifier rules: abs-firstPersistW-is-in-hist: ⊦ abs(h, rs, p) ∧ firstPersistW(p(l)) < # p(l) → (h |W | l) | false ≠ []; a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a + x = a ' + x; (s) ⊦ firstVolWrite(l, h) < # h ↔ (h |W | l) | false ≠ []; (s)
| h[firstVolWrite(l, h)] = (e, bv), h = h.take(firstVolWrite(l, h)) + (W(t, l, v), false) ' + h.drop(firstVolWrite(l, h) + 1), p(l) ≠ [], firstPersistW(p(l)) < # p(l), abs(h, rs, p), absloc(events((h | l0) | false), rs(l0), p(l0)), ¬ absloc ( events((h.take(firstVolWrite(l, h)) | l0) | false) + events((l = l0 ⊃ (e, true) ';[]) | false) + events((persistDependentReads(l, h.drop(firstVolWrite(l, h) + 1)) | l0) | false), rs(l0), (l = l0 ⊃ p(l0) -p firstPersistW(p(l0));p(l0))) ⊦ |
h[firstVolWrite(l, h)] = (e, bv), h = h.take(firstVolWrite(l, h)) + (W(t, l, v), false) ' + h.drop(firstVolWrite(l, h) + 1), p(l) ≠ [], (h |W | l) | false ≠ [], firstPersistW(p(l)) < # p(l), abs(h, rs, p), absloc(events((h | l0) | false), rs(l0), p(l0)), ¬ absloc ( events((h.take(firstVolWrite(l, h)) | l0) | false) + events((l = l0 ⊃ (e, true) ';[]) | false) + events((persistDependentReads(l, h.drop(firstVolWrite(l, h) + 1)) | l0) | false), rs(l0), (l = l0 ⊃ p(l0) -p firstPersistW(p(l0));p(l0))) ⊦
Used simplifier rules: abs-firstPersistW-is-in-hist: ⊦ abs(h, rs, p) ∧ firstPersistW(p(l)) < # p(l) → (h |W | l) | false ≠ []; Used formulas: (h |W | l) | false ≠ []
| h[firstVolWrite(l, h)] = (e, bv), h = h.take(firstVolWrite(l, h)) + (W(t, l, v), false) ' + h.drop(firstVolWrite(l, h) + 1), p(l) ≠ [], (h |W | l) | false ≠ [], firstPersistW(p(l)) < # p(l), abs(h, rs, p), absloc(events((h | l0) | false), rs(l0), p(l0)), ¬ absloc ( events((h.take(firstVolWrite(l, h)) | l0) | false) + events((l = l0 ⊃ (e, true) ';[]) | false) + events((persistDependentReads(l, h.drop(firstVolWrite(l, h) + 1)) | l0) | false), rs(l0), (l = l0 ⊃ p(l0) -p firstPersistW(p(l0));p(l0))) ⊦ |
h[firstVolWrite(l, h)] = (e, bv), h = h.take(firstVolWrite(l, h)) + (W(t, l, v), false) ' + h.drop(firstVolWrite(l, h) + 1), p(l) ≠ [], (h |W | l) | false ≠ [], firstPersistW(p(l)) < # p(l), abs(h, rs, p), absloc(events((h | l0) | false), rs(l0), p(l0)), ¬ absloc ( events((h.take(firstVolWrite(l, h)) | l0) | false) + events((l = l0 ⊃ (e, true) ';[]) | false) + events((persistDependentReads(l, h.drop(firstVolWrite(l, h) + 1)) | l0) | false), rs(l0), (l = l0 ⊃ p(l0) -p firstPersistW(p(l0));p(l0))) ⊦
| h[firstVolWrite(l, h)] = (e, bv), h = h.take(firstVolWrite(l, h)) + (W(t, l, v), false) ' + h.drop(firstVolWrite(l, h) + 1), p(l) ≠ [], (h |W | l) | false ≠ [], firstPersistW(p(l)) < # p(l), abs(h, rs, p), absloc(events((h | l0) | false), rs(l0), p(l0)), ¬ absloc ( events((h.take(firstVolWrite(l, h)) | l0) | false) + events((l = l0 ⊃ (e, true) ';[]) | false) + events((persistDependentReads(l, h.drop(firstVolWrite(l, h) + 1)) | l0) | false), rs(l0), (l = l0 ⊃ p(l0) -p firstPersistW(p(l0));p(l0))) ⊦ |
⊦ abs(h, rs, p) ↔ (∀ l. absloc(events((h | l) | false), rs(l), p(l)))
h[firstVolWrite(l, h)] = (e, bv), h = h.take(firstVolWrite(l, h)) + (W(t, l, v), false) ' + h.drop(firstVolWrite(l, h) + 1), p(l) ≠ [], (h |W | l) | false ≠ [], firstPersistW(p(l)) < # p(l), absloc(events((h | l0) | false), rs(l0), p(l0)), ¬ absloc ( events((h.take(firstVolWrite(l, h)) | l0) | false) + events((l = l0 ⊃ (e, true) ';[]) | false) + events((persistDependentReads(l, h.drop(firstVolWrite(l, h) + 1)) | l0) | false), rs(l0), (l = l0 ⊃ p(l0) -p firstPersistW(p(l0));p(l0))), ∀ l. absloc(events((h | l) | false), rs(l), p(l)) ⊦
Used terms: h, rs, p
| ⊦ abs(h, rs, p) ↔ (∀ l. absloc(events((h | l) | false), rs(l), p(l))) |
| h[firstVolWrite(l, h)] = (e, bv), h = h.take(firstVolWrite(l, h)) + (W(t, l, v), false) ' + h.drop(firstVolWrite(l, h) + 1), p(l) ≠ [], (h |W | l) | false ≠ [], firstPersistW(p(l)) < # p(l), absloc(events((h | l0) | false), rs(l0), p(l0)), ¬ absloc ( events((h.take(firstVolWrite(l, h)) | l0) | false) + events((l = l0 ⊃ (e, true) ';[]) | false) + events((persistDependentReads(l, h.drop(firstVolWrite(l, h) + 1)) | l0) | false), rs(l0), (l = l0 ⊃ p(l0) -p firstPersistW(p(l0));p(l0))), ∀ l. absloc(events((h | l) | false), rs(l), p(l)) ⊦ |
h[firstVolWrite(l, h)] = (e, bv), h = h.take(firstVolWrite(l, h)) + (W(t, l, v), false) ' + h.drop(firstVolWrite(l, h) + 1), p(l) ≠ [], (h |W | l) | false ≠ [], firstPersistW(p(l)) < # p(l), absloc(events((h | l0) | false), rs(l0), p(l0)), ¬ absloc ( events((h.take(firstVolWrite(l, h)) | l0) | false) + events((l = l0 ⊃ (e, true) ';[]) | false) + events((persistDependentReads(l, h.drop(firstVolWrite(l, h) + 1)) | l0) | false), rs(l0), (l = l0 ⊃ p(l0) -p firstPersistW(p(l0));p(l0))) ⊦
Used terms: l0
| h[firstVolWrite(l, h)] = (e, bv), h = h.take(firstVolWrite(l, h)) + (W(t, l, v), false) ' + h.drop(firstVolWrite(l, h) + 1), p(l) ≠ [], (h |W | l) | false ≠ [], firstPersistW(p(l)) < # p(l), absloc(events((h | l0) | false), rs(l0), p(l0)), ¬ absloc ( events((h.take(firstVolWrite(l, h)) | l0) | false) + events((l = l0 ⊃ (e, true) ';[]) | false) + events((persistDependentReads(l, h.drop(firstVolWrite(l, h) + 1)) | l0) | false), rs(l0), (l = l0 ⊃ p(l0) -p firstPersistW(p(l0));p(l0))) ⊦ |
h[firstVolWrite(l, h)] = (e, bv), h = h.take(firstVolWrite(l, h)) + (W(t, l, v), false) ' + h.drop(firstVolWrite(l, h) + 1), p(l) ≠ [], (h |W | l) | false ≠ [], firstPersistW(p(l)) < # p(l), absloc(events((h.take(firstVolWrite(l, h)) + (W(t, l, v), false) ' + h.drop(firstVolWrite(l, h) + 1) | l0) | false), rs(l0), p(l0)), ¬ absloc ( events((h.take(firstVolWrite(l, h)) | l0) | false) + events((l = l0 ⊃ (e, true) ';[]) | false) + events((persistDependentReads(l, h.drop(firstVolWrite(l, h) + 1)) | l0) | false), rs(l0), (l = l0 ⊃ p(l0) -p firstPersistW(p(l0));p(l0))) ⊦
| h[firstVolWrite(l, h)] = (e, bv), h = h.take(firstVolWrite(l, h)) + (W(t, l, v), false) ' + h.drop(firstVolWrite(l, h) + 1), p(l) ≠ [], (h |W | l) | false ≠ [], firstPersistW(p(l)) < # p(l), absloc(events((h.take(firstVolWrite(l, h)) + (W(t, l, v), false) ' + h.drop(firstVolWrite(l, h) + 1) | l0) | false), rs(l0), p(l0)), ¬ absloc ( events((h.take(firstVolWrite(l, h)) | l0) | false) + events((l = l0 ⊃ (e, true) ';[]) | false) + events((persistDependentReads(l, h.drop(firstVolWrite(l, h) + 1)) | l0) | false), rs(l0), (l = l0 ⊃ p(l0) -p firstPersistW(p(l0));p(l0))) ⊦ |
h[firstVolWrite(l, h)] = (e, bv), h = h.take(firstVolWrite(l, h)) + (W(t, l, v), false) ' + h.drop(firstVolWrite(l, h) + 1), p(l) ≠ [], (h |W | l) | false ≠ [], firstPersistW(p(l)) < # p(l), absloc ( events((h.take(firstVolWrite(l, h)) | l0) | false) + events((l = l0 ⊃ (W(t, l0, v), false) ';[]) | false) + events((h.drop(firstVolWrite(l, h) + 1) | l0) | false), rs(l0), p(l0)), ¬ absloc ( events((h.take(firstVolWrite(l, h)) | l0) | false) + events((l = l0 ⊃ (e, true) ';[]) | false) + events((persistDependentReads(l, h.drop(firstVolWrite(l, h) + 1)) | l0) | false), rs(l0), (l = l0 ⊃ p(l0) -p firstPersistW(p(l0));p(l0))) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ events(h1 + h2) = events(h1) + events(h2); (s) ⊦ h + h0 | b = (h | b) + (h0 | b); (s) ⊦ W(t, l, v).l = l; (s) ⊦ vpe ' | l = (vpe._1.l = l ⊃ vpe ';[]); (s) ⊦ h + h0 | l0 = (h | l0) + (h0 | l0); (s)
| h[firstVolWrite(l, h)] = (e, bv), h = h.take(firstVolWrite(l, h)) + (W(t, l, v), false) ' + h.drop(firstVolWrite(l, h) + 1), p(l) ≠ [], (h |W | l) | false ≠ [], firstPersistW(p(l)) < # p(l), absloc ( events((h.take(firstVolWrite(l, h)) | l0) | false) + events((l = l0 ⊃ (W(t, l0, v), false) ';[]) | false) + events((h.drop(firstVolWrite(l, h) + 1) | l0) | false), rs(l0), p(l0)), ¬ absloc ( events((h.take(firstVolWrite(l, h)) | l0) | false) + events((l = l0 ⊃ (e, true) ';[]) | false) + events((persistDependentReads(l, h.drop(firstVolWrite(l, h) + 1)) | l0) | false), rs(l0), (l = l0 ⊃ p(l0) -p firstPersistW(p(l0));p(l0))) ⊦ |
Used simplifier rules: absloc-persist-firstPersistW: ⊦ absloc ( events((h.take(firstVolWrite(l, h)) | l) | false) + W(t, l, v) ' + events((h.drop(firstVolWrite(l, h) + 1) | l) | false), rset, fowl) ∧ firstPersistW(fowl) < # fowl → absloc ( events((h.take(firstVolWrite(l, h)) | l) | false) + events((persistDependentReads(l, h.drop(firstVolWrite(l, h) + 1)) | l) | false), rset, fowl -p firstPersistW(fowl)); ⊦ [] | b = []; (s) ⊦ events([]) = []; (s) ⊦ l ≠ l0 → persistDependentReads(l, h) | l0 = h | l0; (s) ⊦ [] + x = x; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ events(vpe ') = vpe._1 '; (s) ⊦ (e, b) ' | b0 = (b ↔ b0 ⊃ (e, b) ';[]); (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic
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.