CoInductive possible_traceinf: world -> traceinf -> Prop :=
| possible_traceinf_cons: forall w1 ev w2 T,
possible_event w1 ev w2 ->
possible_traceinf w2 T ->
possible_traceinf w1 (Econsinf ev T).

(* Specifications: *)
Lemma possible_traceinf_app:
forall t2 w0 t1 w1,
possible_trace w0 t1 w1 -> possible_traceinf w1 t2 ->
possible_traceinf w0 (t1 *** t2).
Lemma possible_traceinf_app_inv:
forall t2 t1 w0,
possible_traceinf w0 (t1 *** t2) ->
exists w1, possible_trace w0 t1 w1 /\ possible_traceinf w1 t2.
Lemma possible_traceinf_app:
forall t2 w0 t1 w1,
possible_trace w0 t1 w1 -> possible_traceinf w1 t2 ->
possible_traceinf w0 (t1 *** t2).
Lemma possible_traceinf_app_inv:
forall t2 t1 w0,
possible_traceinf w0 (t1 *** t2) ->
exists w1, possible_trace w0 t1 w1 /\ possible_traceinf w1 t2.