(** Infinitely many silent transitions *)
CoInductive forever_silent (ge: genv): state -> Prop :=
| forever_silent_intro: forall s1 s2,
step ge s1 E0 s2 -> forever_silent ge s2 ->
forever_silent ge s1.
(** An alternate definition. *)
CoInductive forever_silent_N (ge: genv) : A -> state -> Prop :=
| forever_silent_N_star: forall s1 s2 a1 a2,
star ge s1 E0 s2 ->
order a2 a1 ->
forever_silent_N ge a2 s2 ->
forever_silent_N ge a1 s1
| forever_silent_N_plus: forall s1 s2 a1 a2,
plus ge s1 E0 s2 ->
forever_silent_N ge a2 s2 ->
forever_silent_N ge a1 s1.

(* Specifications: *)
Lemma forever_silent_N_inv:
forall ge a s,
forever_silent_N ge a s ->
exists s', exists a',
step ge s E0 s' /\ forever_silent_N ge a' s'.
Lemma forever_silent_N_forever:
forall ge a s, forever_silent_N ge a s -> forever_silent ge s.