Implicit Types A B C : Type.

(* Specifications: *)
Lemma disjoint_sym_1 : forall A B (E : list (X.t*A)) (F : list (X.t*B)), disjoint E F -> disjoint F E.
Lemma disjoint_sym : forall A B (E : list (X.t*A)) (F : list (X.t*B)), disjoint E F <-> disjoint F E.
Lemma disjoint_nil_1 : forall A B (E : list (X.t*B)), disjoint (@nil (X.t*A)) E.
Lemma disjoint_one_1 : forall A B (x : X.t) (a : A) (F : list (X.t*B)), disjoint (x ~ a) F -> ~ In x (dom F).
Lemma disjoint_one_2 : forall A B (x : X.t) (a : A) (F : list (X.t*B)), ~ In x (dom F) -> disjoint (x ~ a) F.
Lemma disjoint_one_l : forall A B (x : X.t) (a : A) (E : list (X.t*B)), disjoint (x ~ a) E <-> ~ In x (dom E).
Lemma disjoint_one_r : forall A B (x : X.t) (a : A) (E : list (X.t*B)), disjoint E (x ~ a) <-> ~ In x (dom E).
Lemma disjoint_cons_1 : forall A B x a (E : list (X.t*A)) (F : list (X.t*B)), disjoint ((x, a) :: E) F -> ~ In x (dom F).
Lemma disjoint_cons_2 : forall A B x a (E : list (X.t*A)) (F : list (X.t*B)), disjoint ((x, a) :: E) F -> disjoint E F.
Lemma disjoint_cons_3 : forall A B x a (E : list (X.t*A)) (F : list (X.t*B)), disjoint E F -> ~ In x (dom F) -> disjoint ((x, a) :: E) F.
Lemma disjoint_cons_l : forall A B x a (E : list (X.t*A)) (F : list (X.t*B)), disjoint ((x, a) :: E) F <-> ~ In x (dom F) /\ disjoint E F.
Lemma disjoint_cons_r : forall A B x a (E : list (X.t*A)) (F : list (X.t*B)), disjoint F ((x, a) :: E) <-> ~ In x (dom F) /\ disjoint E F.
Lemma disjoint_app_1 : forall A B (E F : list (X.t*A)) (G : list (X.t*B)), disjoint (E ++ F) G -> disjoint E G.
Lemma disjoint_app_2 : forall A B (E F : list (X.t*A)) (G : list (X.t*B)), disjoint (E ++ F) G -> disjoint F G.
Lemma disjoint_app_3 : forall A B (E F : list (X.t*A)) (G : list (X.t*B)), disjoint E G -> disjoint F G -> disjoint (E ++ F) G.
Lemma disjoint_app_l : forall A B (E F : list (X.t*A)) (G : list (X.t*B)), disjoint (E ++ F) G <-> disjoint E G /\ disjoint F G.
Lemma disjoint_app_r : forall A B (E F : list (X.t*A)) (G : list (X.t*B)), disjoint G (E ++ F) <-> disjoint E G /\ disjoint F G.
Lemma disjoint_map_1 : forall A B C (E : list (X.t*A)) (F : list (X.t*B)) (f:A->C), disjoint (map f E) F -> disjoint E F.
Lemma disjoint_map_2 : forall A B C (E : list (X.t*A)) (F : list (X.t*B)) (f:A->C), disjoint E F -> disjoint (map f E) F.
Lemma disjoint_map_l : forall A B C (E : list (X.t*A)) (F : list (X.t*B)) (f:A->C), disjoint (map f E) F <-> disjoint E F.
Lemma disjoint_map_r : forall A B C (E : list (X.t*A)) (F : list (X.t*B)) (f:A->C), disjoint F (map f E) <-> disjoint E F.
Lemma uniq_one_1 : uniq (x ~ b).
Lemma uniq_cons_1 : uniq ((x, a) :: E) -> uniq E.
Lemma uniq_cons_2 : uniq ((x, a) :: E) -> ~ In x (dom E).
Lemma uniq_cons_3 : uniq E -> ~ In x (dom E) -> uniq ((x, a) :: E).
Lemma uniq_cons_iff : uniq ((x, a) :: E) <-> uniq E /\ ~ In x (dom E).
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_iff : uniq (E ++ F) <-> uniq E /\ uniq F /\ disjoint E F.
Lemma uniq_map_1 : uniq (map f E) -> uniq E.
Lemma uniq_map_2 : uniq E -> uniq (map f E).
Lemma uniq_map_iff : uniq (map f E) <-> uniq E.
Lemma binds_nil_iff : binds x a nil <-> False.
Lemma binds_one_1 : binds x a (y ~ b) -> x = y.
Lemma binds_one_2 : binds x a (y ~ b) -> a = b.
Lemma binds_one_3 : x = y -> a = b -> binds x a (y ~ b).
Lemma binds_one_iff : binds x a (y ~ b) <-> x = y /\ a = b.
Lemma binds_cons_1 : binds x a ((y, b) :: E) -> (x = y /\ a = b) \/ binds x a E.
Lemma binds_cons_2 : x = y -> a = b -> binds x a ((y, b) :: E).
Lemma binds_cons_3 : binds x a E -> binds x a ((y, b) :: E).
Lemma binds_cons_iff : binds x a ((y, b) :: E) <-> (x = y /\ a = b) \/ binds x a E.
Lemma binds_app_1 : binds x a (E ++ F) -> binds x a E \/ binds x a F.
Lemma binds_app_2 : binds x a E -> binds x a (E ++ F).
Lemma binds_app_3 : binds x a F -> binds x a (E ++ F).
Lemma binds_app_iff : binds x a (E ++ F) <-> binds x a E \/ binds x a F.
Lemma binds_map_1 : (forall a b, f a = f b -> a = b) -> binds x (f a) (map f E) -> binds x a E.
Lemma binds_map_2 : binds x a E -> binds x (f a) (map f E).
Lemma binds_map_3 : binds x b0 (map f E) -> exists a, f a = b0 /\ binds x a E.
Lemma binds_dom_contradiction : forall (E : list (X.t*A)), binds x a E -> ~ In x (dom E) -> False.
Lemma binds_app_uniq_1 : uniq (E ++ F) -> binds x a (E ++ F) -> (binds x a E /\ ~ In x (dom F)) \/ (binds x a F /\ ~ In x (dom E)).
Lemma binds_app_uniq_iff : uniq (E ++ F) -> (binds x a (E ++ F) <-> (binds x a E /\ ~ In x (dom F)) \/ (binds x a F /\ ~ In x (dom E))).
Lemma binds_cons_uniq_1 : uniq ((y, b) :: E) -> binds x a ((y, b) :: E) -> (x = y /\ a = b /\ ~ In x (dom E)) \/ (binds x a E /\ x <> y).
Lemma binds_cons_uniq_iff : uniq ((y, b) :: E) -> (binds x a ((y, b) :: E) <-> (x = y /\ a = b /\ ~ In x (dom E)) \/ (binds x a E /\ x <> y)).
Lemma one_eq_app : one x ++ xs = ys ++ zs -> (exists qs, ys = x :: qs /\ xs = qs ++ zs) \/ (ys = nil /\ zs = x :: xs).
Lemma app_eq_one : ys ++ zs = one x ++ xs -> (exists qs, ys = x :: qs /\ xs = qs ++ zs) \/ (ys = nil /\ zs = x :: xs).
Lemma nil_neq_one_mid : nil <> xs ++ one x ++ ys.
Lemma one_mid_neq_nil : xs ++ one x ++ ys <> nil.