| ⊦ firstVolWrite(l, h) < # h → (∃ t, v. h = h.take(firstVolWrite(l, h)) + ((W(t, l, v), false) + h.drop(firstVolWrite(l, h) + 1))) |
firstVolWrite(l, h) < # h ⊦ ∃ t, v. h = h.take(firstVolWrite(l, h)) + ((W(t, l, v), false) + h.drop(firstVolWrite(l, h) + 1))
| 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) < # h ⊦ ∃ t, v. h = h.take(firstVolWrite(l, h)) + (W(t, l, v), false) ' + h.drop(firstVolWrite(l, h) + 1)
Used simplifier rules: ⊦ # x = 0 ↔ x = []; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a + x = a ' + x; (s)
| h ≠ [], firstVolWrite(l, h) < # h ⊦ ∃ t, v. h = h.take(firstVolWrite(l, h)) + (W(t, l, v), false) ' + h.drop(firstVolWrite(l, h) + 1) |
vpe + h0 ≠ [], firstVolWrite(l, vpe + h0) < #(vpe + h0), ∀ l. h0 ≠ [] ∧ firstVolWrite(l, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1)) ⊦ ∃ t, v. vpe + h0 = (vpe + h0).take(firstVolWrite(l, vpe + h0)) + (W(t, l, v), false) ' + (vpe + h0).drop(firstVolWrite(l, vpe + h0) + 1)
Used simplifier rules: List('a) freely generated by [], +;;
| vpe + h0 ≠ [], firstVolWrite(l, vpe + h0) < #(vpe + h0), ∀ l. h0 ≠ [] ∧ firstVolWrite(l, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1)) ⊦ ∃ t, v. vpe + h0 = (vpe + h0).take(firstVolWrite(l, vpe + h0)) + (W(t, l, v), false) ' + (vpe + h0).drop(firstVolWrite(l, vpe + h0) + 1) |
firstVolWrite(l, vpe ' + h0) ≤ # h0, ∀ l. h0 ≠ [] ∧ firstVolWrite(l, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1)) ⊦ ∃ t, v. vpe ' + h0 = (vpe ' + h0).take(firstVolWrite(l, vpe ' + h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, vpe ' + h0))
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ (a ' + x).drop(n + 1) = x.drop(n); (s) ⊦ a + x = a ' + x; (s) ⊦ m < n ↔ ¬ n ≤ m; (ss) ⊦ m < n + 1 ↔ ¬ n < m; (s) ⊦ m +1 = m + 1; (s) ⊦ #(a ' + x) = (# x)+1; (s) ⊦ a ' ≠ []; (s) ⊦ x + y = [] ↔ x = [] ∧ y = []; (s)
| firstVolWrite(l, vpe ' + h0) ≤ # h0, ∀ l. h0 ≠ [] ∧ firstVolWrite(l, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1)) ⊦ ∃ t, v. vpe ' + h0 = (vpe ' + h0).take(firstVolWrite(l, vpe ' + h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, vpe ' + h0)) |
firstVolWrite(l, vpe ' + h0) ≤ # h0, h0 ≠ [] ∧ firstVolWrite(l, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1)), ∀ l. h0 ≠ [] ∧ firstVolWrite(l, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1)) ⊦ ∃ t, v. vpe ' + h0 = (vpe ' + h0).take(firstVolWrite(l, vpe ' + h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, vpe ' + h0))
Used terms: l
| firstVolWrite(l, vpe ' + h0) ≤ # h0, h0 ≠ [] ∧ firstVolWrite(l, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1)), ∀ l. h0 ≠ [] ∧ firstVolWrite(l, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1)) ⊦ ∃ t, v. vpe ' + h0 = (vpe ' + h0).take(firstVolWrite(l, vpe ' + h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, vpe ' + h0)) |
firstVolWrite(l, vpe ' + h0) ≤ # h0, h0 ≠ [] ∧ firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l. h0 ≠ [] ∧ firstVolWrite(l, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1)) ⊦ ∃ t, v. vpe ' + h0 = (vpe ' + h0).take(firstVolWrite(l, vpe ' + h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, vpe ' + h0))
| firstVolWrite(l, vpe ' + h0) ≤ # h0, h0 ≠ [] ∧ firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l. h0 ≠ [] ∧ firstVolWrite(l, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1)) ⊦ ∃ t, v. vpe ' + h0 = (vpe ' + h0).take(firstVolWrite(l, vpe ' + h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, vpe ' + h0)) |
h0 = [], firstVolWrite(l, vpe ' + h0) ≤ # h0, h0 ≠ [] ∧ firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l. h0 ≠ [] ∧ firstVolWrite(l, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1)) ⊦ ∃ t, v. vpe ' + h0 = (vpe ' + h0).take(firstVolWrite(l, vpe ' + h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, vpe ' + h0))
h0 ≠ [], firstVolWrite(l, vpe ' + h0) ≤ # h0, h0 ≠ [] ∧ firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l. h0 ≠ [] ∧ firstVolWrite(l, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1)) ⊦ ∃ t, v. vpe ' + h0 = (vpe ' + h0).take(firstVolWrite(l, vpe ' + h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, vpe ' + h0))
Used formulas: h0 = []
| h0 = [], firstVolWrite(l, vpe ' + h0) ≤ # h0, h0 ≠ [] ∧ firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l. h0 ≠ [] ∧ firstVolWrite(l, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1)) ⊦ ∃ t, v. vpe ' + h0 = (vpe ' + h0).take(firstVolWrite(l, vpe ' + h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, vpe ' + h0)) |
firstVolWrite(l, vpe ') = 0 ⊦ ∃ t, v. vpe = (W(t, l, v), false)
Used simplifier rules: ⊦ a ' = a0 ' ↔ a = a0; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ x + [] = x; (s) ⊦ [] + x = x; (s) ⊦ x.drop(0) = x; (s) ⊦ x.take(0) = []; (s) ⊦ m ≤ 0 ↔ m = 0; (s) ⊦ # [] = 0; (s)
| firstVolWrite(l, vpe ') = 0 ⊦ ∃ t, v. vpe = (W(t, l, v), false) |
⊦ firstVolWrite(l, h) = h.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)
vpe '.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) = 0 ⊦ ∃ t, v. vpe = (W(t, l, v), false)
Used terms: l, vpe '
| ⊦ firstVolWrite(l, h) = h.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) |
| vpe '.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) = 0 ⊦ ∃ t, v. vpe = (W(t, l, v), false) |
vpe._1.W? ⊦ vpe._2, ∃ t, v. vpe = (W(t, vpe._1.l, v), false)
Used simplifier rules: ⊦ a '.indexWhere(p) = (p(a) ⊃ 0;1); (s)
| vpe._1.W? ⊦ vpe._2, ∃ t, v. vpe = (W(t, vpe._1.l, v), false) |
¬ boolvar, vpe = (e, boolvar), e.W? ⊦ ∃ t, v. vpe = (W(t, e.l, v), false)
Used terms: e, boolvar
| ¬ boolvar, vpe = (e, boolvar), e.W? ⊦ ∃ t, v. vpe = (W(t, e.l, v), false) |
e.W? ⊦ ∃ t, v. e = W(t, e.l, v)
| e.W? ⊦ ∃ t, v. e = W(t, e.l, v) |
⊦ e.W? ↔ (∃ t, l, v. e = W(t, l, v))
∃ t, l, v. e = W(t, l, v) ⊦ ∃ t, v. e = W(t, e.l, v)
Used terms: e
| ⊦ e.W? ↔ (∃ t, l, v. e = W(t, l, v)) |
| ∃ t, l, v. e = W(t, l, v) ⊦ ∃ t, v. e = W(t, e.l, v) |
⊦ ∃ t0, v0. W(t, l, v) = W(t0, l, v0)
Used simplifier rules: ⊦ W(t, l, v).l = l; (s)
| ⊦ ∃ t0, v0. W(t, l, v) = W(t0, l, v0) |
Used terms: t, v
| h0 ≠ [], firstVolWrite(l, vpe ' + h0) ≤ # h0, h0 ≠ [] ∧ firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l. h0 ≠ [] ∧ firstVolWrite(l, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1)) ⊦ ∃ t, v. vpe ' + h0 = (vpe ' + h0).take(firstVolWrite(l, vpe ' + h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, vpe ' + h0)) |
h0 ≠ [], firstVolWrite(l, vpe ' + h0) ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t, v. vpe ' + h0 = (vpe ' + h0).take(firstVolWrite(l, vpe ' + h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, vpe ' + h0))
| h0 ≠ [], firstVolWrite(l, vpe ' + h0) ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t, v. vpe ' + h0 = (vpe ' + h0).take(firstVolWrite(l, vpe ' + h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, vpe ' + h0)) |
vpe = (e, b), h0 ≠ [], firstVolWrite(l, vpe ' + h0) ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t, v. vpe ' + h0 = (vpe ' + h0).take(firstVolWrite(l, vpe ' + h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, vpe ' + h0))
| vpe = (e, b), h0 ≠ [], firstVolWrite(l, vpe ' + h0) ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t, v. vpe ' + h0 = (vpe ' + h0).take(firstVolWrite(l, vpe ' + h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, vpe ' + h0)) |
h0 ≠ [], firstVolWrite(l, (e, b) ' + h0) ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t, v. (e, b) ' + h0 = ((e, b) ' + h0).take(firstVolWrite(l, (e, b) ' + h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, (e, b) ' + h0))
| h0 ≠ [], firstVolWrite(l, (e, b) ' + h0) ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t, v. (e, b) ' + h0 = ((e, b) ' + h0).take(firstVolWrite(l, (e, b) ' + h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, (e, b) ' + h0)) |
e = R(t0, l1, v0), h0 ≠ [], firstVolWrite(l, (e, b) ' + h0) ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t, v. (e, b) ' + h0 = ((e, b) ' + h0).take(firstVolWrite(l, (e, b) ' + h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, (e, b) ' + h0))
e = W(t0, l1, v0), h0 ≠ [], firstVolWrite(l, (e, b) ' + h0) ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t, v. (e, b) ' + h0 = ((e, b) ' + h0).take(firstVolWrite(l, (e, b) ' + h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, (e, b) ' + h0))
Used simplifier rules: RWevent freely generated by R, W;;
| e = R(t0, l1, v0), h0 ≠ [], firstVolWrite(l, (e, b) ' + h0) ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t, v. (e, b) ' + h0 = ((e, b) ' + h0).take(firstVolWrite(l, (e, b) ' + h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, (e, b) ' + h0)) |
h0 ≠ [], firstVolWrite(l, (R(t0, l1, v0), b) ' + h0) ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t, v. (R(t0, l1, v0), b) ' + h0 = ((R(t0, l1, v0), b) ' + h0).take(firstVolWrite(l, (R(t0, l1, v0), b) ' + h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, (R(t0, l1, v0), b) ' + h0))
| h0 ≠ [], firstVolWrite(l, (R(t0, l1, v0), b) ' + h0) ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t, v. (R(t0, l1, v0), b) ' + h0 = ((R(t0, l1, v0), b) ' + h0).take(firstVolWrite(l, (R(t0, l1, v0), b) ' + h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, (R(t0, l1, v0), b) ' + h0)) |
⊦ firstVolWrite(l, h) = h.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)
h0 ≠ [], ((R(t0, l1, v0), b) ' + h0).indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t, v. (R(t0, l1, v0), b) ' + h0 = ((R(t0, l1, v0), b) ' + h0).take(((R(t0, l1, v0), b) ' + h0).indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) + (W(t, l, v), false) ' + h0.drop(((R(t0, l1, v0), b) ' + h0).indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2))
Used terms: l, (R(t0, l1, v0), b) ' + h0
| ⊦ firstVolWrite(l, h) = h.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) |
| h0 ≠ [], ((R(t0, l1, v0), b) ' + h0).indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t, v. (R(t0, l1, v0), b) ' + h0 = ((R(t0, l1, v0), b) ' + h0).take(((R(t0, l1, v0), b) ' + h0).indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) + (W(t, l, v), false) ' + h0.drop(((R(t0, l1, v0), b) ' + h0).indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) |
⊦ ¬ p(a) → (a ' + x).indexWhere(p) = 1 + x.indexWhere(p)
h0 ≠ [], 1 + h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t, v. (R(t0, l1, v0), b) ' + h0 = ((R(t0, l1, v0), b) ' + h0).take(1 + h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) + (W(t, l, v), false) ' + h0.drop(1 + h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)), (R(t0, l1, v0), b)._1.W? ∧ (R(t0, l1, v0), b)._1.l = l ∧ ¬ (R(t0, l1, v0), b)._2
Used simplifier rules: ⊦ R(t, l, v).l = l; (s) ⊦ ¬ R(t, l, v).W?; (s) a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2, (R(t0, l1, v0), b), h0
| ⊦ ¬ p(a) → (a ' + x).indexWhere(p) = 1 + x.indexWhere(p) |
| h0 ≠ [], 1 + h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t, v. (R(t0, l1, v0), b) ' + h0 = ((R(t0, l1, v0), b) ' + h0).take(1 + h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) + (W(t, l, v), false) ' + h0.drop(1 + h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)), (R(t0, l1, v0), b)._1.W? ∧ (R(t0, l1, v0), b)._1.l = l ∧ ¬ (R(t0, l1, v0), b)._2 |
h0 ≠ [], h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) < # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t1, v1. h0 = h0.take(h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) + (W(t1, l, v1), false) ' + h0.drop(1 + h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2))
Used simplifier rules: ⊦ # x = 0 ↔ x = []; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ # x = # z → (x + y = z + y0 ↔ x = z ∧ y = y0); (ws) 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).take(n + 1) = a + x.take(n); (s) ⊦ ¬ R(t, l, v).W?; (s) ⊦ m + 1 ≤ n ↔ m < n; (s)
| h0 ≠ [], h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) < # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t1, v1. h0 = h0.take(h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) + (W(t1, l, v1), false) ' + h0.drop(1 + h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) |
⊦ firstVolWrite(l, h) = h.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)
h0 ≠ [], h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) < # h0, h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) < # h0 → h0 = h0.take(h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) + (W(t, l, v), false) ' + h0.drop(h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t1, v1. h0 = h0.take(h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) + (W(t1, l, v1), false) ' + h0.drop(1 + h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2))
Used terms: l, h0
| ⊦ firstVolWrite(l, h) = h.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) |
| h0 ≠ [], h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) < # h0, h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) < # h0 → h0 = h0.take(h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) + (W(t, l, v), false) ' + h0.drop(h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t1, v1. h0 = h0.take(h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) + (W(t1, l, v1), false) ' + h0.drop(1 + h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) |
h0 = h0.take(h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) + (W(t, l, v), false) ' + h0.drop(h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) + 1), h0 ≠ [], h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) < # h0, ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t1, v1. h0 = h0.take(h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) + (W(t1, l, v1), false) ' + h0.drop(1 + h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2))
| h0 = h0.take(h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) + (W(t, l, v), false) ' + h0.drop(h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) + 1), h0 ≠ [], h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) < # h0, ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t1, v1. h0 = h0.take(h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) + (W(t1, l, v1), false) ' + h0.drop(1 + h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) |
Used simplifier rules: c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: t, v
| e = W(t0, l1, v0), h0 ≠ [], firstVolWrite(l, (e, b) ' + h0) ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t, v. (e, b) ' + h0 = ((e, b) ' + h0).take(firstVolWrite(l, (e, b) ' + h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, (e, b) ' + h0)) |
h0 ≠ [], firstVolWrite(l, (W(t0, l1, v0), b) ' + h0) ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t, v. (W(t0, l1, v0), b) ' + h0 = ((W(t0, l1, v0), b) ' + h0).take(firstVolWrite(l, (W(t0, l1, v0), b) ' + h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, (W(t0, l1, v0), b) ' + h0))
| h0 ≠ [], firstVolWrite(l, (W(t0, l1, v0), b) ' + h0) ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t, v. (W(t0, l1, v0), b) ' + h0 = ((W(t0, l1, v0), b) ' + h0).take(firstVolWrite(l, (W(t0, l1, v0), b) ' + h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, (W(t0, l1, v0), b) ' + h0)) |
¬ b, l1 = l, h0 ≠ [], firstVolWrite(l, (W(t0, l1, v0), b) ' + h0) ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t, v. (W(t0, l1, v0), b) ' + h0 = ((W(t0, l1, v0), b) ' + h0).take(firstVolWrite(l, (W(t0, l1, v0), b) ' + h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, (W(t0, l1, v0), b) ' + h0))
h0 ≠ [], firstVolWrite(l, (W(t0, l1, v0), b) ' + h0) ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t, v. (W(t0, l1, v0), b) ' + h0 = ((W(t0, l1, v0), b) ' + h0).take(firstVolWrite(l, (W(t0, l1, v0), b) ' + h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, (W(t0, l1, v0), b) ' + h0)), ¬ b ∧ l1 = l
Used formulas: ¬ b ∧ l1 = l
| ¬ b, l1 = l, h0 ≠ [], firstVolWrite(l, (W(t0, l1, v0), b) ' + h0) ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t, v. (W(t0, l1, v0), b) ' + h0 = ((W(t0, l1, v0), b) ' + h0).take(firstVolWrite(l, (W(t0, l1, v0), b) ' + h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, (W(t0, l1, v0), b) ' + h0)) |
h0 ≠ [], firstVolWrite(l, (W(t0, l, v0), false) ' + h0) ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t, v. (W(t0, l, v0), false) ' + h0 = ((W(t0, l, v0), false) ' + h0).take(firstVolWrite(l, (W(t0, l, v0), false) ' + h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, (W(t0, l, v0), false) ' + h0))
| h0 ≠ [], firstVolWrite(l, (W(t0, l, v0), false) ' + h0) ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t, v. (W(t0, l, v0), false) ' + h0 = ((W(t0, l, v0), false) ' + h0).take(firstVolWrite(l, (W(t0, l, v0), false) ' + h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, (W(t0, l, v0), false) ' + h0)) |
⊦ firstVolWrite(l, h) = h.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)
h0 ≠ [], ((W(t0, l, v0), false) ' + h0).indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t, v. (W(t0, l, v0), false) ' + h0 = ((W(t0, l, v0), false) ' + h0).take(((W(t0, l, v0), false) ' + h0).indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) + (W(t, l, v), false) ' + h0.drop(((W(t0, l, v0), false) ' + h0).indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2))
Used terms: l, (W(t0, l, v0), false) ' + h0
| ⊦ firstVolWrite(l, h) = h.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) |
| h0 ≠ [], ((W(t0, l, v0), false) ' + h0).indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t, v. (W(t0, l, v0), false) ' + h0 = ((W(t0, l, v0), false) ' + h0).take(((W(t0, l, v0), false) ' + h0).indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) + (W(t, l, v), false) ' + h0.drop(((W(t0, l, v0), false) ' + h0).indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) |
⊦ p(a) → (a ' + x).indexWhere(p) = 0
(W(t0, l, v0), false)._1.l = l, h0 ≠ [], (W(t0, l, v0), false)._1.W?, 0 ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ (W(t0, l, v0), false)._2, ∃ t, v. (W(t0, l, v0), false) ' + h0 = ((W(t0, l, v0), false) ' + h0).take(0) + (W(t, l, v), false) ' + h0.drop(0)
Used simplifier rules: ⊦ W(t, l, v).W?; (s) ⊦ W(t, l, v).l = l; (s) a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2, (W(t0, l, v0), false), h0
| ⊦ p(a) → (a ' + x).indexWhere(p) = 0 |
| (W(t0, l, v0), false)._1.l = l, h0 ≠ [], (W(t0, l, v0), false)._1.W?, 0 ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ (W(t0, l, v0), false)._2, ∃ t, v. (W(t0, l, v0), false) ' + h0 = ((W(t0, l, v0), false) ' + h0).take(0) + (W(t, l, v), false) ' + h0.drop(0) |
h0 ≠ [], firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t1, v1. W(t0, l, v0) = W(t1, l, v1)
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a ' = a0 ' ↔ a = a0; (s) ⊦ # y = # y0 → (x + y = z + y0 ↔ x = z ∧ y = y0); (ws) ⊦ [] + x = x; (s) ⊦ x.drop(0) = x; (s) ⊦ x.take(0) = []; (s) ⊦ W(t, l, v).W?; (s) ⊦ 0 ≤ m; (s) ⊦ W(t, l, v).l = l; (s)
| h0 ≠ [], firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t1, v1. W(t0, l, v0) = W(t1, l, v1) |
Used terms: t0, v0
| h0 ≠ [], firstVolWrite(l, (W(t0, l1, v0), b) ' + h0) ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t, v. (W(t0, l1, v0), b) ' + h0 = ((W(t0, l1, v0), b) ' + h0).take(firstVolWrite(l, (W(t0, l1, v0), b) ' + h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, (W(t0, l1, v0), b) ' + h0)), ¬ b ∧ l1 = l |
⊦ firstVolWrite(l, h) = h.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)
h0 ≠ [], ((W(t0, l1, v0), b) ' + h0).indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t, v. (W(t0, l1, v0), b) ' + h0 = ((W(t0, l1, v0), b) ' + h0).take(((W(t0, l1, v0), b) ' + h0).indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) + (W(t, l, v), false) ' + h0.drop(((W(t0, l1, v0), b) ' + h0).indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)), ¬ b ∧ l1 = l
Used terms: l, (W(t0, l1, v0), b) ' + h0
| ⊦ firstVolWrite(l, h) = h.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) |
| h0 ≠ [], ((W(t0, l1, v0), b) ' + h0).indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t, v. (W(t0, l1, v0), b) ' + h0 = ((W(t0, l1, v0), b) ' + h0).take(((W(t0, l1, v0), b) ' + h0).indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) + (W(t, l, v), false) ' + h0.drop(((W(t0, l1, v0), b) ' + h0).indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)), ¬ b ∧ l1 = l |
⊦ ¬ p(a) → (a ' + x).indexWhere(p) = 1 + x.indexWhere(p)
h0 ≠ [], 1 + h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t, v. (W(t0, l1, v0), b) ' + h0 = ((W(t0, l1, v0), b) ' + h0).take(1 + h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) + (W(t, l, v), false) ' + h0.drop(1 + h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)), ¬ b ∧ l1 = l, (W(t0, l1, v0), b)._1.W? ∧ (W(t0, l1, v0), b)._1.l = l ∧ ¬ (W(t0, l1, v0), b)._2
Used simplifier rules: ⊦ W(t, l, v).W?; (s) ⊦ W(t, l, v).l = l; (s) a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2, (W(t0, l1, v0), b), h0
| ⊦ ¬ p(a) → (a ' + x).indexWhere(p) = 1 + x.indexWhere(p) |
| h0 ≠ [], 1 + h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) ≤ # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t, v. (W(t0, l1, v0), b) ' + h0 = ((W(t0, l1, v0), b) ' + h0).take(1 + h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) + (W(t, l, v), false) ' + h0.drop(1 + h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)), ¬ b ∧ l1 = l, (W(t0, l1, v0), b)._1.W? ∧ (W(t0, l1, v0), b)._1.l = l ∧ ¬ (W(t0, l1, v0), b)._2 |
h0 ≠ [], h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) < # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t1, v1. h0 = h0.take(h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) + (W(t1, l, v1), false) ' + h0.drop(1 + h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)), l1 = l ∧ ¬ b, ¬ b ∧ l1 = l
Used simplifier rules: ⊦ # x = 0 ↔ x = []; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ # x = # z → (x + y = z + y0 ↔ x = z ∧ y = y0); (ws) 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).take(n + 1) = a + x.take(n); (s) ⊦ W(t, l, v).l = l; (s) ⊦ W(t, l, v).W?; (s) ⊦ m + 1 ≤ n ↔ m < n; (s)
| h0 ≠ [], h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) < # h0, firstVolWrite(l, h0) < # h0 → h0 = h0.take(firstVolWrite(l, h0)) + (W(t, l, v), false) ' + h0.drop(firstVolWrite(l, h0) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t1, v1. h0 = h0.take(h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) + (W(t1, l, v1), false) ' + h0.drop(1 + h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)), l1 = l ∧ ¬ b, ¬ b ∧ l1 = l |
⊦ firstVolWrite(l, h) = h.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)
h0 ≠ [], h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) < # h0, h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) < # h0 → h0 = h0.take(h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) + (W(t, l, v), false) ' + h0.drop(h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t1, v1. h0 = h0.take(h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) + (W(t1, l, v1), false) ' + h0.drop(1 + h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)), ¬ b ∧ l1 = l, l1 = l ∧ ¬ b
Used terms: l, h0
| ⊦ firstVolWrite(l, h) = h.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) |
| h0 ≠ [], h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) < # h0, h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) < # h0 → h0 = h0.take(h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) + (W(t, l, v), false) ' + h0.drop(h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) + 1), ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t1, v1. h0 = h0.take(h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) + (W(t1, l, v1), false) ' + h0.drop(1 + h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)), ¬ b ∧ l1 = l, l1 = l ∧ ¬ b |
h0 = h0.take(h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) + (W(t, l, v), false) ' + h0.drop(h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) + 1), h0 ≠ [], h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) < # h0, ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t1, v1. h0 = h0.take(h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) + (W(t1, l, v1), false) ' + h0.drop(1 + h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)), l1 = l ∧ ¬ b, ¬ b ∧ l1 = l
| h0 = h0.take(h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) + (W(t, l, v), false) ' + h0.drop(h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) + 1), h0 ≠ [], h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2) < # h0, ∀ l0. firstVolWrite(l0, h0) < # h0 → (∃ t, v. h0 = h0.take(firstVolWrite(l0, h0)) + (W(t, l0, v), false) ' + h0.drop(firstVolWrite(l0, h0) + 1)) ⊦ ∃ t1, v1. h0 = h0.take(h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)) + (W(t1, l, v1), false) ' + h0.drop(1 + h0.indexWhere(λ vpe. vpe._1.W? ∧ vpe._1.l = l ∧ ¬ vpe._2)), l1 = l ∧ ¬ b, ¬ b ∧ l1 = l |
Used simplifier rules: c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: t, 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.