| ⊦ firstPersistW(p(l)) < # p(l) → rely(t, p, p(l := p(l) -p firstPersistW(p(l)))) |
firstPersistW(p(l)) < # p(l), ¬ rely(t, p, p(l := p(l) -p firstPersistW(p(l)))) ⊦
| firstPersistW(p(l)) < # p(l), ¬ rely(t, p, p(l := p(l) -p firstPersistW(p(l)))) ⊦ |
p(l) ≠ [], p(l).indexWhere(.W?) < # p(l) ⊦ ∃ fowl1, fowl2. (∃ fowl2, fowl3, fowl4, fowl5. p(l0) = fowl2 + fowl3 + fowl4 ∧ fowl5 ⊆ fowl3 |FO ∧ fowl1 = fowl5 + fowl4) ∧ (l = l0 ⊃ p(l0) -p p(l0).indexWhere(.W?);p(l0)) = fowl1 + fowl2 ∧ fowl2 | t = []
Used simplifier rules: firstPersistW: ⊦ firstPersistW(fowl) = fowl.indexWhere(.W?); allrely-def: ⊦ rely(t, p, p0) ↔ (∀ l. rely(t, p(l), p0(l))); rely-def: ⊦ rely(t, fowl, fowl0) ↔ (∃ fowl1, fowl2. fowl ⊒W fowl1 ∧ fowl0 = fowl1 + fowl2 ∧ fowl2 | t = []); weak-write-postfix: ⊦ fowl0 ⊒W fowl1 ↔ (∃ fowl2, fowl3, fowl4, fowl5. fowl0 = fowl2 + fowl3 + fowl4 ∧ fowl5 ⊆ fowl3 |FO ∧ fowl1 = fowl5 + fowl4); ⊦ # x = 0 ↔ x = []; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic
| p(l) ≠ [], p(l).indexWhere(.W?) < # p(l) ⊦ ∃ fowl1, fowl2. (∃ fowl2, fowl3, fowl4, fowl5. p(l0) = fowl2 + fowl3 + fowl4 ∧ fowl5 ⊆ fowl3 |FO ∧ fowl1 = fowl5 + fowl4) ∧ (l = l0 ⊃ p(l0) -p p(l0).indexWhere(.W?);p(l0)) = fowl1 + fowl2 ∧ fowl2 | t = [] |
l = l0, p(l) ≠ [], p(l).indexWhere(.W?) < # p(l) ⊦ ∃ fowl1, fowl2. (∃ fowl2, fowl3, fowl4, fowl5. p(l0) = fowl2 + fowl3 + fowl4 ∧ fowl5 ⊆ fowl3 |FO ∧ fowl1 = fowl5 + fowl4) ∧ (l = l0 ⊃ p(l0) -p p(l0).indexWhere(.W?);p(l0)) = fowl1 + fowl2 ∧ fowl2 | t = []
l ≠ l0, p(l) ≠ [], p(l).indexWhere(.W?) < # p(l) ⊦ ∃ fowl1, fowl2. (∃ fowl2, fowl3, fowl4, fowl5. p(l0) = fowl2 + fowl3 + fowl4 ∧ fowl5 ⊆ fowl3 |FO ∧ fowl1 = fowl5 + fowl4) ∧ (l = l0 ⊃ p(l0) -p p(l0).indexWhere(.W?);p(l0)) = fowl1 + fowl2 ∧ fowl2 | t = []
Used formulas: l = l0
| l = l0, p(l) ≠ [], p(l).indexWhere(.W?) < # p(l) ⊦ ∃ fowl1, fowl2. (∃ fowl2, fowl3, fowl4, fowl5. p(l0) = fowl2 + fowl3 + fowl4 ∧ fowl5 ⊆ fowl3 |FO ∧ fowl1 = fowl5 + fowl4) ∧ (l = l0 ⊃ p(l0) -p p(l0).indexWhere(.W?);p(l0)) = fowl1 + fowl2 ∧ fowl2 | t = [] |
p(l0) ≠ [], p(l0).indexWhere(.W?) < # p(l0) ⊦ ∃ fowl1, fowl2. (∃ fowl2, fowl3, fowl4, fowl5. p(l0) = fowl2 + fowl3 + fowl4 ∧ fowl5 ⊆ fowl3 |FO ∧ fowl1 = fowl5 + fowl4) ∧ p(l0) -p p(l0).indexWhere(.W?) = fowl1 + fowl2 ∧ fowl2 | t = []
Used simplifier rules: ⊦ # x = 0 ↔ x = []; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic
| p(l0) ≠ [], p(l0).indexWhere(.W?) < # p(l0) ⊦ ∃ fowl1, fowl2. (∃ fowl2, fowl3, fowl4, fowl5. p(l0) = fowl2 + fowl3 + fowl4 ∧ fowl5 ⊆ fowl3 |FO ∧ fowl1 = fowl5 + fowl4) ∧ p(l0) -p p(l0).indexWhere(.W?) = fowl1 + fowl2 ∧ fowl2 | t = [] |
p(l0) ≠ [], p(l0).indexWhere(.W?) < # p(l0) ⊦ (∃ fowl2, fowl3, fowl4, fowl5. p(l0) = fowl2 + fowl3 + fowl4 ∧ fowl5 ⊆ fowl3 |FO ∧ p(l0) -p p(l0).indexWhere(.W?) = fowl5 + fowl4) ∧ p(l0) -p p(l0).indexWhere(.W?) = (p(l0) -p p(l0).indexWhere(.W?)) + [] ∧ [] | t = []
Used terms: p(l0) -p p(l0).indexWhere(.W?), []
| p(l0) ≠ [], p(l0).indexWhere(.W?) < # p(l0) ⊦ (∃ fowl2, fowl3, fowl4, fowl5. p(l0) = fowl2 + fowl3 + fowl4 ∧ fowl5 ⊆ fowl3 |FO ∧ p(l0) -p p(l0).indexWhere(.W?) = fowl5 + fowl4) ∧ p(l0) -p p(l0).indexWhere(.W?) = (p(l0) -p p(l0).indexWhere(.W?)) + [] ∧ [] | t = [] |
p(l0) ≠ [], p(l0).indexWhere(.W?) < # p(l0) ⊦ ∃ fowl2, fowl3, fowl4, fowl5. p(l0) = fowl2 + fowl3 + fowl4 ∧ fowl5 ⊆ fowl3 |FO ∧ p(l0) -p p(l0).indexWhere(.W?) = fowl5 + fowl4
Used simplifier rules: ⊦ [] | t = []; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ x + [] = x; (s)
| p(l0) ≠ [], p(l0).indexWhere(.W?) < # p(l0) ⊦ ∃ fowl2, fowl3, fowl4, fowl5. p(l0) = fowl2 + fowl3 + fowl4 ∧ fowl5 ⊆ fowl3 |FO ∧ p(l0) -p p(l0).indexWhere(.W?) = fowl5 + fowl4 |
p(l0) ≠ [], p(l0).indexWhere(.W?) < # p(l0) ⊦ p(l0) = [] + p(l0).take(p(l0).indexWhere(.W?) + 1) + p(l0).drop(p(l0).indexWhere(.W?) + 1) ∧ p(l0).take(p(l0).indexWhere(.W?)) ⊆ (p(l0).take(p(l0).indexWhere(.W?) + 1))|FO ∧ p(l0) -p p(l0).indexWhere(.W?) = p(l0).take(p(l0).indexWhere(.W?)) + p(l0).drop(p(l0).indexWhere(.W?) + 1)
Used terms: [], p(l0).take(p(l0).indexWhere(.W?) + 1), p(l0).drop(p(l0).indexWhere(.W?) + 1), p(l0).take(p(l0).indexWhere(.W?))
| p(l0) ≠ [], p(l0).indexWhere(.W?) < # p(l0) ⊦ p(l0) = [] + p(l0).take(p(l0).indexWhere(.W?) + 1) + p(l0).drop(p(l0).indexWhere(.W?) + 1) ∧ p(l0).take(p(l0).indexWhere(.W?)) ⊆ (p(l0).take(p(l0).indexWhere(.W?) + 1))|FO ∧ p(l0) -p p(l0).indexWhere(.W?) = p(l0).take(p(l0).indexWhere(.W?)) + p(l0).drop(p(l0).indexWhere(.W?) + 1) |
p(l0) ≠ [], p(l0).indexWhere(.W?) < # p(l0) ⊦ p(l0) = p(l0).take(p(l0).indexWhere(.W?) + 1) + p(l0).drop(p(l0).indexWhere(.W?) + 1) ∧ p(l0).take(p(l0).indexWhere(.W?)) ⊆ (p(l0).take(p(l0).indexWhere(.W?) + 1))|FO ∧ p(l0) -p p(l0).indexWhere(.W?) = p(l0).take(p(l0).indexWhere(.W?)) + p(l0).drop(p(l0).indexWhere(.W?) + 1)
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ [] + x = x; (s)
| p(l0) ≠ [], p(l0).indexWhere(.W?) < # p(l0) ⊦ p(l0) = p(l0).take(p(l0).indexWhere(.W?) + 1) + p(l0).drop(p(l0).indexWhere(.W?) + 1) ∧ p(l0).take(p(l0).indexWhere(.W?)) ⊆ (p(l0).take(p(l0).indexWhere(.W?) + 1))|FO ∧ p(l0) -p p(l0).indexWhere(.W?) = p(l0).take(p(l0).indexWhere(.W?)) + p(l0).drop(p(l0).indexWhere(.W?) + 1) |
⊦ n ≤ # x → x.take(n) + x.drop(n) = x
p(l0) ≠ [], p(l0).indexWhere(.W?) < # p(l0), p(l0).indexWhere(.W?) + 1 ≤ # p(l0) ⊦ p(l0) = p(l0) ∧ p(l0).take(p(l0).indexWhere(.W?)) ⊆ (p(l0).take(p(l0).indexWhere(.W?) + 1))|FO ∧ p(l0) -p p(l0).indexWhere(.W?) = p(l0).take(p(l0).indexWhere(.W?)) + p(l0).drop(p(l0).indexWhere(.W?) + 1)
Used simplifier rules: ⊦ m + 1 ≤ n ↔ m < n; (s) ⊦ m < n ↔ ¬ n ≤ m; (ss) ⊦ m < n → (n ≤ m ↔ false); (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic Used terms: p(l0), p(l0).indexWhere(.W?) + 1
| ⊦ n ≤ # x → x.take(n) + x.drop(n) = x |
| p(l0) ≠ [], p(l0).indexWhere(.W?) < # p(l0), p(l0).indexWhere(.W?) + 1 ≤ # p(l0) ⊦ p(l0) = p(l0) ∧ p(l0).take(p(l0).indexWhere(.W?)) ⊆ (p(l0).take(p(l0).indexWhere(.W?) + 1))|FO ∧ p(l0) -p p(l0).indexWhere(.W?) = p(l0).take(p(l0).indexWhere(.W?)) + p(l0).drop(p(l0).indexWhere(.W?) + 1) |
p(l0) ≠ [], p(l0).indexWhere(.W?) < # p(l0) ⊦ p(l0).take(p(l0).indexWhere(.W?)) ⊆ (p(l0).take(p(l0).indexWhere(.W?) + 1))|FO ∧ p(l0) -p p(l0).indexWhere(.W?) = p(l0).take(p(l0).indexWhere(.W?)) + p(l0).drop(p(l0).indexWhere(.W?) + 1)
Used simplifier rules: c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ m + 1 ≤ n ↔ m < n; (s)
| p(l0) ≠ [], p(l0).indexWhere(.W?) < # p(l0) ⊦ p(l0).take(p(l0).indexWhere(.W?)) ⊆ (p(l0).take(p(l0).indexWhere(.W?) + 1))|FO ∧ p(l0) -p p(l0).indexWhere(.W?) = p(l0).take(p(l0).indexWhere(.W?)) + p(l0).drop(p(l0).indexWhere(.W?) + 1) |
⊦ n < # x → x -p n = x.take(n) + x.drop(n + 1)
p(l0) ≠ [], p(l0).indexWhere(.W?) < # p(l0) ⊦ p(l0).take(p(l0).indexWhere(.W?)) ⊆ (p(l0).take(p(l0).indexWhere(.W?) + 1))|FO ∧ p(l0).take(p(l0).indexWhere(.W?)) + p(l0).drop(p(l0).indexWhere(.W?) + 1) = p(l0).take(p(l0).indexWhere(.W?)) + p(l0).drop(p(l0).indexWhere(.W?) + 1)
Used terms: p(l0), p(l0).indexWhere(.W?)
| ⊦ n < # x → x -p n = x.take(n) + x.drop(n + 1) |
| p(l0) ≠ [], p(l0).indexWhere(.W?) < # p(l0) ⊦ p(l0).take(p(l0).indexWhere(.W?)) ⊆ (p(l0).take(p(l0).indexWhere(.W?) + 1))|FO ∧ p(l0).take(p(l0).indexWhere(.W?)) + p(l0).drop(p(l0).indexWhere(.W?) + 1) = p(l0).take(p(l0).indexWhere(.W?)) + p(l0).drop(p(l0).indexWhere(.W?) + 1) |
⊦ n ≠ 0 ∧ n ≤ # x → x.take(n) = x.take(n -1) + x[n -1]
p(l0).indexWhere(.W?) + 1 ≠ 0, p(l0) ≠ [], p(l0).indexWhere(.W?) < # p(l0), p(l0).indexWhere(.W?) + 1 ≤ # p(l0) ⊦ p(l0).take(p(l0).indexWhere(.W?)) ⊆ (p(l0).take((p(l0).indexWhere(.W?) + 1)-1) + p(l0)[(p(l0).indexWhere(.W?) + 1)-1])|FO ∧ p(l0).take(p(l0).indexWhere(.W?)) + p(l0).drop(p(l0).indexWhere(.W?) + 1) = p(l0).take(p(l0).indexWhere(.W?)) + p(l0).drop(p(l0).indexWhere(.W?) + 1)
Used simplifier rules: ⊦ m + 1 ≠ 0; (s) ⊦ m + 1 ≤ n ↔ m < n; (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic Used terms: p(l0), p(l0).indexWhere(.W?) + 1
| ⊦ n ≠ 0 ∧ n ≤ # x → x.take(n) = x.take(n -1) + x[n -1] |
| p(l0).indexWhere(.W?) + 1 ≠ 0, p(l0) ≠ [], p(l0).indexWhere(.W?) < # p(l0), p(l0).indexWhere(.W?) + 1 ≤ # p(l0) ⊦ p(l0).take(p(l0).indexWhere(.W?)) ⊆ (p(l0).take((p(l0).indexWhere(.W?) + 1)-1) + p(l0)[(p(l0).indexWhere(.W?) + 1)-1])|FO ∧ p(l0).take(p(l0).indexWhere(.W?)) + p(l0).drop(p(l0).indexWhere(.W?) + 1) = p(l0).take(p(l0).indexWhere(.W?)) + p(l0).drop(p(l0).indexWhere(.W?) + 1) |
p(l0) ≠ [], p(l0).indexWhere(.W?) < # p(l0), ¬ p(l0).take(p(l0).indexWhere(.W?)) ⊆ (p(l0).take(p(l0).indexWhere(.W?)))|FO + p(l0)[p(l0).indexWhere(.W?)] ' |FO ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (fowl + fowl0)|FO = fowl |FO + fowl0 |FO; (s) ⊦ x + a = x + a '; (s) c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ (m + 1)-1 = m; (s) ⊦ m + 1 ≤ n ↔ m < n; (s) ⊦ m + 1 ≠ 0; (s)
| p(l0) ≠ [], p(l0).indexWhere(.W?) < # p(l0), ¬ p(l0).take(p(l0).indexWhere(.W?)) ⊆ (p(l0).take(p(l0).indexWhere(.W?)))|FO + p(l0)[p(l0).indexWhere(.W?)] ' |FO ⊦ |
p(l0)[p(l0).indexWhere(.W?)] = FO(t), p(l0) ≠ [], p(l0).indexWhere(.W?) < # p(l0), ¬ p(l0).take(p(l0).indexWhere(.W?)) ⊆ (p(l0).take(p(l0).indexWhere(.W?)))|FO + p(l0)[p(l0).indexWhere(.W?)] ' |FO ⊦
p(l0)[p(l0).indexWhere(.W?)] = W(v, t), p(l0) ≠ [], p(l0).indexWhere(.W?) < # p(l0), ¬ p(l0).take(p(l0).indexWhere(.W?)) ⊆ (p(l0).take(p(l0).indexWhere(.W?)))|FO + p(l0)[p(l0).indexWhere(.W?)] ' |FO ⊦
Used simplifier rules: FOW freely generated by FO, W;;
| p(l0)[p(l0).indexWhere(.W?)] = FO(t), p(l0) ≠ [], p(l0).indexWhere(.W?) < # p(l0), ¬ p(l0).take(p(l0).indexWhere(.W?)) ⊆ (p(l0).take(p(l0).indexWhere(.W?)))|FO + p(l0)[p(l0).indexWhere(.W?)] ' |FO ⊦ |
p(l0)[p(l0).indexWhere(.W?)] = FO(t), p(l0) ≠ [], p(l0).indexWhere(.W?) < # p(l0), ¬ p(l0).take(p(l0).indexWhere(.W?)) ⊆ (p(l0).take(p(l0).indexWhere(.W?)))|FO + FO(t) ' ⊦
Used simplifier rules: ⊦ FO(t) ' |FO = FO(t) '; (s)
| p(l0)[p(l0).indexWhere(.W?)] = FO(t), p(l0) ≠ [], p(l0).indexWhere(.W?) < # p(l0), ¬ p(l0).take(p(l0).indexWhere(.W?)) ⊆ (p(l0).take(p(l0).indexWhere(.W?)))|FO + FO(t) ' ⊦ |
⊦ firstPersistW(fowl) < # fowl → fowl[firstPersistW(fowl)].W?
Used simplifier rules: firstPersistW: ⊦ firstPersistW(fowl) = fowl.indexWhere(.W?); ⊦ ¬ FO(tid).W?; (s) Used terms: p(l0)
| ⊦ firstPersistW(fowl) < # fowl → fowl[firstPersistW(fowl)].W? |
| p(l0)[p(l0).indexWhere(.W?)] = W(v, t), p(l0) ≠ [], p(l0).indexWhere(.W?) < # p(l0), ¬ p(l0).take(p(l0).indexWhere(.W?)) ⊆ (p(l0).take(p(l0).indexWhere(.W?)))|FO + p(l0)[p(l0).indexWhere(.W?)] ' |FO ⊦ |
p(l0)[p(l0).indexWhere(.W?)] = W(v, t), p(l0) ≠ [], p(l0).indexWhere(.W?) < # p(l0), ¬ p(l0).take(p(l0).indexWhere(.W?)) ⊆ (p(l0).take(p(l0).indexWhere(.W?)))|FO ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ x + [] = x; (s) ⊦ W(v, t) ' |FO = []; (s)
| p(l0)[p(l0).indexWhere(.W?)] = W(v, t), p(l0) ≠ [], p(l0).indexWhere(.W?) < # p(l0), ¬ p(l0).take(p(l0).indexWhere(.W?)) ⊆ (p(l0).take(p(l0).indexWhere(.W?)))|FO ⊦ |
⊦ firstPersistW(fowl) < # fowl → (fowl.take(firstPersistW(fowl)))|FO = fowl.take(firstPersistW(fowl))
Used simplifier rules: firstPersistW: ⊦ firstPersistW(fowl) = fowl.indexWhere(.W?); ⊦ x ⊆ x; (s) Used terms: p(l0)
| ⊦ firstPersistW(fowl) < # fowl → (fowl.take(firstPersistW(fowl)))|FO = fowl.take(firstPersistW(fowl)) |
| l ≠ l0, p(l) ≠ [], p(l).indexWhere(.W?) < # p(l) ⊦ ∃ fowl1, fowl2. (∃ fowl2, fowl3, fowl4, fowl5. p(l0) = fowl2 + fowl3 + fowl4 ∧ fowl5 ⊆ fowl3 |FO ∧ fowl1 = fowl5 + fowl4) ∧ (l = l0 ⊃ p(l0) -p p(l0).indexWhere(.W?);p(l0)) = fowl1 + fowl2 ∧ fowl2 | t = [] |
l ≠ l0, p(l) ≠ [], p(l).indexWhere(.W?) < # p(l) ⊦ ∃ fowl1, fowl2. (∃ fowl2, fowl3, fowl4, fowl5. p(l0) = fowl2 + fowl3 + fowl4 ∧ fowl5 ⊆ fowl3 |FO ∧ fowl1 = fowl5 + fowl4) ∧ p(l0) = fowl1 + fowl2 ∧ fowl2 | t = []
| l ≠ l0, p(l) ≠ [], p(l).indexWhere(.W?) < # p(l) ⊦ ∃ fowl1, fowl2. (∃ fowl2, fowl3, fowl4, fowl5. p(l0) = fowl2 + fowl3 + fowl4 ∧ fowl5 ⊆ fowl3 |FO ∧ fowl1 = fowl5 + fowl4) ∧ p(l0) = fowl1 + fowl2 ∧ fowl2 | t = [] |
l ≠ l0, p(l) ≠ [], p(l).indexWhere(.W?) < # p(l) ⊦ (∃ fowl2, fowl3, fowl4, fowl5. p(l0) = fowl2 + fowl3 + fowl4 ∧ fowl5 ⊆ fowl3 |FO ∧ p(l0) = fowl5 + fowl4) ∧ p(l0) = p(l0) + [] ∧ [] | t = []
Used terms: p(l0), []
| l ≠ l0, p(l) ≠ [], p(l).indexWhere(.W?) < # p(l) ⊦ (∃ fowl2, fowl3, fowl4, fowl5. p(l0) = fowl2 + fowl3 + fowl4 ∧ fowl5 ⊆ fowl3 |FO ∧ p(l0) = fowl5 + fowl4) ∧ p(l0) = p(l0) + [] ∧ [] | t = [] |
l ≠ l0, p(l) ≠ [], p(l).indexWhere(.W?) < # p(l) ⊦ ∃ fowl2, fowl3, fowl4, fowl5. p(l0) = fowl2 + fowl3 + fowl4 ∧ fowl5 ⊆ fowl3 |FO ∧ p(l0) = fowl5 + fowl4
Used simplifier rules: ⊦ [] | t = []; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ x + [] = x; (s)
| l ≠ l0, p(l) ≠ [], p(l).indexWhere(.W?) < # p(l) ⊦ ∃ fowl2, fowl3, fowl4, fowl5. p(l0) = fowl2 + fowl3 + fowl4 ∧ fowl5 ⊆ fowl3 |FO ∧ p(l0) = fowl5 + fowl4 |
Used simplifier rules: ⊦ [] |FO = []; (s) ⊦ [] ⊆ x; (s) ⊦ [] + x = x; (s) a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: [], [], p(l0), []
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.