| finout(g) ⊦ ∀ x. x ≠ [] ∧ pathp(g)(⌜x⌝ ) ∧ haspathanylength(g)(x.last) → (∃ y. (∃ b. y = x + b ') ∧ pathp(g)(⌜y⌝ ) ∧ haspathanylength(g)(y.last)) |
x ≠ [], haspathanylength(g)(x.last), pathp(g)(⌜x⌝ ), ∀ a. ∃ s. ∀ b. edge(g)(a, b) ↔ b ∈ s ⊦ ∃ y. (∃ b. y = x + b ') ∧ pathp(g)(⌜y⌝ ) ∧ haspathanylength(g)(y.last)
Used simplifier rules: finout-def: ⊦ finout(g) ↔ (∀ a. ∃ s. ∀ b. edge(g)(a, b) ↔ b ∈ s);
| x ≠ [], haspathanylength(g)(x.last), pathp(g)(⌜x⌝ ), ∀ a. ∃ s. ∀ b. edge(g)(a, b) ↔ b ∈ s ⊦ ∃ y. (∃ b. y = x + b ') ∧ pathp(g)(⌜y⌝ ) ∧ haspathanylength(g)(y.last) |
x ≠ [], haspathanylength(g)(x.last), pathp(g)(⌜x⌝ ), ∃ s. ∀ b. edge(g)(x.last, b) ↔ b ∈ s ⊦ ∃ y. (∃ b. y = x + b ') ∧ pathp(g)(⌜y⌝ ) ∧ haspathanylength(g)(y.last)
Used terms: x.last
| x ≠ [], haspathanylength(g)(x.last), pathp(g)(⌜x⌝ ), ∃ s. ∀ b. edge(g)(x.last, b) ↔ b ∈ s ⊦ ∃ y. (∃ b. y = x + b ') ∧ pathp(g)(⌜y⌝ ) ∧ haspathanylength(g)(y.last) |
x ≠ [], haspathanylength(g)(x.last), pathp(g)(⌜x⌝ ), ∀ b. edge(g)(x.last, b) ↔ b ∈ s ⊦ ∃ y. (∃ b. y = x + b ') ∧ pathp(g)(⌜y⌝ ) ∧ haspathanylength(g)(y.last)
| x ≠ [], haspathanylength(g)(x.last), pathp(g)(⌜x⌝ ), ∀ b. edge(g)(x.last, b) ↔ b ∈ s ⊦ ∃ y. (∃ b. y = x + b ') ∧ pathp(g)(⌜y⌝ ) ∧ haspathanylength(g)(y.last) |
x ≠ [], haspathanylength(g)(x.last), pathp(g)(⌜x⌝ ), ∀ b. edge(g)(x.last, b) ↔ b ∈ s, ∀ a. a ∈ s → ¬ haspathanylength(g)(a) ⊦ ∃ y. (∃ b. y = x + b ') ∧ pathp(g)(⌜y⌝ ) ∧ haspathanylength(g)(y.last)
x ≠ [], haspathanylength(g)(x.last), pathp(g)(⌜x⌝ ), ∀ b. edge(g)(x.last, b) ↔ b ∈ s ⊦ ∀ a. a ∈ s → ¬ haspathanylength(g)(a), ∃ y. (∃ b. y = x + b ') ∧ pathp(g)(⌜y⌝ ) ∧ haspathanylength(g)(y.last)
Used formulas: ∀ a. a ∈ s → ¬ haspathanylength(g)(a)
| x ≠ [], haspathanylength(g)(x.last), pathp(g)(⌜x⌝ ), ∀ b. edge(g)(x.last, b) ↔ b ∈ s, ∀ a. a ∈ s → ¬ haspathanylength(g)(a) ⊦ ∃ y. (∃ b. y = x + b ') ∧ pathp(g)(⌜y⌝ ) ∧ haspathanylength(g)(y.last) |
∀ b. edge(g)(a, b) ↔ b ∈ s, ∀ b. b ∈ s → ¬ haspathanylength(g)(b) ⊦ ¬ haspathanylength(g)(a)
x ≠ [], haspathanylength(g)(x.last), pathp(g)(⌜x⌝ ), ∀ a. a ∈ s → ¬ haspathanylength(g)(a), ∀ b. edge(g)(x.last, b) ↔ b ∈ s ⊦ ∀ b. b ∈ s → ¬ haspathanylength(g)(b), ∃ y. (∃ b. y = x + b ') ∧ pathp(g)(⌜y⌝ ) ∧ haspathanylength(g)(y.last)
Used terms: g, x.last, s
| ∀ b. edge(g)(a, b) ↔ b ∈ s, ∀ b. b ∈ s → ¬ haspathanylength(g)(b) ⊦ ¬ haspathanylength(g)(a) |
| x ≠ [], haspathanylength(g)(x.last), pathp(g)(⌜x⌝ ), ∀ a. a ∈ s → ¬ haspathanylength(g)(a), ∀ b. edge(g)(x.last, b) ↔ b ∈ s ⊦ ∀ b. b ∈ s → ¬ haspathanylength(g)(b), ∃ y. (∃ b. y = x + b ') ∧ pathp(g)(⌜y⌝ ) ∧ haspathanylength(g)(y.last) |
# s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(x.last), haspathanylength(g)(b), pathp(g)(⌜x⌝ ), b ∈ s, ∀ a. a ∈ s → ¬ haspathanylength(g)(a), ∀ b. edge(g)(x.last, b) ↔ b ∈ s ⊦ ∃ y. (∃ b. y = x + b ') ∧ pathp(g)(⌜y⌝ ) ∧ haspathanylength(g)(y.last)
Used simplifier rules: size-zero-01: ⊦ s ≠ ∅ → # s ≠ 0; (forward) from specification set-basic ne-01: ⊦ a ∈ s → s ≠ ∅; (forward) from specification set-basic
| # s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(x.last), haspathanylength(g)(b), pathp(g)(⌜x⌝ ), b ∈ s, ∀ a. a ∈ s → ¬ haspathanylength(g)(a), ∀ b. edge(g)(x.last, b) ↔ b ∈ s ⊦ ∃ y. (∃ b. y = x + b ') ∧ pathp(g)(⌜y⌝ ) ∧ haspathanylength(g)(y.last) |
Used terms: b
| x ≠ [], haspathanylength(g)(x.last), pathp(g)(⌜x⌝ ), ∀ b. edge(g)(x.last, b) ↔ b ∈ s ⊦ ∀ a. a ∈ s → ¬ haspathanylength(g)(a), ∃ y. (∃ b. y = x + b ') ∧ pathp(g)(⌜y⌝ ) ∧ haspathanylength(g)(y.last) |
# s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(x.last), haspathanylength(g)(a), pathp(g)(⌜x⌝ ), a ∈ s, ∀ b. edge(g)(x.last, b) ↔ b ∈ s ⊦ ∃ y. (∃ b. y = x + b ') ∧ pathp(g)(⌜y⌝ ) ∧ haspathanylength(g)(y.last)
Used simplifier rules: size-zero-01: ⊦ s ≠ ∅ → # s ≠ 0; (forward) from specification set-basic ne-01: ⊦ a ∈ s → s ≠ ∅; (forward) from specification set-basic
| # s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(x.last), haspathanylength(g)(a), pathp(g)(⌜x⌝ ), a ∈ s, ∀ b. edge(g)(x.last, b) ↔ b ∈ s ⊦ ∃ y. (∃ b. y = x + b ') ∧ pathp(g)(⌜y⌝ ) ∧ haspathanylength(g)(y.last) |
# s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(a), haspathanylength(g)(x.last), pathp(g)(⌜x⌝ ), a ∈ s, ∀ b. edge(g)(x.last, b) ↔ b ∈ s ⊦ (∃ b. x + a ' = x + b ') ∧ pathp(g)(⌜x + a '⌝ ) ∧ haspathanylength(g)((x + a ').last)
Used terms: x + a '
| # s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(a), haspathanylength(g)(x.last), pathp(g)(⌜x⌝ ), a ∈ s, ∀ b. edge(g)(x.last, b) ↔ b ∈ s ⊦ (∃ b. x + a ' = x + b ') ∧ pathp(g)(⌜x + a '⌝ ) ∧ haspathanylength(g)((x + a ').last) |
# s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(x.last), haspathanylength(g)(a), pathp(g)(⌜x⌝ ), a ∈ s, ¬ pathp(g)(⌜x⌝ + ⌜a '⌝ ), ∀ b. edge(g)(x.last, b) ↔ b ∈ s ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ (x + a ').last = a; (s) ⊦ ⌜x + y⌝ = ⌜x⌝ + ⌜y⌝ ; (s) ⊦ a ' = a0 ' ↔ a = a0; (s) ⊦ # x = # z → (x + y = z + y0 ↔ x = z ∧ y = y0); (ws)
| # s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(x.last), haspathanylength(g)(a), pathp(g)(⌜x⌝ ), a ∈ s, ¬ pathp(g)(⌜x⌝ + ⌜a '⌝ ), ∀ b. edge(g)(x.last, b) ↔ b ∈ s ⊦ |
⊦ pathp(g)(σ) ↔ (∀ n. ⌜n⌝ < # σ → dom(g)(σ[n])) ∧ (∀ n. ⌜n + 1⌝ < # σ → edge(g)(σ[n], σ[n + 1]))
# s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(a), haspathanylength(g)(x.last), a ∈ s, ¬ pathp(g)(⌜x⌝ + ⌜a '⌝ ), ∀ b. edge(g)(x.last, b) ↔ b ∈ s, ∀ n. ⌜n⌝ < # ⌜x⌝ → dom(g)(⌜x⌝ [n]), ∀ n. ⌜n + 1⌝ < # ⌜x⌝ → edge(g)(⌜x⌝ [n], ⌜x⌝ [n + 1]) ⊦
Used terms: ⌜x⌝ , g
| ⊦ pathp(g)(σ) ↔ (∀ n. ⌜n⌝ < # σ → dom(g)(σ[n])) ∧ (∀ n. ⌜n + 1⌝ < # σ → edge(g)(σ[n], σ[n + 1])) |
| # s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(a), haspathanylength(g)(x.last), a ∈ s, ¬ pathp(g)(⌜x⌝ + ⌜a '⌝ ), ∀ b. edge(g)(x.last, b) ↔ b ∈ s, ∀ n. ⌜n⌝ < # ⌜x⌝ → dom(g)(⌜x⌝ [n]), ∀ n. ⌜n + 1⌝ < # ⌜x⌝ → edge(g)(⌜x⌝ [n], ⌜x⌝ [n + 1]) ⊦ |
# s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(x.last), haspathanylength(g)(a), a ∈ s, ¬ pathp(g)(⌜x⌝ + ⌜a '⌝ ), ∀ b. edge(g)(x.last, b) ↔ b ∈ s, ∀ n. n + 1 < # x → edge(g)(x[n], x[n + 1]), ∀ n. n < # x → dom(g)(x[n]) ⊦
Used simplifier rules: ⊦ ⌜x⌝ [n] = x[n]; (s) ⊦ ⌜m⌝ < ⌜n⌝ ↔ m < n; (s) ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) add-comm: ⊦ n∞1 + n∞2 = n∞2 + n∞1; from specification nat-inf add-assoc: ⊦ (n∞ + n∞1) + n∞2 = n∞ + n∞1 + n∞2; from specification nat-inf ⊦ ⌜n⌝ + ⌜m⌝ < ⌜n0⌝ ↔ n + m < n0; (s) c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ ⌜m + n⌝ = ⌜m⌝ + ⌜n⌝ ; (s)
| # s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(x.last), haspathanylength(g)(a), a ∈ s, ¬ pathp(g)(⌜x⌝ + ⌜a '⌝ ), ∀ b. edge(g)(x.last, b) ↔ b ∈ s, ∀ n. n + 1 < # x → edge(g)(x[n], x[n + 1]), ∀ n. n < # x → dom(g)(x[n]) ⊦ |
⊦ pathp(g)(σ) ↔ (∀ n. ⌜n⌝ < # σ → dom(g)(σ[n])) ∧ (∀ n. ⌜n + 1⌝ < # σ → edge(g)(σ[n], σ[n + 1]))
# s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(a), haspathanylength(g)(x.last), a ∈ s, ∀ n. n < # x → dom(g)(x[n]), ∀ n. n + 1 < # x → edge(g)(x[n], x[n + 1]), ∀ b. edge(g)(x.last, b) ↔ b ∈ s, (∃ n. ¬(⌜n⌝ < #(⌜x⌝ + ⌜a '⌝ ) → dom(g)((⌜x⌝ + ⌜a '⌝ )[n]))) ∨ (∃ n. ¬(⌜n + 1⌝ < #(⌜x⌝ + ⌜a '⌝ ) → edge(g)((⌜x⌝ + ⌜a '⌝ )[n], (⌜x⌝ + ⌜a '⌝ )[n + 1]))) ⊦
Used terms: ⌜x⌝ + ⌜a '⌝ , g
| ⊦ pathp(g)(σ) ↔ (∀ n. ⌜n⌝ < # σ → dom(g)(σ[n])) ∧ (∀ n. ⌜n + 1⌝ < # σ → edge(g)(σ[n], σ[n + 1])) |
| # s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(a), haspathanylength(g)(x.last), a ∈ s, ∀ n. n < # x → dom(g)(x[n]), ∀ n. n + 1 < # x → edge(g)(x[n], x[n + 1]), ∀ b. edge(g)(x.last, b) ↔ b ∈ s, (∃ n. ¬(⌜n⌝ < #(⌜x⌝ + ⌜a '⌝ ) → dom(g)((⌜x⌝ + ⌜a '⌝ )[n]))) ∨ (∃ n. ¬(⌜n + 1⌝ < #(⌜x⌝ + ⌜a '⌝ ) → edge(g)((⌜x⌝ + ⌜a '⌝ )[n], (⌜x⌝ + ⌜a '⌝ )[n + 1]))) ⊦ |
# s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(x.last), haspathanylength(g)(a), a ∈ s, ∀ b. edge(g)(x.last, b) ↔ b ∈ s, ∀ n. n + 1 < # x → edge(g)(x[n], x[n + 1]), ∀ n. n < # x → dom(g)(x[n]), ¬(¬ # x < n → dom(g)((x + a ')[n])) ∨ ¬(n0 < # x → edge(g)(x[n0], (x + a ')[n0 + 1])) ⊦
Used simplifier rules: append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream ⊦ (⌜x⌝ + ⌜x0⌝ )[m] = (x + x0)[m]; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ n < # x → (x + a ')[n] = x[n]; (s) add-comm: ⊦ n∞1 + n∞2 = n∞2 + n∞1; from specification nat-inf add-assoc: ⊦ (n∞ + n∞1) + n∞2 = n∞ + n∞1 + n∞2; from specification nat-inf ⊦ ⌜m⌝ < ⌜n⌝ ↔ m < n; (s) ⊦ n∞ + ⌜0⌝ = n∞; (s) ⊦ m ≤ n → (⌜(* m)⌝ + n∞2 < ⌜(* n)⌝ + n∞1 ↔ n∞2 < ⌜n - m⌝ + n∞1); (s) ⊦ # a ' = 0 +1; (s) ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) ⊦ #(σ + σ1) = # σ + # σ1; (s) c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ ⌜m + n⌝ = ⌜m⌝ + ⌜n⌝ ; (s) ⊦ ⌜n⌝ < ⌜1⌝ + n∞ ↔ ¬ n∞ < ⌜n⌝ ; (s)
| # s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(x.last), haspathanylength(g)(a), a ∈ s, ∀ b. edge(g)(x.last, b) ↔ b ∈ s, ∀ n. n + 1 < # x → edge(g)(x[n], x[n + 1]), ∀ n. n < # x → dom(g)(x[n]), ¬(¬ # x < n → dom(g)((x + a ')[n])) ∨ ¬(n0 < # x → edge(g)(x[n0], (x + a ')[n0 + 1])) ⊦ |
# s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(a), haspathanylength(g)(x.last), a ∈ s, ¬ # x < n, ¬ dom(g)((x + a ')[n]), ∀ n. n < # x → dom(g)(x[n]), ∀ n. n + 1 < # x → edge(g)(x[n], x[n + 1]), ∀ b. edge(g)(x.last, b) ↔ b ∈ s ⊦
# s ≠ 0, s ≠ ∅, x ≠ [], n0 < # x, haspathanylength(g)(a), haspathanylength(g)(x.last), a ∈ s, ¬ edge(g)(x[n0], (x + a ')[n0 + 1]), ∀ n. n < # x → dom(g)(x[n]), ∀ n. n + 1 < # x → edge(g)(x[n], x[n + 1]), ∀ b. edge(g)(x.last, b) ↔ b ∈ s ⊦
| # s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(a), haspathanylength(g)(x.last), a ∈ s, ¬ # x < n, ¬ dom(g)((x + a ')[n]), ∀ n. n < # x → dom(g)(x[n]), ∀ n. n + 1 < # x → edge(g)(x[n], x[n + 1]), ∀ b. edge(g)(x.last, b) ↔ b ∈ s ⊦ |
# s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(x.last), haspathanylength(g)(a), a ∈ s, n ≤ # x, ¬ dom(g)((x + a ')[n]), ∀ b. edge(g)(x.last, b) ↔ b ∈ s, ∀ n. n + 1 < # x → edge(g)(x[n], x[n + 1]), ∀ n. n < # x → dom(g)(x[n]) ⊦
Used simplifier rules: ⊦ m < n ↔ ¬ n ≤ m; (ss)
| # s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(x.last), haspathanylength(g)(a), a ∈ s, n ≤ # x, ¬ dom(g)((x + a ')[n]), ∀ b. edge(g)(x.last, b) ↔ b ∈ s, ∀ n. n + 1 < # x → edge(g)(x[n], x[n + 1]), ∀ n. n < # x → dom(g)(x[n]) ⊦ |
# s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(a), haspathanylength(g)(x.last), a ∈ s, n ≤ # x, ¬ dom(g)((x + a ')[n]), n < # x → dom(g)(x[n]), ∀ n. n + 1 < # x → edge(g)(x[n], x[n + 1]), ∀ b. edge(g)(x.last, b) ↔ b ∈ s ⊦
Used terms: n
| # s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(a), haspathanylength(g)(x.last), a ∈ s, n ≤ # x, ¬ dom(g)((x + a ')[n]), n < # x → dom(g)(x[n]), ∀ n. n + 1 < # x → edge(g)(x[n], x[n + 1]), ∀ b. edge(g)(x.last, b) ↔ b ∈ s ⊦ |
⊦ haspathanylength(g)(a) ↔ (∀ n. ∃ x. x.head = a ∧ # x = n + 1 ∧ pathp(g)(⌜x⌝ ))
# s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(x.last), a ∈ s, n ≤ # x, ¬ dom(g)((x + a ')[n]), n < # x → dom(g)(x[n]), ∀ b. edge(g)(x.last, b) ↔ b ∈ s, ∀ n. n + 1 < # x → edge(g)(x[n], x[n + 1]), ∀ n. ∃ x. x.head = a ∧ # x = n + 1 ∧ pathp(g)(⌜x⌝ ) ⊦
Used terms: a, g
| ⊦ haspathanylength(g)(a) ↔ (∀ n. ∃ x. x.head = a ∧ # x = n + 1 ∧ pathp(g)(⌜x⌝ )) |
| # s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(x.last), a ∈ s, n ≤ # x, ¬ dom(g)((x + a ')[n]), n < # x → dom(g)(x[n]), ∀ b. edge(g)(x.last, b) ↔ b ∈ s, ∀ n. n + 1 < # x → edge(g)(x[n], x[n + 1]), ∀ n. ∃ x. x.head = a ∧ # x = n + 1 ∧ pathp(g)(⌜x⌝ ) ⊦ |
# s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(x.last), a ∈ s, n ≤ # x, ¬ dom(g)((x + a ')[n]), n < # x → dom(g)(x[n]), ∀ n. n + 1 < # x → edge(g)(x[n], x[n + 1]), ∀ b. edge(g)(x.last, b) ↔ b ∈ s, ∃ x. x.head = a ∧ # x = 0 + 1 ∧ pathp(g)(⌜x⌝ ) ⊦
Used terms: 0
| # s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(x.last), a ∈ s, n ≤ # x, ¬ dom(g)((x + a ')[n]), n < # x → dom(g)(x[n]), ∀ n. n + 1 < # x → edge(g)(x[n], x[n + 1]), ∀ b. edge(g)(x.last, b) ↔ b ∈ s, ∃ x. x.head = a ∧ # x = 0 + 1 ∧ pathp(g)(⌜x⌝ ) ⊦ |
x0 = x0.head ', # s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(x.last), pathp(g)(⌜x0⌝ ), x0.head ∈ s, n ≤ # x, ¬ dom(g)((x + x0)[n]), n < # x → dom(g)(x[n]), ∀ b. edge(g)(x.last, b) ↔ b ∈ s, ∀ n. n + 1 < # x → edge(g)(x[n], x[n + 1]) ⊦
Used simplifier rules: a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ x + [] = x; (s) ⊦ a + x = a ' + x; (s) ⊦ # x = 1 ↔ x = x.head + []; (as) c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic
| x0 = x0.head ', # s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(x.last), pathp(g)(⌜x0⌝ ), x0.head ∈ s, n ≤ # x, ¬ dom(g)((x + x0)[n]), n < # x → dom(g)(x[n]), ∀ b. edge(g)(x.last, b) ↔ b ∈ s, ∀ n. n + 1 < # x → edge(g)(x[n], x[n + 1]) ⊦ |
x0 = a ', x0 = a + x1, # s ≠ 0, s ≠ ∅, x ≠ [], x0 ≠ [], haspathanylength(g)(x.last), pathp(g)(⌜x0⌝ ), a ∈ s, n ≤ # x, ¬ dom(g)((x + x0)[n]), n < # x → dom(g)(x[n]), ∀ n. n + 1 < # x → edge(g)(x[n], x[n + 1]), ∀ b. edge(g)(x.last, b) ↔ b ∈ s ⊦
Used simplifier rules: ⊦ a ' ≠ []; (s) x ≠ [] ⊦ a = x.head ∧ y = x.tail ↔ x = a + y; (elim) Used terms: x0, a, x1
| x0 = a ', x0 = a + x1, # s ≠ 0, s ≠ ∅, x ≠ [], x0 ≠ [], haspathanylength(g)(x.last), pathp(g)(⌜x0⌝ ), a ∈ s, n ≤ # x, ¬ dom(g)((x + x0)[n]), n < # x → dom(g)(x[n]), ∀ n. n + 1 < # x → edge(g)(x[n], x[n + 1]), ∀ b. edge(g)(x.last, b) ↔ b ∈ s ⊦ |
edge(g)(x.last, a) ↔ a ∈ s, x0 = a + x1, x0 = a ', # s ≠ 0, s ≠ ∅, x ≠ [], x0 ≠ [], haspathanylength(g)(x.last), pathp(g)(⌜x0⌝ ), a ∈ s, n ≤ # x, ¬ dom(g)((x + x0)[n]), n < # x → dom(g)(x[n]), ∀ n. n + 1 < # x → edge(g)(x[n], x[n + 1]) ⊦
Used terms: a
| edge(g)(x.last, a) ↔ a ∈ s, x0 = a + x1, x0 = a ', # s ≠ 0, s ≠ ∅, x ≠ [], x0 ≠ [], haspathanylength(g)(x.last), pathp(g)(⌜x0⌝ ), a ∈ s, n ≤ # x, ¬ dom(g)((x + x0)[n]), n < # x → dom(g)(x[n]), ∀ n. n + 1 < # x → edge(g)(x[n], x[n + 1]) ⊦ |
# s ≠ 0, s ≠ ∅, x ≠ [], edge(g)(x.last, a), haspathanylength(g)(x.last), pathp(g)(⌜a '⌝ ), a ∈ s, n ≤ # x, ¬ dom(g)((x + a ')[n]), n < # x → dom(g)(x[n]), ∀ n. n + 1 < # x → edge(g)(x[n], x[n + 1]) ⊦
Used simplifier rules: ⊦ a ' ≠ []; (s) a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ a ' = a0 ' + x ↔ a = a0 ∧ x = []; (ws) ⊦ a + x = a ' + x; (s)
| # s ≠ 0, s ≠ ∅, x ≠ [], edge(g)(x.last, a), haspathanylength(g)(x.last), pathp(g)(⌜a '⌝ ), a ∈ s, n ≤ # x, ¬ dom(g)((x + a ')[n]), n < # x → dom(g)(x[n]), ∀ n. n + 1 < # x → edge(g)(x[n], x[n + 1]) ⊦ |
⊦ pathp(g)(σ) ↔ (∀ n. ⌜n⌝ < # σ → dom(g)(σ[n])) ∧ (∀ n. ⌜n + 1⌝ < # σ → edge(g)(σ[n], σ[n + 1]))
# s ≠ 0, s ≠ ∅, x ≠ [], edge(g)(x.last, a), haspathanylength(g)(x.last), a ∈ s, n ≤ # x, ¬ dom(g)((x + a ')[n]), n < # x → dom(g)(x[n]), ∀ n. n + 1 < # x → edge(g)(x[n], x[n + 1]), ∀ n. ⌜n⌝ < # ⌜a '⌝ → dom(g)(⌜a '⌝ [n]), ∀ n. ⌜n + 1⌝ < # ⌜a '⌝ → edge(g)(⌜a '⌝ [n], ⌜a '⌝ [n + 1]) ⊦
Used terms: g, ⌜a '⌝
| ⊦ pathp(g)(σ) ↔ (∀ n. ⌜n⌝ < # σ → dom(g)(σ[n])) ∧ (∀ n. ⌜n + 1⌝ < # σ → edge(g)(σ[n], σ[n + 1])) |
| # s ≠ 0, s ≠ ∅, x ≠ [], edge(g)(x.last, a), haspathanylength(g)(x.last), a ∈ s, n ≤ # x, ¬ dom(g)((x + a ')[n]), n < # x → dom(g)(x[n]), ∀ n. n + 1 < # x → edge(g)(x[n], x[n + 1]), ∀ n. ⌜n⌝ < # ⌜a '⌝ → dom(g)(⌜a '⌝ [n]), ∀ n. ⌜n + 1⌝ < # ⌜a '⌝ → edge(g)(⌜a '⌝ [n], ⌜a '⌝ [n + 1]) ⊦ |
# s ≠ 0, s ≠ ∅, x ≠ [], dom(g)(a), edge(g)(x.last, a), haspathanylength(g)(x.last), a ∈ s, n ≤ # x, ¬ dom(g)((x + a ')[n]), n < # x → dom(g)(x[n]), ∀ n. n + 1 < # x → edge(g)(x[n], x[n + 1]) ⊦
Used simplifier rules: ⊦ a '[0] = a; (s) ⊦ ⌜x⌝ [n] = x[n]; (s) ⊦ m < 1 ↔ m = 0; (s) ⊦ ⌜m⌝ < ⌜n⌝ ↔ m < n; (s) ⊦ # a ' = 0 +1; (s) ⊦ # ⌜x⌝ = ⌜# x⌝ ; (s) add-comm: ⊦ n∞1 + n∞2 = n∞2 + n∞1; from specification nat-inf add-assoc: ⊦ (n∞ + n∞1) + n∞2 = n∞ + n∞1 + n∞2; from specification nat-inf ⊦ ¬ n < 0; (s) ⊦ m ≤ n → (⌜(* m)⌝ + n∞2 < ⌜(* n)⌝ ↔ n∞2 < ⌜n - m⌝ ); (s) c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ ⌜m + n⌝ = ⌜m⌝ + ⌜n⌝ ; (s)
| # s ≠ 0, s ≠ ∅, x ≠ [], dom(g)(a), edge(g)(x.last, a), haspathanylength(g)(x.last), a ∈ s, n ≤ # x, ¬ dom(g)((x + a ')[n]), n < # x → dom(g)(x[n]), ∀ n. n + 1 < # x → edge(g)(x[n], x[n + 1]) ⊦ |
⊦ ¬ n < # x → (x + y)[n] = y[n - # x]
Used simplifier rules: ⊦ m < n ↔ ¬ n ≤ m; (ss) ⊦ m ≤ n → (n ≤ m ↔ m = n); (s) ⊦ m ≤ m; (s) ⊦ m - m = 0; (s) ⊦ a '[0] = a; (s) ⊦ m < n → m ≤ n; (s) ⊦ n < # x → (x + a ')[n] = x[n]; (s) a: ⊦ (x + y) + z = x + y + z; from specification list Used terms: x, a ', n
| ⊦ ¬ n < # x → (x + y)[n] = y[n - # x] |
| # s ≠ 0, s ≠ ∅, x ≠ [], n0 < # x, haspathanylength(g)(a), haspathanylength(g)(x.last), a ∈ s, ¬ edge(g)(x[n0], (x + a ')[n0 + 1]), ∀ n. n < # x → dom(g)(x[n]), ∀ n. n + 1 < # x → edge(g)(x[n], x[n + 1]), ∀ b. edge(g)(x.last, b) ↔ b ∈ s ⊦ |
# s ≠ 0, s ≠ ∅, x ≠ [], n0 < # x, haspathanylength(g)(x.last), haspathanylength(g)(a), a ∈ s, ¬ edge(g)(x[n0], (x + a ')[n0 + 1]), n0 + 1 < # x → edge(g)(x[n0], x[n0 + 1]), ∀ b. edge(g)(x.last, b) ↔ b ∈ s, ∀ n. n < # x → dom(g)(x[n]) ⊦
Used terms: n0
| # s ≠ 0, s ≠ ∅, x ≠ [], n0 < # x, haspathanylength(g)(x.last), haspathanylength(g)(a), a ∈ s, ¬ edge(g)(x[n0], (x + a ')[n0 + 1]), n0 + 1 < # x → edge(g)(x[n0], x[n0 + 1]), ∀ b. edge(g)(x.last, b) ↔ b ∈ s, ∀ n. n < # x → dom(g)(x[n]) ⊦ |
# s ≠ 0, s ≠ ∅, x ≠ [], n0 < # x, haspathanylength(g)(x.last), haspathanylength(g)(a), a ∈ s, ¬ edge(g)(x[n0], (x + a ')[n0 + 1]), n0 + 1 < # x → edge(g)(x[n0], x[n0 + 1]), ∀ b. edge(g)(x.last, b) ↔ b ∈ s, ∀ n. n < # x → dom(g)(x[n]) ⊦
Used simplifier rules: ⊦ # x = 0 ↔ x = []; (s) f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic
| # s ≠ 0, s ≠ ∅, x ≠ [], n0 < # x, haspathanylength(g)(x.last), haspathanylength(g)(a), a ∈ s, ¬ edge(g)(x[n0], (x + a ')[n0 + 1]), n0 + 1 < # x → edge(g)(x[n0], x[n0 + 1]), ∀ b. edge(g)(x.last, b) ↔ b ∈ s, ∀ n. n < # x → dom(g)(x[n]) ⊦ |
⊦ n < # x → (x + y)[n] = x[n]
# s ≠ 0, s ≠ ∅, x ≠ [], n0 < # x, haspathanylength(g)(a), haspathanylength(g)(x.last), a ∈ s, ¬ n0 + 1 < # x, ¬ edge(g)(x[n0], (x + a ')[n0 + 1]), n0 + 1 < # x → edge(g)(x[n0], x[n0 + 1]), ∀ n. n < # x → dom(g)(x[n]), ∀ b. edge(g)(x.last, b) ↔ b ∈ s ⊦
Used terms: x, a ', n0 + 1
| ⊦ n < # x → (x + y)[n] = x[n] |
| # s ≠ 0, s ≠ ∅, x ≠ [], n0 < # x, haspathanylength(g)(a), haspathanylength(g)(x.last), a ∈ s, ¬ n0 + 1 < # x, ¬ edge(g)(x[n0], (x + a ')[n0 + 1]), n0 + 1 < # x → edge(g)(x[n0], x[n0 + 1]), ∀ n. n < # x → dom(g)(x[n]), ∀ b. edge(g)(x.last, b) ↔ b ∈ s ⊦ |
# x = n0 + 1, # s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(x.last), haspathanylength(g)(a), a ∈ s, ¬ edge(g)(x[n0], a), ∀ n. ¬ n0 < n → dom(g)(x[n]), ∀ b. edge(g)(x.last, b) ↔ b ∈ s ⊦
Used simplifier rules: c: ⊦ m + n = n + m; from specification nat-basic a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic ⊦ ¬ n < n; (s) ⊦ m < n + 1 ↔ ¬ n < m; (s) ⊦ m + n < m + n0 ↔ n < n0; (s) ⊦ m < n → (n ≤ m + 1 ↔ n = m + 1); (s) ⊦ m + 1 ≠ 0; (s) lf-01: ⊦ m < n ∧ n = n0 → m < n0; (forward) from specification nat-basic f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic eqle-one: ⊦ m = n + 1 ∧ n < n0 → m ≤ n0; (forward) from specification nat a: ⊦ (x + y) + z = x + y + z; from specification list ⊦ n = # x → (x + a ')[n] = a; (s) ⊦ m < n ↔ ¬ n ≤ m; (ss)
| # x = n0 + 1, # s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(x.last), haspathanylength(g)(a), a ∈ s, ¬ edge(g)(x[n0], a), ∀ n. ¬ n0 < n → dom(g)(x[n]), ∀ b. edge(g)(x.last, b) ↔ b ∈ s ⊦ |
# x = n0 + 1, edge(g)(x.last, a) ↔ a ∈ s, # s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(a), haspathanylength(g)(x.last), a ∈ s, ¬ edge(g)(x[n0], a), ∀ n. ¬ n0 < n → dom(g)(x[n]) ⊦
Used terms: a
| # x = n0 + 1, edge(g)(x.last, a) ↔ a ∈ s, # s ≠ 0, s ≠ ∅, x ≠ [], haspathanylength(g)(a), haspathanylength(g)(x.last), a ∈ s, ¬ edge(g)(x[n0], a), ∀ n. ¬ n0 < n → dom(g)(x[n]) ⊦ |
# x = n0 + 1, # s ≠ 0, s ≠ ∅, x ≠ [], edge(g)(x.last, a), haspathanylength(g)(x.last), haspathanylength(g)(a), a ∈ s, ¬ edge(g)(x[n0], a), ∀ n. ¬ n0 < n → dom(g)(x[n]) ⊦
| # x = n0 + 1, # s ≠ 0, s ≠ ∅, x ≠ [], edge(g)(x.last, a), haspathanylength(g)(x.last), haspathanylength(g)(a), a ∈ s, ¬ edge(g)(x[n0], a), ∀ n. ¬ n0 < n → dom(g)(x[n]) ⊦ |
⊦ n = # x - 1 ∧ 0 < # x → x[n] = x.last
Used simplifier rules: ⊦ 0 < m ↔ m ≠ 0; (s) ⊦ # x = 0 ↔ x = []; (s) ⊦ n ≤ m → m + n0 - n = (m - n) + n0; (s) ⊦ n + 0 = n; (s) a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic c: ⊦ m + n = n + m; from specification nat-basic Used terms: x, n0
| ⊦ n = # x - 1 ∧ 0 < # x → x[n] = x.last |
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.