| ⊦ FOFollowsW(t, p0(l)) ∧ relyp(t, p0, p1) → FOFollowsW(t, p1(l)) |
FOFollowsW(t, p0(l)), relyp(t, p0, p1), ¬ FOFollowsW(t, p1(l)) ⊦
| FOFollowsW(t, p0(l)), relyp(t, p0, p1), ¬ FOFollowsW(t, p1(l)) ⊦ |
⊦ relyp(t, p, p0) ↔ (∀ l. relyp(t, p(l), p0(l)))
FOFollowsW(t, p0(l)), ¬ FOFollowsW(t, p1(l)), ∀ l. relyp(t, p0(l), p1(l)) ⊦
Used terms: t, p0, p1
| ⊦ relyp(t, p, p0) ↔ (∀ l. relyp(t, p(l), p0(l))) |
| FOFollowsW(t, p0(l)), ¬ FOFollowsW(t, p1(l)), ∀ l. relyp(t, p0(l), p1(l)) ⊦ |
FOFollowsW(t, p0(l)), relyp(t, p0(l), p1(l)), ¬ FOFollowsW(t, p1(l)) ⊦
Used terms: l
| FOFollowsW(t, p0(l)), relyp(t, p0(l), p1(l)), ¬ FOFollowsW(t, p1(l)) ⊦ |
⊦ relyp(t, fowl, fowl0) ↔ (∃ fowl1, fowl2. fowl ⊒ fowl1 ∧ fowl0 = fowl1 + fowl2 ∧ fowl2 | t = [])
FOFollowsW(t, p0(l)), ¬ FOFollowsW(t, p1(l)), ∃ fowl1, fowl2. p0(l) ⊒ fowl1 ∧ p1(l) = fowl1 + fowl2 ∧ fowl2 | t = [] ⊦
Used terms: t, p0(l), p1(l)
| ⊦ relyp(t, fowl, fowl0) ↔ (∃ fowl1, fowl2. fowl ⊒ fowl1 ∧ fowl0 = fowl1 + fowl2 ∧ fowl2 | t = []) |
| FOFollowsW(t, p0(l)), ¬ FOFollowsW(t, p1(l)), ∃ fowl1, fowl2. p0(l) ⊒ fowl1 ∧ p1(l) = fowl1 + fowl2 ∧ fowl2 | t = [] ⊦ |
fowl2.filter(λ fow. fow.tid = t) = [], p1(l) = fowl1 + fowl2, FOFollowsW(t, p0(l)), p0(l) ⊒ fowl1, ¬ FOFollowsW(t, fowl1 + fowl2) ⊦
Used simplifier rules: filtertid-def: ⊦ fowl | t = fowl.filter(λ fow. fow.tid = t);
| fowl2.filter(λ fow. fow.tid = t) = [], p1(l) = fowl1 + fowl2, FOFollowsW(t, p0(l)), p0(l) ⊒ fowl1, ¬ FOFollowsW(t, fowl1 + fowl2) ⊦ |
⊦ FOFollowsW(t, fowl) ↔ (∀ n. n < # fowl ∧ fowl[n].W? ∧ fowl[n].tid = t → (∃ n0. n < n0 ∧ n0 < # fowl ∧ fowl[n0] = FO(t)))
fowl2.filter(λ fow. fow.tid = t) = [], p1(l) = fowl1 + fowl2, p0(l) ⊒ fowl1, ¬ FOFollowsW(t, fowl1 + fowl2), ∀ n. n < # p0(l) ∧ p0(l)[n].W? ∧ p0(l)[n].tid = t → (∃ n0. n < n0 ∧ n0 < # p0(l) ∧ p0(l)[n0] = FO(t)) ⊦
Used terms: t, p0(l)
| ⊦ FOFollowsW(t, fowl) ↔ (∀ n. n < # fowl ∧ fowl[n].W? ∧ fowl[n].tid = t → (∃ n0. n < n0 ∧ n0 < # fowl ∧ fowl[n0] = FO(t))) |
| fowl2.filter(λ fow. fow.tid = t) = [], p1(l) = fowl1 + fowl2, p0(l) ⊒ fowl1, ¬ FOFollowsW(t, fowl1 + fowl2), ∀ n. n < # p0(l) ∧ p0(l)[n].W? ∧ p0(l)[n].tid = t → (∃ n0. n < n0 ∧ n0 < # p0(l) ∧ p0(l)[n0] = FO(t)) ⊦ |
fowl2.filter(λ fow. fow.tid = t) = [], p1(l) = fowl1 + fowl2, p0(l) ⊒ fowl1, ¬ FOFollowsW(t, fowl1 + fowl2), ∀ n. n < # p0(l) ∧ p0(l)[n].W? ∧ p0(l)[n].tid = t → (∃ n0. n < n0 ∧ n0 < # p0(l) ∧ p0(l)[n0] = FO(p0(l)[n].tid)) ⊦
| fowl2.filter(λ fow. fow.tid = t) = [], p1(l) = fowl1 + fowl2, p0(l) ⊒ fowl1, ¬ FOFollowsW(t, fowl1 + fowl2), ∀ n. n < # p0(l) ∧ p0(l)[n].W? ∧ p0(l)[n].tid = t → (∃ n0. n < n0 ∧ n0 < # p0(l) ∧ p0(l)[n0] = FO(p0(l)[n].tid)) ⊦ |
⊦ FOFollowsW(t, fowl) ↔ (∀ n. n < # fowl ∧ fowl[n].W? ∧ fowl[n].tid = t → (∃ n0. n < n0 ∧ n0 < # fowl ∧ fowl[n0] = FO(t)))
fowl2.filter(λ fow. fow.tid = t) = [], p1(l) = fowl1 + fowl2, p0(l) ⊒ fowl1, ∀ n. n < # p0(l) ∧ p0(l)[n].W? ∧ p0(l)[n].tid = t → (∃ n0. n < n0 ∧ n0 < # p0(l) ∧ p0(l)[n0] = FO(p0(l)[n].tid)), ∃ n. ¬ ( n < #(fowl1 + fowl2) ∧ (fowl1 + fowl2)[n].W? ∧ (fowl1 + fowl2)[n].tid = t → (∃ n0. n < n0 ∧ n0 < #(fowl1 + fowl2) ∧ (fowl1 + fowl2)[n0] = FO(t))) ⊦
Used terms: t, fowl1 + fowl2
| ⊦ FOFollowsW(t, fowl) ↔ (∀ n. n < # fowl ∧ fowl[n].W? ∧ fowl[n].tid = t → (∃ n0. n < n0 ∧ n0 < # fowl ∧ fowl[n0] = FO(t))) |
| fowl2.filter(λ fow. fow.tid = t) = [], p1(l) = fowl1 + fowl2, p0(l) ⊒ fowl1, ∀ n. n < # p0(l) ∧ p0(l)[n].W? ∧ p0(l)[n].tid = t → (∃ n0. n < n0 ∧ n0 < # p0(l) ∧ p0(l)[n0] = FO(p0(l)[n].tid)), ∃ n. ¬ ( n < #(fowl1 + fowl2) ∧ (fowl1 + fowl2)[n].W? ∧ (fowl1 + fowl2)[n].tid = t → (∃ n0. n < n0 ∧ n0 < #(fowl1 + fowl2) ∧ (fowl1 + fowl2)[n0] = FO(t))) ⊦ |
fowl2.filter(λ fow. fow.tid = (fowl1 + fowl2)[n].tid) = [], p1(l) = fowl1 + fowl2, (fowl1 + fowl2)[n].W?, n < # fowl1 + # fowl2, p0(l) ⊒ fowl1, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = (fowl1 + fowl2)[n].tid → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)) ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO((fowl1 + fowl2)[n].tid)
Used simplifier rules: ⊦ m < n → n ≠ 0; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ #(x + y) = # x + # y; (s)
| fowl2.filter(λ fow. fow.tid = (fowl1 + fowl2)[n].tid) = [], p1(l) = fowl1 + fowl2, (fowl1 + fowl2)[n].W?, n < # fowl1 + # fowl2, p0(l) ⊒ fowl1, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = (fowl1 + fowl2)[n].tid → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)) ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO((fowl1 + fowl2)[n].tid) |
fowl2.filter(λ fow. fow.tid = t) = [], (fowl1 + fowl2)[n] = W(v, t), p1(l) = fowl1 + fowl2, (fowl1 + fowl2)[n].W?, n < # fowl1 + # fowl2, p0(l) ⊒ fowl1, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)) ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t)
Used simplifier rules: ⊦ fow.W? → (val = fow.val ∧ tid = fow.tid ↔ fow = W(val, tid)); (elim) Used terms: (fowl1 + fowl2)[n], v, t
| fowl2.filter(λ fow. fow.tid = t) = [], (fowl1 + fowl2)[n] = W(v, t), p1(l) = fowl1 + fowl2, (fowl1 + fowl2)[n].W?, n < # fowl1 + # fowl2, p0(l) ⊒ fowl1, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)) ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t) |
fowl2.filter(λ fow. fow.tid = t) = [], (fowl1 + fowl2)[n] = W(v, t), p1(l) = fowl1 + fowl2, n < # fowl1 + # fowl2, p0(l) ⊒ fowl1, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)) ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t)
Used simplifier rules: ⊦ W(v, tid).W?; (s)
| fowl2.filter(λ fow. fow.tid = t) = [], (fowl1 + fowl2)[n] = W(v, t), p1(l) = fowl1 + fowl2, n < # fowl1 + # fowl2, p0(l) ⊒ fowl1, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)) ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t) |
⊦ n < # x → (x + y)[n] = x[n]
fowl2.filter(λ fow. fow.tid = t) = [], (fowl1 + fowl2)[n] = W(v, t), p1(l) = fowl1 + fowl2, n < # fowl1 + # fowl2, p0(l) ⊒ fowl1, ¬ n < # fowl1, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)) ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t)
fowl2.filter(λ fow. fow.tid = t) = [], fowl1[n] = W(v, t), p1(l) = fowl1 + fowl2, n < # fowl1 + # fowl2, n < # fowl1, p0(l) ⊒ fowl1, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)) ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t)
Used terms: n, fowl1, fowl2
| ⊦ n < # x → (x + y)[n] = x[n] |
| fowl2.filter(λ fow. fow.tid = t) = [], (fowl1 + fowl2)[n] = W(v, t), p1(l) = fowl1 + fowl2, n < # fowl1 + # fowl2, p0(l) ⊒ fowl1, ¬ n < # fowl1, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)) ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t) |
fowl2.filter(λ fow. fow.tid = t) = [], fowl2[n - # fowl1] = W(v, t), p1(l) = fowl1 + fowl2, fowl2 ≠ [], n < # fowl1 + # fowl2, # fowl1 ≤ n, p0(l) ⊒ fowl1, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)) ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t)
Used simplifier rules: c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ # x = 0 ↔ x = []; (s) ⊦ m < m + n ↔ n ≠ 0; (s) fle-01: ⊦ m ≤ n ∧ n < n0 → m < n0; (forward) from specification nat ⊦ m < n ↔ ¬ n ≤ m; (ss) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ ¬ n < # x → (x + y)[n] = y[n - # x]; (s)
| fowl2.filter(λ fow. fow.tid = t) = [], fowl2[n - # fowl1] = W(v, t), p1(l) = fowl1 + fowl2, fowl2 ≠ [], n < # fowl1 + # fowl2, # fowl1 ≤ n, p0(l) ⊒ fowl1, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)) ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t) |
fowl2.filter(λ fow. fow.tid = t) = [], fowl2[n2] = W(v, t), n = n2 + # fowl1, p1(l) = fowl1 + fowl2, fowl2 ≠ [], n < # fowl1 + # fowl2, # fowl1 ≤ n, p0(l) ⊒ fowl1, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)) ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t)
Used simplifier rules: n ≤ m ⊦ n0 = m - n ↔ m = n0 + n; (elim) Used terms: n, # fowl1, n2
| fowl2.filter(λ fow. fow.tid = t) = [], fowl2[n2] = W(v, t), n = n2 + # fowl1, p1(l) = fowl1 + fowl2, fowl2 ≠ [], n < # fowl1 + # fowl2, # fowl1 ≤ n, p0(l) ⊒ fowl1, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)) ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t) |
fowl2.filter(λ fow. fow.tid = t) = [], fowl2[n2] = W(v, t), p1(l) = fowl1 + fowl2, fowl2 ≠ [], n2 < # fowl2, p0(l) ⊒ fowl1, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)) ⊦ ∃ n0. n2 + # fowl1 < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t)
Used simplifier rules: ⊦ # x = 0 ↔ x = []; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ m + n < m + n0 ↔ n < n0; (s) ⊦ m ≤ m + n; (s)
| fowl2.filter(λ fow. fow.tid = t) = [], fowl2[n2] = W(v, t), p1(l) = fowl1 + fowl2, fowl2 ≠ [], n2 < # fowl2, p0(l) ⊒ fowl1, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)) ⊦ ∃ n0. n2 + # fowl1 < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t) |
⊦ x = [] ↔ ¬(∃ a. a ∈ x)
fowl2[n2] = W(v, t), p1(l) = fowl1 + fowl2, fowl2 ≠ [], n2 < # fowl2, p0(l) ⊒ fowl1, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)), ∀ a. ¬ a ∈ fowl2.filter(λ fow. fow.tid = t) ⊦ ∃ n0. n2 + # fowl1 < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t)
Used terms: fowl2.filter(λ fow. fow.tid = t)
| ⊦ x = [] ↔ ¬(∃ a. a ∈ x) |
| fowl2[n2] = W(v, t), p1(l) = fowl1 + fowl2, fowl2 ≠ [], n2 < # fowl2, p0(l) ⊒ fowl1, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)), ∀ a. ¬ a ∈ fowl2.filter(λ fow. fow.tid = t) ⊦ ∃ n0. n2 + # fowl1 < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t) |
fowl2[n2] = W(v, t), p1(l) = fowl1 + fowl2, fowl2 ≠ [], n2 < # fowl2, p0(l) ⊒ fowl1, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)), ∀ a. ¬ a ∈ fowl2 ∨ a.tid ≠ t ⊦ ∃ n0. n2 + # fowl1 < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t)
Used simplifier rules: ⊦ a ∈ x.filter(p) ↔ a ∈ x ∧ p(a); (s)
| fowl2[n2] = W(v, t), p1(l) = fowl1 + fowl2, fowl2 ≠ [], n2 < # fowl2, p0(l) ⊒ fowl1, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)), ∀ a. ¬ a ∈ fowl2 ∨ a.tid ≠ t ⊦ ∃ n0. n2 + # fowl1 < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t) |
fowl2[n2] = W(v, t), p1(l) = fowl1 + fowl2, fowl2 ≠ [], n2 < # fowl2, p0(l) ⊒ fowl1, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)), ¬ W(v, t) ∈ fowl2 ∨ W(v, t).tid ≠ t ⊦ ∃ n0. n2 + # fowl1 < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t)
Used terms: W(v, t)
| fowl2[n2] = W(v, t), p1(l) = fowl1 + fowl2, fowl2 ≠ [], n2 < # fowl2, p0(l) ⊒ fowl1, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)), ¬ W(v, t) ∈ fowl2 ∨ W(v, t).tid ≠ t ⊦ ∃ n0. n2 + # fowl1 < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t) |
fowl2[n2] = W(v, t), p1(l) = fowl1 + fowl2, fowl2 ≠ [], n2 < # fowl2, p0(l) ⊒ fowl1, ¬ W(v, t) ∈ fowl2, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)) ⊦ ∃ n0. n2 + # fowl1 < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t)
Used simplifier rules: ⊦ W(v, tid).tid = tid; (s)
| fowl2[n2] = W(v, t), p1(l) = fowl1 + fowl2, fowl2 ≠ [], n2 < # fowl2, p0(l) ⊒ fowl1, ¬ W(v, t) ∈ fowl2, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)) ⊦ ∃ n0. n2 + # fowl1 < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t) |
⊦ a ∈ x ↔ (∃ n. n < # x ∧ x[n] = a)
fowl2[n2] = W(v, t), p1(l) = fowl1 + fowl2, fowl2 ≠ [], n2 < # fowl2, p0(l) ⊒ fowl1, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)), ∀ n. ¬(n < # fowl2 ∧ fowl2[n] = W(v, t)) ⊦ ∃ n0. n2 + # fowl1 < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t)
Used terms: W(v, t), fowl2
| ⊦ a ∈ x ↔ (∃ n. n < # x ∧ x[n] = a) |
| fowl2[n2] = W(v, t), p1(l) = fowl1 + fowl2, fowl2 ≠ [], n2 < # fowl2, p0(l) ⊒ fowl1, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)), ∀ n. ¬(n < # fowl2 ∧ fowl2[n] = W(v, t)) ⊦ ∃ n0. n2 + # fowl1 < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t) |
fowl2[n2] = W(v, t), p1(l) = fowl1 + fowl2, fowl2 ≠ [], n2 < # fowl2, p0(l) ⊒ fowl1, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)), ∀ n. ¬ n < # fowl2 ∨ fowl2[n] ≠ W(v, t) ⊦ ∃ n0. n2 + # fowl1 < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t)
| fowl2[n2] = W(v, t), p1(l) = fowl1 + fowl2, fowl2 ≠ [], n2 < # fowl2, p0(l) ⊒ fowl1, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)), ∀ n. ¬ n < # fowl2 ∨ fowl2[n] ≠ W(v, t) ⊦ ∃ n0. n2 + # fowl1 < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t) |
Used terms: n2
| fowl2.filter(λ fow. fow.tid = t) = [], fowl1[n] = W(v, t), p1(l) = fowl1 + fowl2, n < # fowl1 + # fowl2, n < # fowl1, p0(l) ⊒ fowl1, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)) ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t) |
fowl2.filter(λ fow. fow.tid = t) = [], fowl1[n] = W(v, t), p1(l) = fowl1 + fowl2, fowl1 ≠ [], n < # fowl1 + # fowl2, n < # fowl1, p0(l) ⊒ fowl1, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)) ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t)
Used simplifier rules: ⊦ # x = 0 ↔ x = []; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic
| fowl2.filter(λ fow. fow.tid = t) = [], fowl1[n] = W(v, t), p1(l) = fowl1 + fowl2, fowl1 ≠ [], n < # fowl1 + # fowl2, n < # fowl1, p0(l) ⊒ fowl1, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)) ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t) |
⊦ x ⊒ y ↔ (∃ z. z + y = x)
fowl2.filter(λ fow. fow.tid = t) = [], fowl1[n] = W(v, t), p1(l) = fowl1 + fowl2, fowl1 ≠ [], n < # fowl1, n < # fowl1 + # fowl2, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)), ∃ z. z + fowl1 = p0(l) ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t)
Used terms: p0(l), fowl1
| ⊦ x ⊒ y ↔ (∃ z. z + y = x) |
| fowl2.filter(λ fow. fow.tid = t) = [], fowl1[n] = W(v, t), p1(l) = fowl1 + fowl2, fowl1 ≠ [], n < # fowl1, n < # fowl1 + # fowl2, ∀ n0. n0 < # p0(l) ∧ p0(l)[n0].W? ∧ p0(l)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # p0(l) ∧ p0(l)[n1] = FO(p0(l)[n0].tid)), ∃ z. z + fowl1 = p0(l) ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t) |
fowl + fowl1 = p0(l), fowl2.filter(λ fow. fow.tid = t) = [], fowl1[n] = W(v, t), p1(l) = fowl1 + fowl2, fowl1 ≠ [], n < # fowl1, n < # fowl1 + # fowl2, ∀ n0. n0 < # fowl + # fowl1 ∧ (fowl + fowl1)[n0].W? ∧ (fowl + fowl1)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # fowl + # fowl1 ∧ (fowl + fowl1)[n1] = FO((fowl + fowl1)[n0].tid)) ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t)
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ #(x + y) = # x + # y; (s)
| fowl + fowl1 = p0(l), fowl2.filter(λ fow. fow.tid = t) = [], fowl1[n] = W(v, t), p1(l) = fowl1 + fowl2, fowl1 ≠ [], n < # fowl1, n < # fowl1 + # fowl2, ∀ n0. n0 < # fowl + # fowl1 ∧ (fowl + fowl1)[n0].W? ∧ (fowl + fowl1)[n0].tid = t → (∃ n1. n0 < n1 ∧ n1 < # fowl + # fowl1 ∧ (fowl + fowl1)[n1] = FO((fowl + fowl1)[n0].tid)) ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t) |
fowl + fowl1 = p0(l), fowl2.filter(λ fow. fow.tid = t) = [], fowl1[n] = W(v, t), p1(l) = fowl1 + fowl2, fowl1 ≠ [], n < # fowl1 + # fowl2, n < # fowl1, # fowl + n < # fowl + # fowl1 ∧ (fowl + fowl1)[# fowl + n].W? ∧ (fowl + fowl1)[# fowl + n].tid = t → (∃ n1. # fowl + n < n1 ∧ n1 < # fowl + # fowl1 ∧ (fowl + fowl1)[n1] = FO((fowl + fowl1)[# fowl + n].tid)) ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t)
Used terms: # fowl + n
| fowl + fowl1 = p0(l), fowl2.filter(λ fow. fow.tid = t) = [], fowl1[n] = W(v, t), p1(l) = fowl1 + fowl2, fowl1 ≠ [], n < # fowl1 + # fowl2, n < # fowl1, # fowl + n < # fowl + # fowl1 ∧ (fowl + fowl1)[# fowl + n].W? ∧ (fowl + fowl1)[# fowl + n].tid = t → (∃ n1. # fowl + n < n1 ∧ n1 < # fowl + # fowl1 ∧ (fowl + fowl1)[n1] = FO((fowl + fowl1)[# fowl + n].tid)) ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t) |
fowl + fowl1 = p0(l), fowl2.filter(λ fow. fow.tid = t) = [], (fowl + fowl1)[n1] = FO(t), fowl1[n] = W(v, t), p1(l) = fowl1 + fowl2, fowl1 ≠ [], n1 < # fowl + # fowl1, # fowl + n < n1, n < # fowl1 + # fowl2, n + 1 < # fowl1, n < # fowl1 ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t)
Used simplifier rules: c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ m + n < m + n0 ↔ n < n0; (s) ⊦ m +1 = m + 1; (s) ⊦ m < n → n ≠ 0; (s) trans-Nat: ⊦ n < n0 ∧ n0 < n1 → n < n1; (forward) from specification nat-basic lf: ⊦ m < n ∧ n < n0 → m +1 < n0; (forward) from specification nat-basic f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic ⊦ W(v, tid).tid = tid; (s) ⊦ W(v, tid).W?; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (x + y)[n + # x] = y[n]; (s)
| fowl + fowl1 = p0(l), fowl2.filter(λ fow. fow.tid = t) = [], (fowl + fowl1)[n1] = FO(t), fowl1[n] = W(v, t), p1(l) = fowl1 + fowl2, fowl1 ≠ [], n1 < # fowl + # fowl1, # fowl + n < n1, n < # fowl1 + # fowl2, n + 1 < # fowl1, n < # fowl1 ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t) |
⊦ ¬ n < # x → (x + y)[n] = y[n - # x]
fowl + fowl1 = p0(l), fowl2.filter(λ fow. fow.tid = t) = [], fowl1[n] = W(v, t), fowl1[n1 - # fowl] = FO(t), p1(l) = fowl1 + fowl2, fowl1 ≠ [], n < # fowl1, n + 1 < # fowl1, n < # fowl1 + # fowl2, # fowl + n < n1, n1 < # fowl + # fowl1, ¬ n1 < # fowl ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t)
Used simplifier rules: ⊦ n < # x → (x + y)[n] = x[n]; (s) a: ⊦ (x + y) + z = x + y + z; from specification list f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic lf: ⊦ m < n ∧ n < n0 → m +1 < n0; (forward) from specification nat-basic trans-Nat: ⊦ n < n0 ∧ n0 < n1 → n < n1; (forward) from specification nat-basic ⊦ # x = 0 ↔ x = []; (s) ⊦ m +1 = m + 1; (s) ⊦ m + m0 < n → ¬ n + n0 < m; (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic Used terms: n1, fowl, fowl1
| ⊦ ¬ n < # x → (x + y)[n] = y[n - # x] |
| fowl + fowl1 = p0(l), fowl2.filter(λ fow. fow.tid = t) = [], fowl1[n] = W(v, t), fowl1[n1 - # fowl] = FO(t), p1(l) = fowl1 + fowl2, fowl1 ≠ [], n < # fowl1, n + 1 < # fowl1, n < # fowl1 + # fowl2, # fowl + n < n1, n1 < # fowl + # fowl1, ¬ n1 < # fowl ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t) |
fowl + fowl1 = p0(l), fowl2.filter(λ fow. fow.tid = t) = [], fowl1[n] = W(v, t), fowl1[n1 - # fowl] = FO(t), p1(l) = fowl1 + fowl2, fowl1 ≠ [], n < # fowl1, n + 1 < # fowl1, n < # fowl1 + # fowl2, # fowl + n < n1, n1 < # fowl + # fowl1, # fowl ≤ n1 ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t)
Used simplifier rules: c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ # x = 0 ↔ x = []; (s) ⊦ m < m + n ↔ n ≠ 0; (s) fle-01: ⊦ m ≤ n ∧ n < n0 → m < n0; (forward) from specification nat ⊦ m < n ↔ ¬ n ≤ m; (ss)
| fowl + fowl1 = p0(l), fowl2.filter(λ fow. fow.tid = t) = [], fowl1[n] = W(v, t), fowl1[n1 - # fowl] = FO(t), p1(l) = fowl1 + fowl2, fowl1 ≠ [], n < # fowl1, n + 1 < # fowl1, n < # fowl1 + # fowl2, # fowl + n < n1, n1 < # fowl + # fowl1, # fowl ≤ n1 ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t) |
fowl + fowl1 = p0(l), fowl2.filter(λ fow. fow.tid = t) = [], fowl1[n2] = FO(t), fowl1[n] = W(v, t), n1 = n2 + # fowl, p1(l) = fowl1 + fowl2, fowl1 ≠ [], n1 < # fowl + # fowl1, # fowl + n < n1, n < # fowl1 + # fowl2, n + 1 < # fowl1, n < # fowl1, # fowl ≤ n1 ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t)
Used simplifier rules: n ≤ m ⊦ n0 = m - n ↔ m = n0 + n; (elim) Used terms: n1, # fowl, n2
| fowl + fowl1 = p0(l), fowl2.filter(λ fow. fow.tid = t) = [], fowl1[n2] = FO(t), fowl1[n] = W(v, t), n1 = n2 + # fowl, p1(l) = fowl1 + fowl2, fowl1 ≠ [], n1 < # fowl + # fowl1, # fowl + n < n1, n < # fowl1 + # fowl2, n + 1 < # fowl1, n < # fowl1, # fowl ≤ n1 ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t) |
fowl + fowl1 = p0(l), fowl2.filter(λ fow. fow.tid = t) = [], fowl1[n2] = FO(t), fowl1[n] = W(v, t), p1(l) = fowl1 + fowl2, fowl1 ≠ [], n < # fowl1, n2 < # fowl1, n < n2, n < # fowl1 + # fowl2, n + 1 < # fowl1 ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t)
Used simplifier rules: ⊦ m +1 = m + 1; (s) ⊦ m < n → n ≠ 0; (s) trans-Nat: ⊦ n < n0 ∧ n0 < n1 → n < n1; (forward) from specification nat-basic lf: ⊦ m < n ∧ n < n0 → m +1 < n0; (forward) from specification nat-basic f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ m + n < m + n0 ↔ n < n0; (s) ⊦ m ≤ m + n; (s)
| fowl + fowl1 = p0(l), fowl2.filter(λ fow. fow.tid = t) = [], fowl1[n2] = FO(t), fowl1[n] = W(v, t), p1(l) = fowl1 + fowl2, fowl1 ≠ [], n < # fowl1, n2 < # fowl1, n < n2, n < # fowl1 + # fowl2, n + 1 < # fowl1 ⊦ ∃ n0. n < n0 ∧ n0 < # fowl1 + # fowl2 ∧ (fowl1 + fowl2)[n0] = FO(t) |
Used simplifier rules: ⊦ n < # x → (x + y)[n] = x[n]; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ m < n ↔ ¬ n ≤ m; (ss) fle-01: ⊦ m ≤ n ∧ n < n0 → m < n0; (forward) from specification nat fle: ⊦ m < n ∧ n ≤ n0 → m < n0; (forward) from specification nat ⊦ ¬ m + n < m; (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic Used terms: n2
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.