| prefixn(h, xs1 + ys) = prefixn(h, xs0), xs = xs1, xs_len = # xs1, # xs1 < h, # xs1 + # ys ≤ # xs0, ys = [] ∨ # ys = h ⊦ xs_len + 1 = h, prefixn(h, (a + xs) + ys) = prefixn(h, a ' + xs0) ∧ #(a + xs) + # ys ≤ # xs0 + 1 |
prefixn(h, xs1 + ys) = prefixn(h, xs0), # xs1 < h, # xs1 + 1 < h, # xs1 + # ys ≤ # xs0, ys = [] ∨ # ys = h ⊦ # xs1 + 1 = h, prefixn(h - 1, xs1 + ys) = prefixn(h - 1, xs0)
Used simplifier rules: prefixn-add: n ≠ 0 ⊦ prefixn(n, a ' + x0) = prefixn(n, a ' + x1) ↔ prefixn(n - 1, x0) = prefixn(n - 1, x1);%succ-03: ⊦ m < n ∧ m + 1 ≠ n → m + 1 < n; (forward) from specification nat-basic%c: ⊦ m + n = n + m; from specification nat-basic% ⊦ n ≤ n0 ∧ n1 ≤ m → n + n1 ≤ n0 + m; (s)%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ m +1 = m + 1; (s)% ⊦ #(a ' + x) = (# x)+1; (s)% ⊦ m < n → n ≠ 0; (s)%a: ⊦ (x + y) + z = x + y + z; from specification list% ⊦ a + x = a ' + x; (s)