Section SingleSimulations.
Context {base_fst : BaseParams}.
Context {base_snd : BaseParams}.
Context {multi : MultiParams base_fst}.
Context {overlay : NameOverlayParams multi}.
Context {fail_msg : FailMsgParams multi}.
Context {single : SingleParams base_snd}.
Context {tot_map : MultiSingleParamsTotalMap multi base_snd}.
Context {me : name} {map_congr : MultiSingleParamsTotalMapCongruency single tot_map me}.
Definition step_ordered_failure_tot_s_net_handlers_eq :=
forall net failed tr src m ms out st' ps out' st'',
step_ordered_failure_star step_ordered_failure_init (failed, net) tr ->
onwPackets net src me = m :: ms ->
~ In me failed ->
net_handlers me src m (onwState net me) = (out, st', ps) ->
input_handler (tot_s_map_msg me src m) (tot_s_map_data (onwState net me)) = (out', st'') ->
map tot_s_map_output out = out' /\ tot_s_map_data st' = st''.
Proof using map_congr.
move => H_net_eq net net' failed failed' tr tr' H_star H_step.
invcs H_step.
- rewrite /update.
break_if; last by left.
right.
subst_max.
destruct (input_handler (tot_s_map_msg me from m) (tot_s_map_data (onwState net me))) eqn:?.
have H_eq := H_net_eq _ _ _ _ _ _ _ _ _ _ _ H_star H3 H4 H5 Heqp.
break_and.
exists (inl (tot_s_map_msg me from m) :: (map inr l0)).
apply: SST_deliver => //=.
by rewrite Heqp H0.
- rewrite /update.
break_if; last by left.
right.
subst_max.
destruct (input_handler (tot_s_map_input me inp) (tot_s_map_data (onwState net me))) eqn:?.
have H_eq_inp := @tot_s_input_handlers_eq _ _ _ _ _ _ map_congr _ _ _ _ _ _ _ H4 Heqp.
break_and.
exists (inl (tot_s_map_input me inp) :: map inr l0).
apply: SST_deliver => //=.
by rewrite Heqp H0.
- by left.
Qed.

Lemma step_ordered_failure_tot_one_mapped_simulation_star_1 :
step_ordered_failure_tot_s_net_handlers_eq ->
forall net failed tr,
step_ordered_failure_star step_ordered_failure_init (failed, net) tr ->
exists tr', @step_s_star _ single init_handler (tot_s_map_data (net.(onwState) me)) tr'.