Program Definition stream_app {A: Type} (h1 h2: stream A): stream A :=
fun n: nat =>
match partial_stream_len h1 n return option A with
| None => h1 n
| Some m => h2 (n - m)
end.
Next Obligation.
destruct (partial_stream_len h1 x) eqn:?H.
+ pose proof H1.
apply (partial_stream_len_mono2 h1 x y n) in H1; [| omega].
rewrite H1.
apply (stream_sound1 h2 (x - n) (y - n)); auto.
omega.
+ unfold partial_stream_len in H1.
rewrite H0 in H1.
congruence.
Qed.

Lemma stream_app_spec2 {A: Type}: forall (h1 h2: stream A) (n m: nat),
is_n_stream n h1 ->
stream_app h1 h2 (m + n) = h2 m.