End BindsProperties2.
(* *********************************************************************** *)
(** * Hints *)
Hint Resolve
@app_assoc @app_nil_2 @map_app @dom_one @dom_cons @dom_app @dom_map.
Hint Resolve
@disjoint_sym_1 @disjoint_nil_1 @disjoint_one_2 @disjoint_one_alt_1
@disjoint_cons_3 @disjoint_cons_alt_2 @disjoint_app_3
@disjoint_map_2 @disjoint_map_var_2 @uniq_nil @uniq_push @uniq_alt
@uniq_one_1 @uniq_one_alt_1 @uniq_cons_3 @uniq_cons_alt_2
@uniq_app_4 @uniq_map_2 @uniq_map_var_2.
Hint Resolve
@binds_one_3 @binds_cons_2 @binds_cons_3 @binds_cons_alt_2
@binds_app_2 @binds_app_3 @binds_map_2 @binds_map_var_2.
(* *********************************************************************** *)
(** * List properties *)
(** The following properties are an assortment of structural properties about assumption lists. *)
Section AssortedListProperties.
Variable  X : Type.
Variables x : X.
Variables xs ys zs : list X.

(* Specifications: *)
Lemma one_eq_app :
one x ++ xs = ys ++ zs ->
(exists qs, ys = x :: qs /\ xs = qs ++ zs) \/
(ys = nil /\ zs = x :: xs).
Lemma binds_In_inv : forall x (E : list (asn A B)),
In x (dom E) ->
exists a, binds x a E.
Lemma binds_unique :
binds x a E ->
binds x b E ->
uniq E ->
a = b.
Lemma fresh_app_l :
uniq (F ++ E) ->
binds x a E ->
~ In x (dom F).
Lemma fresh_app_r :
uniq (F ++ E) ->
binds x a F ->
~ In x (dom E).