(* ********************************************************************* *)
  (** ** The [simpl_alist] tactic *)

  (** The [simpl_alist] tactic rewrites association lists so that they
      are in the normal form described above.  Similar to the [simpl]
      tactic, we define "[in *]" and "[in H]" variants of the tactic. *)

  Ltac simpl_asnlist :=
    autorewrite with rewr_list rewr_list_in rewr_map rewr_dom.Implicit Types A B C D : Set.

(* Specifications: *)
Lemma disjoint_sym_1 : forall A B (E : list (asn A B)) (F : list (asn A B)), disjoint E F -> disjoint F E.
Lemma disjoint_sym : forall A B (E : list (asn A B)) (F : list (asn A B)), disjoint E F <-> disjoint F E.
Lemma disjoint_one_1 : forall A B (x : atom) (a : A) (F : list (asn A B)), disjoint (one (VarAsn B x a)) F -> x `notin` dom F.
Lemma disjoint_one_2 : forall A B (x : atom) (a : A) (F : list (asn A B)), x `notin` dom F -> disjoint (one (VarAsn B x a)) F.
Lemma disjoint_one_l : forall A B (x : atom) (a : A) (E : list (asn A B)), disjoint (one (VarAsn B x a)) E <-> x `notin` dom E.
Lemma disjoint_one_r : forall A B (x : atom) (a : A) (E : list (asn A B)), disjoint E (one (VarAsn B x a)) <-> x `notin` dom E.
Lemma disjoint_app_1 : forall A B (E F : list (asn A B)) (G : list (asn A B)), disjoint (E ++ F) G -> disjoint E G.
Lemma disjoint_app_2 : forall A B (E F : list (asn A B)) (G : list (asn A B)), disjoint (E ++ F) G -> disjoint F G.
Lemma disjoint_app_3 : forall A B (E F : list (asn A B)) (G : list (asn A B)), disjoint E G -> disjoint F G -> disjoint (E ++ F) G.
Lemma disjoint_app_l : forall A B (E F : list (asn A B)) (G : list (asn A B)), disjoint (E ++ F) G <-> disjoint E G /\ disjoint F G.
Lemma disjoint_app_r : forall A B (E F : list (asn A B)) (G : list (asn A B)), disjoint G (E ++ F) <-> disjoint E G /\ disjoint F G.
Lemma disjoint_map_1 : forall A B C (E : list (asn A B)) (F : list (asn A B)) (f1 : A -> A) (f2 : B -> B), disjoint (map f1 f2 E) F -> disjoint E F.
Lemma disjoint_map_2 : forall A B C (E : list (asn A B)) (F : list (asn A B)) (f1 : A -> A)(f2: B -> B), disjoint E F -> disjoint (map f1 f2 E) F.
Lemma disjoint_map_l : forall A B C (E : list (asn A B)) (F : list (asn A B)) (f1 : A -> A) (f2: B -> B), disjoint (map f1 f2 E) F <-> disjoint E F.
Lemma disjoint_map_r : forall A B C (E : list (asn A B)) (F : list (asn A B)) (f1 : A -> A) (f2: B -> B), disjoint F (map f1 f2 E) <-> disjoint E F.
Lemma uniq_one_1 : uniq (one (VarAsn B x b)).
Lemma uniq_app_1 : uniq (E ++ F) -> uniq E.
Lemma uniq_app_2 : uniq (E ++ F) -> uniq F.
Lemma uniq_app_3 : uniq (E ++ F) -> disjoint E F.
Lemma uniq_app_4 : uniq E -> uniq F -> disjoint E F -> uniq (E ++ F).
Lemma uniq_app : uniq (E ++ F) <-> uniq E /\ uniq F /\ disjoint E F.
Lemma uniq_map_1 : uniq (map f1 f2 E) -> uniq E.
Lemma uniq_map_2 : uniq E -> uniq (map f1 f2 E).
Lemma uniq_map : uniq (map f1 f2 E) <-> uniq E.