| ⊦ n + m ≤ m0 ∧ n0 + m0 ≤ # x → sublist(n, m, sublist(n0, m0, x)) = sublist(n0 + n, m, x) |
sublist(n, m, sublist(n0, m0, x)) ≠ sublist(n0 + n, m, x), n + m ≤ m0, n0 + m0 ≤ # x ⊦
| sublist(n, m, sublist(n0, m0, x)) ≠ sublist(n0 + n, m, x), n + m ≤ m0, n0 + m0 ≤ # x ⊦ |
firstn(m, restn(n, firstn(m0, restn(n0, x)))) ≠ firstn(m, restn(n0 + n, x)), n0 + m0 ≤ # x, n + m ≤ m0 ⊦
Used simplifier rules: sublist-def: ⊦ sublist(m, n, x) = firstn(n, restn(m, x));
| firstn(m, restn(n, firstn(m0, restn(n0, x)))) ≠ firstn(m, restn(n0 + n, x)), n0 + m0 ≤ # x, n + m ≤ m0 ⊦ |
firstn(m, restn(n, firstn(m0, restn(n0, a + x0)))) ≠ firstn(m, restn(n0 + n, a + x0)), n + m ≤ m0, n0 + m0 ≤ #(a + x0), ∀ m, n, m0, n0. ¬(firstn(m, restn(n, firstn(m0, restn(n0, x0)))) ≠ firstn(m, restn(n0 + n, x0)) ∧ n0 + m0 ≤ # x0 ∧ n + m ≤ m0) ⊦
Used simplifier rules: restN-zero: ⊦ restn(0, x) = x; firstN-zero: ⊦ firstn(0, x) = []; list freely generated by [], +;; ⊦ # [] = 0; (s) ⊦ m ≤ 0 ↔ m = 0; (s) ⊦ m + n = 0 ↔ m = 0 ∧ n = 0; (ws) ⊦ 0 + m = m; (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic
| firstn(m, restn(n, firstn(m0, restn(n0, a + x0)))) ≠ firstn(m, restn(n0 + n, a + x0)), n + m ≤ m0, n0 + m0 ≤ #(a + x0), ∀ m, n, m0, n0. ¬(firstn(m, restn(n, firstn(m0, restn(n0, x0)))) ≠ firstn(m, restn(n0 + n, x0)) ∧ n0 + m0 ≤ # x0 ∧ n + m ≤ m0) ⊦ |
firstn(m, restn(n, firstn(m0, restn(n0, a ' + x0)))) ≠ firstn(m, restn(n0 + n, a ' + x0)), n + m ≤ m0, n0 + m0 ≤ 1 + # x0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ # a ' = 0 +1; (s) ⊦ #(x + y) = # x + # y; (s) ⊦ a + x = a ' + x; (s)
| firstn(m, restn(n, firstn(m0, restn(n0, a ' + x0)))) ≠ firstn(m, restn(n0 + n, a ' + x0)), n + m ≤ m0, n0 + m0 ≤ 1 + # x0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦ |
⊦ 0 < n → restn(n, x) = restn(n -1, x.tail)
firstn(m, restn(n, firstn(m0, restn(n0, a ' + x0)))) ≠ firstn(m, restn(n0 + n, a ' + x0)), n0 + m0 ≤ 1 + # x0, n + m ≤ m0, ¬ 0 < n0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦
firstn(m, restn(n, firstn(m0, restn(n0 -1, (a ' + x0).tail)))) ≠ firstn(m, restn(n0 + n, a ' + x0)), 0 < n0, n0 + m0 ≤ 1 + # x0, n + m ≤ m0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦
Used terms: a ' + x0, n0
| ⊦ 0 < n → restn(n, x) = restn(n -1, x.tail) |
| firstn(m, restn(n, firstn(m0, restn(n0, a ' + x0)))) ≠ firstn(m, restn(n0 + n, a ' + x0)), n0 + m0 ≤ 1 + # x0, n + m ≤ m0, ¬ 0 < n0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦ |
firstn(m, restn(n, firstn(m0, a ' + x0))) ≠ firstn(m, restn(n, a ' + x0)), n + m ≤ m0, m0 ≤ 1 + # x0, n + m ≤ 1 + # x0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦
Used simplifier rules: restN-zero: ⊦ restn(0, x) = x; let: ⊦ n ≤ n0 ∧ n0 ≤ n1 → n ≤ n1; (forward) from specification nat c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ 0 + m = m; (s) ⊦ 0 < m ↔ m ≠ 0; (s)
| firstn(m, restn(n, firstn(m0, a ' + x0))) ≠ firstn(m, restn(n, a ' + x0)), n + m ≤ m0, m0 ≤ 1 + # x0, n + m ≤ 1 + # x0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦ |
n ≠ 0 ⊦ firstn((* n), x) = x.head ' + firstn(n -1, x.tail)
firstn(m, restn(n, (a ' + x0).head ' + firstn(m0 -1, (a ' + x0).tail))) ≠ firstn(m, restn(n, a ' + x0)), m0 ≠ 0, n + m ≤ 1 + # x0, m0 ≤ 1 + # x0, n + m ≤ m0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦
Used simplifier rules: restN-zero: ⊦ restn(0, x) = x; firstN-zero: ⊦ firstn(0, x) = []; ⊦ m ≤ 0 ↔ m = 0; (s) ⊦ m + n = 0 ↔ m = 0 ∧ n = 0; (ws) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic ⊦ 0 ≤ m; (s) Used terms: a ' + x0, m0
| n ≠ 0 ⊦ firstn((* n), x) = x.head ' + firstn(n -1, x.tail) |
| firstn(m, restn(n, (a ' + x0).head ' + firstn(m0 -1, (a ' + x0).tail))) ≠ firstn(m, restn(n, a ' + x0)), m0 ≠ 0, n + m ≤ 1 + # x0, m0 ≤ 1 + # x0, n + m ≤ m0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦ |
firstn(m, restn(n, a ' + firstn(m0 - 1, x0))) ≠ firstn(m, restn(n, a ' + x0)), m0 ≠ 0, n + m ≤ m0, m0 ≤ 1 + # x0, n + m ≤ 1 + # x0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (a ' + x).tail = x; (s) ⊦ n -1 = n - 1; (s) ⊦ (a ' + x).head = a; (s)
| firstn(m, restn(n, a ' + firstn(m0 - 1, x0))) ≠ firstn(m, restn(n, a ' + x0)), m0 ≠ 0, n + m ≤ m0, m0 ≤ 1 + # x0, n + m ≤ 1 + # x0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦ |
m0 = m3 + 1, firstn(m, restn(n, a ' + firstn(m3, x0))) ≠ firstn(m, restn(n, a ' + x0)), m0 ≠ 0, n + m ≤ 1 + # x0, m0 ≤ 1 + # x0, n + m ≤ m0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦
Used simplifier rules: n ≠ 0 ⊦ m = n - 1 ↔ n = m + 1; (elim) Used terms: m0, m3
| m0 = m3 + 1, firstn(m, restn(n, a ' + firstn(m3, x0))) ≠ firstn(m, restn(n, a ' + x0)), m0 ≠ 0, n + m ≤ 1 + # x0, m0 ≤ 1 + # x0, n + m ≤ m0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦ |
firstn(m, restn(n, a ' + firstn(m3, x0))) ≠ firstn(m, restn(n, a ' + x0)), n + m ≤ 1 + # x0, n + m ≤ m3 + 1, m3 ≤ # x0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦
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 ≠ 0; (s)
| firstn(m, restn(n, a ' + firstn(m3, x0))) ≠ firstn(m, restn(n, a ' + x0)), n + m ≤ 1 + # x0, n + m ≤ m3 + 1, m3 ≤ # x0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦ |
⊦ 0 < n → restn(n, x) = restn(n -1, x.tail)
firstn(m, restn(n, a ' + firstn(m3, x0))) ≠ firstn(m, restn(n, a ' + x0)), m3 ≤ # x0, n + m ≤ m3 + 1, n + m ≤ 1 + # x0, ¬ 0 < n, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦
firstn(m, restn(n -1, (a ' + firstn(m3, x0)).tail)) ≠ firstn(m, restn(n, a ' + x0)), 0 < n, m3 ≤ # x0, n + m ≤ m3 + 1, n + m ≤ 1 + # x0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦
Used terms: a ' + firstn(m3, x0), n
| ⊦ 0 < n → restn(n, x) = restn(n -1, x.tail) |
| firstn(m, restn(n, a ' + firstn(m3, x0))) ≠ firstn(m, restn(n, a ' + x0)), m3 ≤ # x0, n + m ≤ m3 + 1, n + m ≤ 1 + # x0, ¬ 0 < n, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦ |
firstn(m, a ' + firstn(m3, x0)) ≠ firstn(m, a ' + x0), m3 ≤ # x0, m ≤ m3 + 1, m ≤ 1 + # x0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦
Used simplifier rules: restN-zero: ⊦ restn(0, x) = x; c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ 0 + m = m; (s) ⊦ 0 < m ↔ m ≠ 0; (s)
| firstn(m, a ' + firstn(m3, x0)) ≠ firstn(m, a ' + x0), m3 ≤ # x0, m ≤ m3 + 1, m ≤ 1 + # x0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦ |
n ≠ 0 ⊦ firstn((* n), x) = x.head ' + firstn(n -1, x.tail)
(a ' + firstn(m3, x0)).head ' + firstn(m -1, (a ' + firstn(m3, x0)).tail) ≠ firstn(m, a ' + x0), m ≠ 0, m ≤ 1 + # x0, m ≤ m3 + 1, m3 ≤ # x0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦
Used simplifier rules: firstN-zero: ⊦ firstn(0, x) = []; Used terms: a ' + firstn(m3, x0), m
| n ≠ 0 ⊦ firstn((* n), x) = x.head ' + firstn(n -1, x.tail) |
| (a ' + firstn(m3, x0)).head ' + firstn(m -1, (a ' + firstn(m3, x0)).tail) ≠ firstn(m, a ' + x0), m ≠ 0, m ≤ 1 + # x0, m ≤ m3 + 1, m3 ≤ # x0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦ |
a ' + firstn(m - 1, firstn(m3, x0)) ≠ firstn(m, a ' + x0), m ≠ 0, m3 ≤ # x0, m ≤ m3 + 1, m ≤ 1 + # x0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (a ' + x).tail = x; (s) ⊦ n -1 = n - 1; (s) ⊦ (a ' + x).head = a; (s)
| a ' + firstn(m - 1, firstn(m3, x0)) ≠ firstn(m, a ' + x0), m ≠ 0, m3 ≤ # x0, m ≤ m3 + 1, m ≤ 1 + # x0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦ |
Used simplifier rules: firstN-rec: ⊦ firstn(n + 1, x) = x.head + firstn(n, x.tail); firstn-firstn: ⊦ m ≤ n ∧ n ≤ # x → firstn(m, firstn(n, x)) = firstn(m, x); ⊦ (a ' + x).head = a; (s) ⊦ (a ' + x).tail = x; (s) ⊦ a + x = a ' + x; (s) ⊦ x + y = x + z ↔ y = z; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ m + 1 ≠ 0; (s) ⊦ m + n ≤ m + n0 ↔ n ≤ n0; (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic n ≠ 0 ⊦ m = n - 1 ↔ n = m + 1; (elim) Used terms: m, m0
| firstn(m, restn(n -1, (a ' + firstn(m3, x0)).tail)) ≠ firstn(m, restn(n, a ' + x0)), 0 < n, m3 ≤ # x0, n + m ≤ m3 + 1, n + m ≤ 1 + # x0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦ |
firstn(m, restn(n - 1, firstn(m3, x0))) ≠ firstn(m, restn(n, a ' + x0)), n ≠ 0, n + m ≤ 1 + # x0, n + m ≤ m3 + 1, m3 ≤ # x0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦
Used simplifier rules: ⊦ 0 < m ↔ m ≠ 0; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (a ' + x).tail = x; (s) ⊦ n -1 = n - 1; (s)
| firstn(m, restn(n - 1, firstn(m3, x0))) ≠ firstn(m, restn(n, a ' + x0)), n ≠ 0, n + m ≤ 1 + # x0, n + m ≤ m3 + 1, m3 ≤ # x0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦ |
n = m0 + 1, firstn(m, restn(m0, firstn(m3, x0))) ≠ firstn(m, restn(n, a ' + x0)), n ≠ 0, m3 ≤ # x0, n + m ≤ m3 + 1, n + m ≤ 1 + # x0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦
Used simplifier rules: n ≠ 0 ⊦ m = n - 1 ↔ n = m + 1; (elim) Used terms: n, m0
| n = m0 + 1, firstn(m, restn(m0, firstn(m3, x0))) ≠ firstn(m, restn(n, a ' + x0)), n ≠ 0, m3 ≤ # x0, n + m ≤ m3 + 1, n + m ≤ 1 + # x0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦ |
firstn(m, restn(m0, firstn(m3, x0))) ≠ firstn(m, restn(m0, x0)), m3 ≤ # x0, m0 + m ≤ m3, m0 + m ≤ # x0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦
Used simplifier rules: restN-rec: ⊦ restn(n + 1, x) = restn(n, x.tail); let: ⊦ n ≤ n0 ∧ n0 ≤ n1 → n ≤ n1; (forward) from specification nat 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 ≠ 0; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (a ' + x).tail = x; (s)
| firstn(m, restn(m0, firstn(m3, x0))) ≠ firstn(m, restn(m0, x0)), m3 ≤ # x0, m0 + m ≤ m3, m0 + m ≤ # x0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦ |
⊦ n ≤ # x → (y = firstn(n, x) ∧ z = restn(n, x) ↔ x = y + z ∧ # y = n)
Used simplifier rules: rest-append: ⊦ n + m ≤ # x → restn(n, x + y) = restn(n, x) + y; first-append-01: ⊦ n + m ≤ # x → firstn(m, restn(n, x) + y) = firstn(m, restn(n, x)); a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: x0, m3, y, z
| ⊦ n ≤ # x → (y = firstn(n, x) ∧ z = restn(n, x) ↔ x = y + z ∧ # y = n) |
| firstn(m, restn(n, firstn(m0, restn(n0 -1, (a ' + x0).tail)))) ≠ firstn(m, restn(n0 + n, a ' + x0)), 0 < n0, n0 + m0 ≤ 1 + # x0, n + m ≤ m0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦ |
firstn(m, restn(n, firstn(m0, restn(n0 - 1, x0)))) ≠ firstn(m, restn(n0 + n, a ' + x0)), n0 ≠ 0, n + m ≤ m0, n0 + m0 ≤ 1 + # x0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦
Used simplifier rules: ⊦ 0 < m ↔ m ≠ 0; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (a ' + x).tail = x; (s) ⊦ n -1 = n - 1; (s)
| firstn(m, restn(n, firstn(m0, restn(n0 - 1, x0)))) ≠ firstn(m, restn(n0 + n, a ' + x0)), n0 ≠ 0, n + m ≤ m0, n0 + m0 ≤ 1 + # x0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦ |
n0 = m3 + 1, firstn(m, restn(n, firstn(m0, restn(m3, x0)))) ≠ firstn(m, restn(n0 + n, a ' + x0)), n0 ≠ 0, n0 + m0 ≤ 1 + # x0, n + m ≤ m0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦
Used simplifier rules: n ≠ 0 ⊦ m = n - 1 ↔ n = m + 1; (elim) Used terms: n0, m3
| n0 = m3 + 1, firstn(m, restn(n, firstn(m0, restn(m3, x0)))) ≠ firstn(m, restn(n0 + n, a ' + x0)), n0 ≠ 0, n0 + m0 ≤ 1 + # x0, n + m ≤ m0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦ |
firstn(m, restn(n, firstn(m0, restn(m3, x0)))) ≠ firstn(m, restn(m3 + n, x0)), n + m ≤ m0, m3 + m0 ≤ # x0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦
Used simplifier rules: restN-rec: ⊦ restn(n + 1, x) = restn(n, x.tail); 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 ≠ 0; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (a ' + x).tail = x; (s)
| firstn(m, restn(n, firstn(m0, restn(m3, x0)))) ≠ firstn(m, restn(m3 + n, x0)), n + m ≤ m0, m3 + m0 ≤ # x0, ∀ m1, n1, m2, n2. firstn(m1, restn(n1, firstn(m2, restn(n2, x0)))) = firstn(m1, restn(n2 + n1, x0)) ∨ ¬ n2 + m2 ≤ # x0 ∨ ¬ n1 + m1 ≤ m2 ⊦ |
Used terms: m, n, m0, m3
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.