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].

(* 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.