| mon<(rem(⌜nl0⌝ , np)), mon<(⌜nl0⌝ + ⌜m '⌝ ), ∀ nl1, np. # nl1 < #(nl0 + m ') → mon<(⌜nl1⌝ ) → mon<(rem(⌜nl1⌝ , np)) ⊦ np(# nl0), ∀ n. ⌜n⌝ + ⌜1⌝ < #(rem(⌜nl0⌝ , np) + ⌜m '⌝ ) → (rem(⌜nl0⌝ , np) + ⌜m '⌝ )[n] < (rem(⌜nl0⌝ , np) + ⌜m '⌝ )[n + 1] |
⌜n⌝ < # rem(⌜nl0⌝ , np), mon<(⌜nl0⌝ + ⌜m '⌝ ), mon<(rem(⌜nl0⌝ , np)), (rem(⌜nl0⌝ , np) + ⌜m '⌝ )[n + 1] ≤ rem(⌜nl0⌝ , np)[n], ∀ nl1, np. # nl1 < #(nl0 + m ') → mon<(⌜nl1⌝ ) → mon<(rem(⌜nl1⌝ , np)) ⊦ np(# nl0)
Used simplifier rules: ⊦ m < n ↔ ¬ n ≤ m; (ss)% ⊦ ⌜m⌝ < # nσ → (nσ + nσ0)[m] = nσ[m]; (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⌝ + n∞1 < ⌜n⌝ + n∞2 ↔ n∞1 < n∞2; (s)%append-assoc: ⊦ (nσ + nσ0) + nσ1 = nσ + nσ0 + nσ1; from specification stream[natstream]% ⊦ # m ' = 0 +1; (s)% ⊦ # ⌜nl⌝ = ⌜# nl⌝ ; (s)% ⊦ #(nσ + nσ0) = # nσ + # nσ0; (s)