End explicit_safetyN.
Section explicit_safetyN_stutter.
Context {core_data: Type}
{core_ord : core_data -> core_data -> Prop}
(core_ord_wf: well_founded core_ord).
(** *Safety with Stutter and stepN*)
CoInductive exp_safetyN_stutter (cd:core_data) (x:X) (y:Y): Prop:=
| halted_safetyN_stut : halted x y -> exp_safetyN_stutter cd x y
| internal_safetyN_stut cd' y' n: stepN x y y' (S n)  ->
(forall x',  valid x' y' -> exp_safetyN_stutter cd' x' y') ->
exp_safetyN_stutter cd x y
| external_safetyN_stut cd' x' y': ext_step x y x' y' ->
(forall x',  valid x' y' -> exp_safetyN_stutter cd' x' y') ->
exp_safetyN_stutter cd x y
| stutter cd': core_ord cd' cd ->
exp_safetyN_stutter cd' x y ->
exp_safetyN_stutter cd x y.
(*Paco version*)
Inductive exp_safetyN_stutter_gen {_exp_safety} (cd:core_data) (x:X) (y:Y): Prop:=
| paco_halted_safetyN_stut : halted x y -> exp_safetyN_stutter_gen cd x y
| paco_internal_safetyN_stut cd' y' n: stepN x y y' (S n)  ->
(forall x',  valid x' y' -> _exp_safety cd' x' y') ->
exp_safetyN_stutter_gen cd x y
| paco_external_safetyN_stut cd' x' y': ext_step x y x' y' ->
(forall x',  valid x' y' -> _exp_safety cd' x' y') ->
exp_safetyN_stutter_gen cd x y
| paco_stutter cd': core_ord cd' cd ->
_exp_safety cd' x y ->
exp_safetyN_stutter_gen cd x y.
Definition paco_exp_safetyN_stutter := paco3 (@exp_safetyN_stutter_gen).

(*Show that the paco representation is correct. *)
Lemma exp_safetyN_stutter_paco_correct:
forall cd x y, exp_safetyN_stutter cd x y <-> paco_exp_safetyN_stutter bot3 cd x y.