| ⊦ absloc(events((h | l) | false), rset, fowl) ∧ allReadsOKInd(mem, persisted, h) ∧ persisted(l) ∧ isPersistFO(n, fowl) ∧ (fowl -p n)|W | t = [] ∧ ¬ FO(t) ∈ fowl -p n ∧ FO(t) ∈ fowl ∧ ¬ t ∈ rset → ((h | l) | t) | false = [] |
(fowl -p n)|W | t = [], ((h | l) | t) | false ≠ [], absloc(events((h | l) | false), rset, fowl), allReadsOKInd(mem, persisted, h), isPersistFO(n, fowl), persisted(l), FO(t) ∈ fowl, ¬ t ∈ rset, ¬ FO(t) ∈ fowl -p n ⊦
| (fowl -p n)|W | t = [], ((h | l) | t) | false ≠ [], absloc(events((h | l) | false), rset, fowl), allReadsOKInd(mem, persisted, h), isPersistFO(n, fowl), persisted(l), FO(t) ∈ fowl, ¬ t ∈ rset, ¬ FO(t) ∈ fowl -p n ⊦ |
FO(t) = fowl[n], fowl |W | t = [], ((h | l) | t) | false ≠ [], absloc(events((h | l) | false), rset, fowl), allReadsOKInd(mem, persisted, h), isPersistFO(n, fowl), persisted(l), FO(t) ∈ fowl, ¬ t ∈ rset, ¬ FO(t) ∈ fowl -p n ⊦
Used simplifier rules: delpos-get-fw: ⊦ ¬ a ∈ x -p n ∧ a ∈ x → a = x[n]; (forward) from specification list-del ⊦ isPersistFO(n, fowl) → (fowl -p n)|W = fowl |W; (s)
| FO(t) = fowl[n], fowl |W | t = [], ((h | l) | t) | false ≠ [], absloc(events((h | l) | false), rset, fowl), allReadsOKInd(mem, persisted, h), isPersistFO(n, fowl), persisted(l), FO(t) ∈ fowl, ¬ t ∈ rset, ¬ FO(t) ∈ fowl -p n ⊦ |
FO(t) = (fow + fowl0)[n], (fow + fowl0)|W | t = [], ((h | l) | t) | false ≠ [], absloc(events((h | l) | false), rset, fow + fowl0), allReadsOKInd(mem, persisted, h), isPersistFO(n, fow + fowl0), persisted(l), FO(t) ∈ fow + fowl0, ¬ t ∈ rset, ¬ FO(t) ∈ (fow + fowl0) -p n, ∀ t, n, h, l, rset, mem, persisted. ¬ ( FO(t) = fowl0[n] ∧ fowl0 |W | t = [] ∧ ((h | l) | t) | false ≠ [] ∧ absloc(events((h | l) | false), rset, fowl0) ∧ allReadsOKInd(mem, persisted, h) ∧ isPersistFO(n, fowl0) ∧ persisted(l) ∧ FO(t) ∈ fowl0 ∧ ¬ t ∈ rset ∧ ¬ FO(t) ∈ fowl0 -p n) ⊦
Used simplifier rules: List('a) freely generated by [], +;; ⊦ [] |W = []; (s) ⊦ [] | t = []; (s) ⊦ ¬ a ∈ []; (s)
| FO(t) = (fow + fowl0)[n], (fow + fowl0)|W | t = [], ((h | l) | t) | false ≠ [], absloc(events((h | l) | false), rset, fow + fowl0), allReadsOKInd(mem, persisted, h), isPersistFO(n, fow + fowl0), persisted(l), FO(t) ∈ fow + fowl0, ¬ t ∈ rset, ¬ FO(t) ∈ (fow + fowl0) -p n, ∀ t, n, h, l, rset, mem, persisted. ¬ ( FO(t) = fowl0[n] ∧ fowl0 |W | t = [] ∧ ((h | l) | t) | false ≠ [] ∧ absloc(events((h | l) | false), rset, fowl0) ∧ allReadsOKInd(mem, persisted, h) ∧ isPersistFO(n, fowl0) ∧ persisted(l) ∧ FO(t) ∈ fowl0 ∧ ¬ t ∈ rset ∧ ¬ FO(t) ∈ fowl0 -p n) ⊦ |
FO(t) = (fow ' + fowl0)[n], fow ' |W | t = [], fowl0 |W | t = [], ((h | l) | t) | false ≠ [], absloc(events((h | l) | false), rset, fow ' + fowl0), allReadsOKInd(mem, persisted, h), isPersistFO(n, fow ' + fowl0), persisted(l), ¬ t ∈ rset, ¬ FO(t) ∈ (fow ' + fowl0) -p n, ∀ t0, n0, h0, l0, rset0, mem0, persisted0. FO(t0) ≠ fowl0[n0] ∨ fowl0 |W | t0 ≠ [] ∨ ((h0 | l0) | t0) | false = [] ∨ ¬ absloc(events((h0 | l0) | false), rset0, fowl0) ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ isPersistFO(n0, fowl0) ∨ ¬ persisted0(l0) ∨ ¬ FO(t0) ∈ fowl0 ∨ t0 ∈ rset0 ∨ FO(t0) ∈ fowl0 -p n0, FO(t) = fow ∨ FO(t) ∈ fowl0 ⊦
Used simplifier rules: ⊦ a + x = a ' + x; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a ∈ a0 ' + x ↔ a = a0 ∨ a ∈ x; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) ⊦ fowl + fowl0 | t = (fowl | t) + (fowl0 | t); (s) ⊦ (fowl + fowl0)|W = fowl |W + fowl0 |W; (s)
| FO(t) = (fow ' + fowl0)[n], fow ' |W | t = [], fowl0 |W | t = [], ((h | l) | t) | false ≠ [], absloc(events((h | l) | false), rset, fow ' + fowl0), allReadsOKInd(mem, persisted, h), isPersistFO(n, fow ' + fowl0), persisted(l), ¬ t ∈ rset, ¬ FO(t) ∈ (fow ' + fowl0) -p n, ∀ t0, n0, h0, l0, rset0, mem0, persisted0. FO(t0) ≠ fowl0[n0] ∨ fowl0 |W | t0 ≠ [] ∨ ((h0 | l0) | t0) | false = [] ∨ ¬ absloc(events((h0 | l0) | false), rset0, fowl0) ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ isPersistFO(n0, fowl0) ∨ ¬ persisted0(l0) ∨ ¬ FO(t0) ∈ fowl0 ∨ t0 ∈ rset0 ∨ FO(t0) ∈ fowl0 -p n0, FO(t) = fow ∨ FO(t) ∈ fowl0 ⊦ |
FO(t) = (fow ' + fowl0)[n], n = n1 +1, fowl0 |W | t = [], fow ' |W | t = [], ((h | l) | t) | false ≠ [], absloc(events((h | l) | false), rset, fow ' + fowl0), allReadsOKInd(mem, persisted, h), isPersistFO(n, fow ' + fowl0), persisted(l), ¬ t ∈ rset, ¬ FO(t) ∈ (fow ' + fowl0) -p n, ∀ t0, n0, h0, l0, rset0, mem0, persisted0. FO(t0) ≠ fowl0[n0] ∨ fowl0 |W | t0 ≠ [] ∨ ((h0 | l0) | t0) | false = [] ∨ ¬ absloc(events((h0 | l0) | false), rset0, fowl0) ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ isPersistFO(n0, fowl0) ∨ ¬ persisted0(l0) ∨ ¬ FO(t0) ∈ fowl0 ∨ t0 ∈ rset0 ∨ FO(t0) ∈ fowl0 -p n0, FO(t) = fow ∨ FO(t) ∈ fowl0 ⊦
Used simplifier rules: abs-loc-no-w-last-firstfo-then-no-pending: ⊦ absloc(events((h | l) | false), rset, FO(t) ' + fowl) ∧ allReadsOKInd(mem, persisted, h) ∧ persisted(l) ∧ fowl |W | t = [] ∧ ¬ FO(t) ∈ fowl ∧ ¬ t ∈ rset → ((h | l) | t) | false = []; Nat freely generated by 0, +1;; ⊦ (a ' + x)[0] = a; (s) ⊦ (a ' + x) -p 0 = x; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ FO(t) ' |W = []; (s) ⊦ [] | t = []; (s)
| FO(t) = (fow ' + fowl0)[n], n = n1 +1, fowl0 |W | t = [], fow ' |W | t = [], ((h | l) | t) | false ≠ [], absloc(events((h | l) | false), rset, fow ' + fowl0), allReadsOKInd(mem, persisted, h), isPersistFO(n, fow ' + fowl0), persisted(l), ¬ t ∈ rset, ¬ FO(t) ∈ (fow ' + fowl0) -p n, ∀ t0, n0, h0, l0, rset0, mem0, persisted0. FO(t0) ≠ fowl0[n0] ∨ fowl0 |W | t0 ≠ [] ∨ ((h0 | l0) | t0) | false = [] ∨ ¬ absloc(events((h0 | l0) | false), rset0, fowl0) ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ isPersistFO(n0, fowl0) ∨ ¬ persisted0(l0) ∨ ¬ FO(t0) ∈ fowl0 ∨ t0 ∈ rset0 ∨ FO(t0) ∈ fowl0 -p n0, FO(t) = fow ∨ FO(t) ∈ fowl0 ⊦ |
FO(t) = fowl0[n1], fowl0 |W | t = [], fow ' |W | t = [], FO(t) ≠ fow, t ≠ fow.tid, ((h | l) | t) | false ≠ [], fow.FO?, absloc(events((h | l) | false), rset, fow ' + fowl0), allReadsOKInd(mem, persisted, h), isPersistFO(n1, fowl0), persisted(l), FO(t) ∈ fowl0, ¬ FO(t) ∈ fowl0 -p n1, ¬ t ∈ rset, ∀ t0, n0, h0, l0, rset0, mem0, persisted0. FO(t0) ≠ fowl0[n0] ∨ fowl0 |W | t0 ≠ [] ∨ ((h0 | l0) | t0) | false = [] ∨ ¬ absloc(events((h0 | l0) | false), rset0, fowl0) ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ isPersistFO(n0, fowl0) ∨ ¬ persisted0(l0) ∨ ¬ FO(t0) ∈ fowl0 ∨ t0 ∈ rset0 ∨ FO(t0) ∈ fowl0 -p n0 ⊦
Used simplifier rules: ⊦ FO(tid).tid = tid; (s) delpos-get-fw: ⊦ ¬ a ∈ x -p n ∧ a ∈ x → a = x[n]; (forward) from specification list-del a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a ∈ a0 ' + x ↔ ¬(a ≠ a0 ∧ ¬ a ∈ x); (ss) c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ a + x = a ' + x; (s) ⊦ (a ' + x) -p (n + 1) = a + (x -p n); (s) ⊦ m +1 = m + 1; (s) ⊦ isPersistFO(n + 1, fow ' + fowl) ↔ isPersistFO(n, fowl) ∧ fow.FO? ∧ fowl[n].tid ≠ fow.tid; (s) ⊦ (a ' + x)[n + 1] = x[n]; (s)
| FO(t) = fowl0[n1], fowl0 |W | t = [], fow ' |W | t = [], FO(t) ≠ fow, t ≠ fow.tid, ((h | l) | t) | false ≠ [], fow.FO?, absloc(events((h | l) | false), rset, fow ' + fowl0), allReadsOKInd(mem, persisted, h), isPersistFO(n1, fowl0), persisted(l), FO(t) ∈ fowl0, ¬ FO(t) ∈ fowl0 -p n1, ¬ t ∈ rset, ∀ t0, n0, h0, l0, rset0, mem0, persisted0. FO(t0) ≠ fowl0[n0] ∨ fowl0 |W | t0 ≠ [] ∨ ((h0 | l0) | t0) | false = [] ∨ ¬ absloc(events((h0 | l0) | false), rset0, fowl0) ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ isPersistFO(n0, fowl0) ∨ ¬ persisted0(l0) ∨ ¬ FO(t0) ∈ fowl0 ∨ t0 ∈ rset0 ∨ FO(t0) ∈ fowl0 -p n0 ⊦ |
FO(t) = fowl0[n1], fow = FO(tid), fow ' |W | t = [], fowl0 |W | t = [], FO(t) ≠ fow, t ≠ tid, ((h | l) | t) | false ≠ [], fow.FO?, absloc(events((h | l) | false), rset, fow ' + fowl0), allReadsOKInd(mem, persisted, h), isPersistFO(n1, fowl0), persisted(l), FO(t) ∈ fowl0, ¬ FO(t) ∈ fowl0 -p n1, ¬ t ∈ rset, ∀ t0, n0, h0, l0, rset0, mem0, persisted0. FO(t0) ≠ fowl0[n0] ∨ fowl0 |W | t0 ≠ [] ∨ ((h0 | l0) | t0) | false = [] ∨ ¬ absloc(events((h0 | l0) | false), rset0, fowl0) ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ isPersistFO(n0, fowl0) ∨ ¬ persisted0(l0) ∨ ¬ FO(t0) ∈ fowl0 ∨ t0 ∈ rset0 ∨ FO(t0) ∈ fowl0 -p n0 ⊦
Used simplifier rules: ⊦ fow.FO? → (tid = fow.tid ↔ fow = FO(tid)); (elim) Used terms: fow, tid
| FO(t) = fowl0[n1], fow = FO(tid), fow ' |W | t = [], fowl0 |W | t = [], FO(t) ≠ fow, t ≠ tid, ((h | l) | t) | false ≠ [], fow.FO?, absloc(events((h | l) | false), rset, fow ' + fowl0), allReadsOKInd(mem, persisted, h), isPersistFO(n1, fowl0), persisted(l), FO(t) ∈ fowl0, ¬ FO(t) ∈ fowl0 -p n1, ¬ t ∈ rset, ∀ t0, n0, h0, l0, rset0, mem0, persisted0. FO(t0) ≠ fowl0[n0] ∨ fowl0 |W | t0 ≠ [] ∨ ((h0 | l0) | t0) | false = [] ∨ ¬ absloc(events((h0 | l0) | false), rset0, fowl0) ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ isPersistFO(n0, fowl0) ∨ ¬ persisted0(l0) ∨ ¬ FO(t0) ∈ fowl0 ∨ t0 ∈ rset0 ∨ FO(t0) ∈ fowl0 -p n0 ⊦ |
FO(t) = fowl0[n1], fowl0 |W | t = [], t ≠ tid, ((h | l) | t) | false ≠ [], absloc(events((h | l) | false), rset, FO(tid) ' + fowl0), allReadsOKInd(mem, persisted, h), isPersistFO(n1, fowl0), persisted(l), FO(t) ∈ fowl0, ¬ FO(t) ∈ fowl0 -p n1, ¬ t ∈ rset, ∀ t0, n0, h0, l0, rset0, mem0, persisted0. FO(t0) ≠ fowl0[n0] ∨ fowl0 |W | t0 ≠ [] ∨ ((h0 | l0) | t0) | false = [] ∨ ¬ absloc(events((h0 | l0) | false), rset0, fowl0) ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ isPersistFO(n0, fowl0) ∨ ¬ persisted0(l0) ∨ ¬ FO(t0) ∈ fowl0 ∨ t0 ∈ rset0 ∨ FO(t0) ∈ fowl0 -p n0 ⊦
Used simplifier rules: ⊦ FO(tid).FO?; (s) ⊦ FO(tid) = FO(tid0) ↔ tid = tid0; (s) ⊦ [] | t = []; (s) ⊦ FO(t) ' |W = []; (s)
| FO(t) = fowl0[n1], fowl0 |W | t = [], t ≠ tid, ((h | l) | t) | false ≠ [], absloc(events((h | l) | false), rset, FO(tid) ' + fowl0), allReadsOKInd(mem, persisted, h), isPersistFO(n1, fowl0), persisted(l), FO(t) ∈ fowl0, ¬ FO(t) ∈ fowl0 -p n1, ¬ t ∈ rset, ∀ t0, n0, h0, l0, rset0, mem0, persisted0. FO(t0) ≠ fowl0[n0] ∨ fowl0 |W | t0 ≠ [] ∨ ((h0 | l0) | t0) | false = [] ∨ ¬ absloc(events((h0 | l0) | false), rset0, fowl0) ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ isPersistFO(n0, fowl0) ∨ ¬ persisted0(l0) ∨ ¬ FO(t0) ∈ fowl0 ∨ t0 ∈ rset0 ∨ FO(t0) ∈ fowl0 -p n0 ⊦ |
⊦ el = [] ∨ ¬ el.head.R? → (absloc(el, rset, FO(t) ' + fowl) ↔ absloc(el, rset, fowl))
FO(t) = fowl0[n1], fowl0 |W | t = [], events((h | l) | false) ≠ [], t ≠ tid, ((h | l) | t) | false ≠ [], events((h | l) | false).head.R?, absloc(events((h | l) | false), rset, FO(tid) ' + fowl0), allReadsOKInd(mem, persisted, h), isPersistFO(n1, fowl0), persisted(l), FO(t) ∈ fowl0, ¬ FO(t) ∈ fowl0 -p n1, ¬ t ∈ rset, ∀ t0, n0, h0, l0, rset0, mem0, persisted0. FO(t0) ≠ fowl0[n0] ∨ fowl0 |W | t0 ≠ [] ∨ ((h0 | l0) | t0) | false = [] ∨ ¬ absloc(events((h0 | l0) | false), rset0, fowl0) ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ isPersistFO(n0, fowl0) ∨ ¬ persisted0(l0) ∨ ¬ FO(t0) ∈ fowl0 ∨ t0 ∈ rset0 ∨ FO(t0) ∈ fowl0 -p n0 ⊦
FO(t) = fowl0[n1], fowl0 |W | t = [], t ≠ tid, ((h | l) | t) | false ≠ [], absloc(events((h | l) | false), rset, fowl0), allReadsOKInd(mem, persisted, h), isPersistFO(n1, fowl0), persisted(l), FO(t) ∈ fowl0, ¬ FO(t) ∈ fowl0 -p n1, ¬ t ∈ rset, ∀ t0, n0, h0, l0, rset0, mem0, persisted0. FO(t0) ≠ fowl0[n0] ∨ fowl0 |W | t0 ≠ [] ∨ ((h0 | l0) | t0) | false = [] ∨ ¬ absloc(events((h0 | l0) | false), rset0, fowl0) ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ isPersistFO(n0, fowl0) ∨ ¬ persisted0(l0) ∨ ¬ FO(t0) ∈ fowl0 ∨ t0 ∈ rset0 ∨ FO(t0) ∈ fowl0 -p n0, events((h | l) | false) = [] ∨ ¬ events((h | l) | false).head.R? ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: events((h | l) | false), rset, tid, fowl0
| ⊦ el = [] ∨ ¬ el.head.R? → (absloc(el, rset, FO(t) ' + fowl) ↔ absloc(el, rset, fowl)) |
| FO(t) = fowl0[n1], fowl0 |W | t = [], events((h | l) | false) ≠ [], t ≠ tid, ((h | l) | t) | false ≠ [], events((h | l) | false).head.R?, absloc(events((h | l) | false), rset, FO(tid) ' + fowl0), allReadsOKInd(mem, persisted, h), isPersistFO(n1, fowl0), persisted(l), FO(t) ∈ fowl0, ¬ FO(t) ∈ fowl0 -p n1, ¬ t ∈ rset, ∀ t0, n0, h0, l0, rset0, mem0, persisted0. FO(t0) ≠ fowl0[n0] ∨ fowl0 |W | t0 ≠ [] ∨ ((h0 | l0) | t0) | false = [] ∨ ¬ absloc(events((h0 | l0) | false), rset0, fowl0) ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ isPersistFO(n0, fowl0) ∨ ¬ persisted0(l0) ∨ ¬ FO(t0) ∈ fowl0 ∨ t0 ∈ rset0 ∨ FO(t0) ∈ fowl0 -p n0 ⊦ |
FO(t) = fowl0[n1], events((h | l) | false) = e + el, fowl0 |W | t = [], events((h | l) | false) ≠ [], t ≠ tid, ((h | l) | t) | false ≠ [], e.R?, absloc(events((h | l) | false), rset, FO(tid) ' + fowl0), allReadsOKInd(mem, persisted, h), isPersistFO(n1, fowl0), persisted(l), FO(t) ∈ fowl0, ¬ FO(t) ∈ fowl0 -p n1, ¬ t ∈ rset, ∀ t0, n0, h0, l0, rset0, mem0, persisted0. FO(t0) ≠ fowl0[n0] ∨ fowl0 |W | t0 ≠ [] ∨ ((h0 | l0) | t0) | false = [] ∨ ¬ absloc(events((h0 | l0) | false), rset0, fowl0) ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ isPersistFO(n0, fowl0) ∨ ¬ persisted0(l0) ∨ ¬ FO(t0) ∈ fowl0 ∨ t0 ∈ rset0 ∨ FO(t0) ∈ fowl0 -p n0 ⊦
Used simplifier rules: ⊦ x ≠ [] → (head = x.head ∧ tail = x.tail ↔ x = head + tail); (elim) Used terms: events((h | l) | false), e, el
| FO(t) = fowl0[n1], events((h | l) | false) = e + el, fowl0 |W | t = [], events((h | l) | false) ≠ [], t ≠ tid, ((h | l) | t) | false ≠ [], e.R?, absloc(events((h | l) | false), rset, FO(tid) ' + fowl0), allReadsOKInd(mem, persisted, h), isPersistFO(n1, fowl0), persisted(l), FO(t) ∈ fowl0, ¬ FO(t) ∈ fowl0 -p n1, ¬ t ∈ rset, ∀ t0, n0, h0, l0, rset0, mem0, persisted0. FO(t0) ≠ fowl0[n0] ∨ fowl0 |W | t0 ≠ [] ∨ ((h0 | l0) | t0) | false = [] ∨ ¬ absloc(events((h0 | l0) | false), rset0, fowl0) ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ isPersistFO(n0, fowl0) ∨ ¬ persisted0(l0) ∨ ¬ FO(t0) ∈ fowl0 ∨ t0 ∈ rset0 ∨ FO(t0) ∈ fowl0 -p n0 ⊦ |
FO(t) = fowl0[n1], events((h | l) | false) = e ' + el, fowl0 |W | t = [], t ≠ tid, ((h | l) | t) | false ≠ [], e.R?, absloc(e ' + el, rset, FO(tid) ' + fowl0), allReadsOKInd(mem, persisted, h), isPersistFO(n1, fowl0), persisted(l), FO(t) ∈ fowl0, ¬ FO(t) ∈ fowl0 -p n1, ¬ t ∈ rset, ∀ t0, n0, h0, l0, rset0, mem0, persisted0. FO(t0) ≠ fowl0[n0] ∨ fowl0 |W | t0 ≠ [] ∨ ((h0 | l0) | t0) | false = [] ∨ ¬ absloc(events((h0 | l0) | false), rset0, fowl0) ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ isPersistFO(n0, fowl0) ∨ ¬ persisted0(l0) ∨ ¬ FO(t0) ∈ fowl0 ∨ t0 ∈ rset0 ∨ FO(t0) ∈ fowl0 -p n0 ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a ∈ a0 ' + x ↔ a = a0 ∨ a ∈ x; (s) ⊦ a ' ≠ []; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s) in-14: ⊦ a ' + x = y → a ∈ y; (forward) from specification list ⊦ a + x = a ' + x; (s)
| FO(t) = fowl0[n1], events((h | l) | false) = e ' + el, fowl0 |W | t = [], t ≠ tid, ((h | l) | t) | false ≠ [], e.R?, absloc(e ' + el, rset, FO(tid) ' + fowl0), allReadsOKInd(mem, persisted, h), isPersistFO(n1, fowl0), persisted(l), FO(t) ∈ fowl0, ¬ FO(t) ∈ fowl0 -p n1, ¬ t ∈ rset, ∀ t0, n0, h0, l0, rset0, mem0, persisted0. FO(t0) ≠ fowl0[n0] ∨ fowl0 |W | t0 ≠ [] ∨ ((h0 | l0) | t0) | false = [] ∨ ¬ absloc(events((h0 | l0) | false), rset0, fowl0) ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ isPersistFO(n0, fowl0) ∨ ¬ persisted0(l0) ∨ ¬ FO(t0) ∈ fowl0 ∨ t0 ∈ rset0 ∨ FO(t0) ∈ fowl0 -p n0 ⊦ |
Used simplifier rules: absloc-recW-FO: ⊦ absloc(W(t, l, v) ' + el, rset, FO(t0) ' + fowl) ↔ absloc(W(t, l, v) ' + el, rset, fowl); RWevent freely generated by R, W;; a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ ¬ W(t, l, v).R?; (s) ⊦ allReadsOKInd(mem, persisted, h) ∧ persisted(l) → events((h | l) | false) ≠ R(t0, l0, v0) ' + el; (as)
| FO(t) = fowl0[n1], fowl0 |W | t = [], t ≠ tid, ((h | l) | t) | false ≠ [], absloc(events((h | l) | false), rset, fowl0), allReadsOKInd(mem, persisted, h), isPersistFO(n1, fowl0), persisted(l), FO(t) ∈ fowl0, ¬ FO(t) ∈ fowl0 -p n1, ¬ t ∈ rset, ∀ t0, n0, h0, l0, rset0, mem0, persisted0. FO(t0) ≠ fowl0[n0] ∨ fowl0 |W | t0 ≠ [] ∨ ((h0 | l0) | t0) | false = [] ∨ ¬ absloc(events((h0 | l0) | false), rset0, fowl0) ∨ ¬ allReadsOKInd(mem0, persisted0, h0) ∨ ¬ isPersistFO(n0, fowl0) ∨ ¬ persisted0(l0) ∨ ¬ FO(t0) ∈ fowl0 ∨ t0 ∈ rset0 ∨ FO(t0) ∈ fowl0 -p n0, events((h | l) | false) = [] ∨ ¬ events((h | l) | false).head.R? ⊦ |
Used terms: t, n1, h, l, rset, mem, persisted
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.