(* induction over union maps, expressed with pts and \+ *)

(* Specifications: *)
(* forward progressing over keys *)
Lemma um_indf (P : U -> Prop) :
P um_undef -> P Unit ->
(forall k v f, P f -> valid (pts k v \+ f) ->
path ord k (dom f) ->
P (pts k v \+ f)) ->
forall f, P f.
(* backward progressing over keys *)
Lemma um_indb (P : U -> Prop) :
P um_undef -> P Unit ->
(forall k v f, P f -> valid (pts k v \+ f) ->
(forall x, x \in dom f -> ord x k) ->
P (pts k v \+ f)) ->
forall f, P f.
(* validity holds pairwise *)
Lemma um_valid3 f1 f2 f3 :
valid (f1 \+ f2 \+ f3) =
[&& valid (f1 \+ f2), valid (f2 \+ f3) & valid (f1 \+ f3)].
(* points-to is a prime element of the monoid *)
Lemma um_prime f1 f2 k v :
cond U k ->
f1 \+ f2 = pts k v ->
f1 = pts k v /\ f2 = Unit \/
f1 = Unit /\ f2 = pts k v.