End OptStateMonad.
Section Map.
Definition Map (K V : Type) : Type :=
list (K * V).
Definition well_formed {K V} (m : Map K V) : Prop :=
NoDup (map fst m). (* no repeat keys *)
Class DecEq (X : Type) := {
dec_eq : forall x x' : X, { x = x' } + { x <> x' }
}.
Fixpoint insert {K V} `{DecEq K} (k : K) (v : V)
(m : Map K V) : Map K V :=
match m with
| [] => [(k,v)]
| (k',v') :: m' =>
match dec_eq k k' with
| left _ => (k',v) :: m'
| right _ => (k',v') :: insert k v m'
end
end.

(* Specifications: *)
Lemma In_insert_invert {K V} `{DecEq K} {p : K * V}
{k : K} {v : V} {m : Map K V} : In p (insert k v m) ->
p = (k, v) \/ In p m.
Lemma well_formed_insert {K V} `{DecEq K} (k : K) (v : V)
(m : Map K V) : well_formed m -> well_formed (insert k v m).