| # buf1 = n2 + n1 + m, finp(⌜buf1⌝ ), n0 + m ≤ # buf0 ⊦ ⌜n2⌝ = ⌜(# ⌜buf1⌝ ).n - n1 + m⌝ , #(⌜buf0⌝ from n0) < ⌜m⌝ , # ⌜buf1⌝ < ⌜n1 + m⌝ |
# buf1 = n2 + n1 + m, ⌜dx⌝ = ⌜buf1⌝ , m + n1 ≤ # buf1, n0 + m ≤ # buf0 ⊦ n2 = # buf1 - n1 + m, #(⌜buf0⌝ from n0) < ⌜m⌝
Used simplifier rules: ⊦ ⌜dx⌝ = ⌜dx0⌝ ↔ dx = dx0; (s)% ⊦ finp(⌜dx⌝ ); (s)%stream-fin-forward: ⊦ finp(σ0) → (∃ dx. ⌜dx⌝ = σ0); (forward) from specification stream-basic[buffer-inf]%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 ↔ ¬ n ≤ m; (ss)% ⊦ ⌜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)% ⊦ ⌜m⌝ = ⌜m0⌝ ↔ m = m0; (s)% ⊦ ⌜m⌝ .n = m; (s)% ⊦ # ⌜buf⌝ = ⌜# buf⌝ ; (s)