intuition.
unfold randomFunc_mem.
destruct (arrayLookup x w v); intuition; wftac.
Qed.

(* Specifications: *)
Theorem A_randomFunc_F_spec :
forall x,
comp_spec (fun y1 y2 =>
funcCollision (list_EqDec (Bvector_EqDec b)) (Bvector_EqDec b)
(fst (split (snd y1))) =
funcCollision (list_EqDec (Bvector_EqDec b)) (Bvector_EqDec b)
(fst (split (snd y2))) /\
(funcCollision (list_EqDec (Bvector_EqDec b)) (Bvector_EqDec b)
(fst (split (snd y1))) = false ->
y1 = y2))
(A (list (list (Bvector b) * Bvector b * Bvector c))
(list_EqDec
(pair_EqDec
(pair_EqDec (list_EqDec (Bvector_EqDec b)) (Bvector_EqDec b))
(Bvector_EqDec c))) (F_randomFunc x) nil)
(A (list (list (Bvector b) * Bvector b * Bvector c))
(list_EqDec
(pair_EqDec
(pair_EqDec (list_EqDec (Bvector_EqDec b)) (Bvector_EqDec b))
(Bvector_EqDec c)))
(fun (s : list (list (Bvector b) * Bvector b * Bvector c))
(a : list (Bvector b)) =>
randomFunc_mem
(pair_EqDec (list_EqDec (Bvector_EqDec b)) (Bvector_EqDec b))
(Bvector_EqDec c) ({ 0 , 1 }^c) s (a, F x a)) nil).
Theorem A_randomFunc_F_spec :
forall x,
comp_spec (fun y1 y2 =>
funcCollision (list_EqDec (Bvector_EqDec b)) (Bvector_EqDec b)
(fst (split (snd y1))) =
funcCollision (list_EqDec (Bvector_EqDec b)) (Bvector_EqDec b)
(fst (split (snd y2))) /\
(funcCollision (list_EqDec (Bvector_EqDec b)) (Bvector_EqDec b)
(fst (split (snd y1))) = false ->
y1 = y2))
(A (list (list (Bvector b) * Bvector b * Bvector c))
(list_EqDec
(pair_EqDec
(pair_EqDec (list_EqDec (Bvector_EqDec b)) (Bvector_EqDec b))
(Bvector_EqDec c))) (F_randomFunc x) nil)
(A (list (list (Bvector b) * Bvector b * Bvector c))
(list_EqDec
(pair_EqDec
(pair_EqDec (list_EqDec (Bvector_EqDec b)) (Bvector_EqDec b))
(Bvector_EqDec c)))
(fun (s : list (list (Bvector b) * Bvector b * Bvector c))
(a : list (Bvector b)) =>
randomFunc_mem
(pair_EqDec (list_EqDec (Bvector_EqDec b)) (Bvector_EqDec b))
(Bvector_EqDec c) ({ 0 , 1 }^c) s (a, F x a)) nil).