Section assoc.
Variable K V : Type.
Variable K_eq_dec : forall k k' : K, {k = k'} + {k <> k'}.
Fixpoint assoc (l : list (K * V)) (k : K) : option V :=
match l with
| [] => None
| (k', v) :: l' =>
if K_eq_dec k k' then
Some v
else
assoc l' k
end.
Definition assoc_default (l : list (K * V)) (k : K) (default : V) : V :=
match (assoc l k) with
| Some x => x
| None => default
end.
Fixpoint assoc_set (l : list (K * V)) (k : K) (v : V) : list (K * V) :=
match l with
| [] => [(k, v)]
| (k', v') :: l' =>
if K_eq_dec k k' then
(k, v) :: l'
else
(k', v') :: (assoc_set l' k v)
end.
Fixpoint assoc_del (l : list (K * V)) (k : K) : list (K * V) :=
match l with
| [] => []
| (k', v') :: l' =>
if K_eq_dec k k' then
assoc_del l' k
else
(k', v') :: (assoc_del l' k)
end.
Proof using.
induction l; intros; simpl; repeat (break_match; simpl); subst; congruence.
Qed.
Proof using.
intros. subst. auto using get_set_same.
Qed.
Proof using.
induction l; intros; simpl; repeat (break_match; simpl); subst; try congruence; auto.
Qed.

Lemma not_in_assoc :
forall k l,
~ In k (map (@fst _ _) l) ->
assoc l k = None.