Admitted. (* QuickChick false_beq_id. *)
(* Maps as functions are bad, explicit maps instead *)
Definition partial_map := list (id * nat).
Definition empty : partial_map := nil.
Definition update := @cons (id * nat).
Inductive bind : partial_map -> id -> nat -> Prop :=
| BindNow   : forall x a m, bind (cons (x, a) m) x a
| BindLater : forall x x' a a' m',
~ (x = x') ->
bind m' x a ->
bind (cons (x',a') m') x a.
Derive ArbitrarySizedSuchThat for (fun x => bind m x a).
Derive SizeMonotonicSuchThatOpt for (fun x => bind m x a).
Derive GenSizedSuchThatSizeMonotonicOpt for (fun x => bind m x a).
(* KNOWN DUG. The derivation of SizedProofEqs for bind fails. *)
(* Derive SizedProofEqs for (fun x => bind m x a). *)
(* Derive GenSizedSuchThatCorrect for (fun x => bind m x a). *)
Instance adm_st m a : SuchThatCorrect (fun x => bind m x a) (genST (fun x => bind m x a)).
Admitted.
Instance checkFalse : Checkable False := {| checker := fun _ => checker false |}.
Instance bind_dec m x v : Dec (bind m x v) :=
{| dec := _ |}.

Lemma update_shadow : forall (m: partial_map) v1 v2 x,
update (x, v2) (update (x, v1) m)  = update (x, v2) m.