Section OF_LIST.
Variable A: Type.
Let f := fun (m: T.t A) (k_v: T.elt * A) => T.set (fst k_v) (snd k_v) m.
Definition of_list (l: list (T.elt * A)) : T.t A :=
List.fold_left f l (T.empty _).
Remark of_list_unchanged:
forall k l m, ~In k (map fst l) -> T.get k (List.fold_left f l m) = T.get k m.
End OF_LIST.

Lemma of_list_related:
forall (A B: Type) (R: A -> B -> Prop) k l1 l2,
list_forall2 (fun ka kb => fst ka = fst kb /\ R (snd ka) (snd kb)) l1 l2 ->
option_rel R (T.get k (of_list l1)) (T.get k (of_list l2)).