End UniqProperties.
(* *********************************************************************** *)
(** * Basic facts about [binds] *)
Section BindsProperties.
Variable  A B   : Type.
Variables f     : A -> B.
Variables x y   : atom.
Variables a b   : A.
Variables E F G : list (atom*A).

(* Specifications: *)
Axiom binds_nil_iff :
binds x a nil <-> False.
Axiom binds_one_1 :
binds x a (y ~ b) ->
x = y.
Axiom binds_one_2 :
binds x a (y ~ b) ->
a = b.
Axiom binds_one_3 :
x = y ->
a = b ->
binds x a (y ~ b).
Axiom binds_one_iff :
binds x a (y ~ b) <-> x = y /\ a = b.
Axiom binds_cons_1 :
binds x a ((y, b) :: E) ->
(x = y /\ a = b) \/ binds x a E.
Axiom binds_cons_2 :
x = y ->
a = b ->
binds x a ((y, b) :: E).
Axiom binds_cons_3 :
binds x a E ->
binds x a ((y, b) :: E).
Axiom binds_cons_iff :
binds x a ((y, b) :: E) <-> (x = y /\ a = b) \/ binds x a E.
Axiom binds_app_1 :
binds x a (E ++ F) ->
binds x a E \/ binds x a F.
Axiom binds_app_2 :
binds x a E ->
binds x a (E ++ F).
Axiom binds_app_3 :
binds x a F ->
binds x a (E ++ F).
Axiom binds_app_iff :
binds x a (E ++ F) <-> binds x a E \/ binds x a F.
Axiom binds_map_1 :
(forall a b, f a = f b -> a = b) ->
binds x (f a) (map f E) ->
binds x a E.
Axiom binds_map_2 :
binds x a E ->
binds x (f a) (map f E).
Axiom binds_dom_contradiction : forall (E : list (atom*A)),
binds x a E ->
~ In x (dom E) ->
False.
Axiom 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)).
Axiom 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))).