Proof using.
intros.
remember step_async_init as y in *.
revert Heqy.
induction H using refl_trans_1n_trace_n1_ind; simpl; intros.
- find_rewrite.
exists []; simpl.
split; auto.
apply RT1nTBase.
- concludes.
subst.
break_exists_name tr'.
break_and.
assert (H_r: reachable step_dup step_async_init x') by (exists tr1; auto).
eapply reachable_revert_step in H_r; eauto.
break_or_hyp.
* exists (tr' ++ tr2); split.
+ eapply refl_trans_1n_trace_trans; eauto.
rewrite (app_nil_end tr2).
eapply RT1nTStep; eauto.
apply RT1nTBase.
+ rewrite filterMap_app.
rewrite filterMap_app.
find_reverse_rewrite.
reflexivity.
* break_and.
find_rewrite.
exists tr'; split; simpl; auto.
match goal with
| [H : filterMap _ _ = filterMap _ _ |- _ ] =>
rewrite <- H
end.
rewrite filterMap_app.
destruct tr2; simpl in *; [ rewrite <- app_nil_end | idtac ]; auto.
match goal with
| [H : _ = [] |- _ ] =>
rewrite H
end.
rewrite <- app_nil_end; auto.
Qed.

(* Specifications: *)
Theorem reachable_revert :
true_in_reachable step_dup step_async_init
(fun st =>
reachable step_async step_async_init (revertNetwork st)).