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.

(* Specifications: *)
Lemma of_list_unique: forall k v l1 l2, ~In k (map fst l2) -> T.get k (of_list (l1 ++ (k, v) :: l2)) = Some v.
Lemma of_list_norepet: forall l k v, list_norepet (map fst l) -> In (k, v) l -> T.get k (of_list l) = Some v.
Lemma of_list_elements: forall m k, T.get k (of_list (T.elements m)) = T.get k m.
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)).
Lemma of_list_unique: forall k v l1 l2, ~In k (map fst l2) -> T.get k (of_list (l1 ++ (k, v) :: l2)) = Some v.
Lemma of_list_norepet: forall l k v, list_norepet (map fst l) -> In (k, v) l -> T.get k (of_list l) = Some v.
Lemma of_list_elements: forall m k, T.get k (of_list (T.elements m)) = T.get k m.
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)).