| ⌜m⌝ = # σ, (σ0 to m + 1) + σ1 = σσ[n], ⌜m⌝ < # σ0, mon(σσ), ⌜n⌝ < # σσ, ⌜n⌝ < # σσ → (∃ σ1. σσ[n] + σ1 = σ), ∀ n. ⌜n⌝ < # σσ → (∃ σ1. σσ[n] + σ1 = σ0), ∀ m. ¬ # σ < ⌜m⌝ → (∃ n. ⌜n⌝ < # σσ ∧ (∃ σ1. (σ to m) + σ1 = σσ[n])) ⊦ ⌜m⌝ = # σ0, σσ = [] |
⌜m⌝ = # σσ[n] + # σ2, (σ0 to m + 1) + σ1 = σσ[n], ⌜m⌝ < # σ0, mon(σσ), ⌜n⌝ < # σσ, ∀ n. ⌜n⌝ < # σσ → (∃ σ1. σσ[n] + σ1 = σ0), ∀ m0. ¬ m < m0 → (∃ n0. ⌜n0⌝ < # σσ ∧ (∃ σ1. (σσ[n] + σ2 to m0) + σ1 = σσ[n0])) ⊦ ⌜m⌝ = # σ0, σσ = []
Used simplifier rules: less-fin: ⊦ ⌜m⌝ < ⌜n⌝ ↔ m < n; from specification nat-inf%append-assoc: ⊦ (σ + σ1) + σ2 = σ + σ1 + σ2; from specification stream%size-append: ⊦ #(σ + σ1) = # σ + # σ1; from specification stream