Definition traces (state: Type): Type := Ensemble (trace state).Definition traces_app {state: Type} (d1 d2: traces state): traces state :=
  fun tr =>
    (exists tr1 tr2, d1 tr1 /\ d2 tr2 /\ tr = stream_app tr1 tr2) \/
  (exists tr1, d1 tr1 /\ (end_state tr1 NonTerminating \/ end_state tr1 Error) /\ tr = tr1).Fixpoint traces_power {state: Type} (d: traces state) (n: nat): traces state :=
  match n with
  | 0 => is_empty_stream
  | S n => traces_app (traces_power d n) d
  end.Definition traces_pstar {state: Type} (d: traces state): traces state :=
  fun tr => exists n, traces_power d n tr.Definition traces_pomega {state: Type} (d: traces state): traces state :=
  fun tr => exists f, tr = stream_capp f /\ forall n, d (f n).

(* Specifications: *)
Lemma traces_app_mono {state: Type}: forall (d1 d2 d3 d4: traces state), Included _ d1 d3 -> Included _ d2 d4 -> Included _ (traces_app d1 d2) (traces_app d3 d4).
Lemma traces_power_mono {state: Type}: forall (d1 d2: traces state) (n: nat), Included _ d1 d2 -> Included _ (traces_power d1 n) (traces_power d2 n).
Lemma traces_pstar_mono {state: Type}: forall (d1 d2: traces state), Included _ d1 d2 -> Included _ (traces_pstar d1) (traces_pstar d2).
Lemma traces_pomega_mono {state: Type}: forall (d1 d2: traces state), Included _ d1 d2 -> Included _ (traces_pomega d1) (traces_pomega d2).