End Precision.
(**********)
(* update *)
(**********)
Section UpdateLemmas.
Variable (K : ordType) (V : Type) (U : union_map_class K V).
Implicit Types (k : K) (v : V) (f : U).

(* Specifications: *)
Lemma upd_invalid k v : upd k v um_undef = um_undef :> U.
Lemma updU k1 k2 v1 v2 f :
upd k1 v1 (upd k2 v2 f) =
if k1 == k2 then upd k1 v1 f else upd k2 v2 (upd k1 v1 f).
Lemma updF k1 k2 v f :
upd k1 v (free k2 f) =
if k1 == k2 then upd k1 v f else free k2 (upd k1 v f).
Lemma updUnL k v f1 f2 :
upd k v (f1 \+ f2) =
if k \in dom f1 then upd k v f1 \+ f2 else f1 \+ upd k v f2.
Lemma updUnR k v f1 f2 :
upd k v (f1 \+ f2) =
if k \in dom f2 then f1 \+ upd k v f2 else upd k v f1 \+ f2.
Lemma freeF k1 k2 f :
free k1 (free k2 f) =
if k1 == k2 then free k1 f else free k2 (free k1 f).
Lemma freeUn k f1 f2 :
free k (f1 \+ f2) =
if k \in dom (f1 \+ f2) then free k f1 \+ free k f2
else f1 \+ f2.
Lemma freeUnV k f1 f2 :
valid (f1 \+ f2) -> free k (f1 \+ f2) = free k f1 \+ free k f2.
Lemma freeUnL k f1 f2 : k \notin dom f1 -> free k (f1 \+ f2) = f1 \+ free k f2.
Lemma freeUnR k f1 f2 : k \notin dom f2 -> free k (f1 \+ f2) = free k f1 \+ f2.
End FreeLemmas.