Ltac do_fresh1 :=
repeat match goal with H: Ile _ _ |- _ => revert H
| H: Ident.lt _ _ |- _ => revert H
| H: fresh _ _ _ |- _ => revert H end;
clear;
unfold fresh; simpl;
repeat ((rewrite freshmax_list_app || rewrite freshmax_list_rev
|| rewrite varmax_minid || rewrite varmax_minid'); simpl).
Ltac do_fresh :=
do_fresh1; intros;
repeat match goal with
|  H: Ident.lt (var_max _ _) _ |- _ => apply var_max_split in H; destruct H
end;
repeat apply var_max_intro; auto;
try solve [etransitivity; eauto].
(*  repeat rewrite Zpos_succ_morphism in *; solve [auto | omega]. *)

(* Specifications: *)
Lemma freshmax_pn_atom_Equ_Destruct: forall e e' nextv,
fresh freshmax_pn_atom (Equ e e') nextv ->
fresh freshmax_expr e nextv /\ fresh freshmax_expr e' nextv.
Lemma freshmax_pn_atom_Nequ_Destruct: forall e e' nextv,
fresh freshmax_pn_atom (Nequ e e') nextv ->
fresh freshmax_expr e nextv /\ fresh freshmax_expr e' nextv.