Definition intersect(A : Set)(eqd : eq_dec A)(ls1 ls2 : list A) :=
  filter (fun x => if (in_dec eqd x ls1) then true else false) ls2.

(* Specifications: *)
Lemma in_intersect : forall (A : Set)(eqd : eq_dec A)(ls1 ls2 : list A) a, In a (intersect eqd ls1 ls2) <-> In a ls1 /\ In a ls2.
Lemma intersect_comm : forall (A : Set)(eqd : eq_dec A)(ls1 ls2 : list A), NoDup ls1 -> NoDup ls2 -> Permutation (intersect eqd ls1 ls2) (intersect eqd ls2 ls1).
Lemma evalDist_ret_1 : forall (A : Set)(eqd : eq_dec A)(a1 a2 : A), a1 = a2 -> evalDist (Ret eqd a1) a2 = 1.
Lemma evalDist_ret_0 : forall (A : Set)(eqd : eq_dec A)(a1 a2 : A), a1 <> a2 -> evalDist (Ret eqd a1) a2 = 0.