Global Instance Finite_unit : Finite unit.
Global Hint Resolve transform_pair_bijection : core.

(* Specifications: *)
Lemma Qsum_sumFQ {X} `{Finite X} f :
Qsum (map f enum) = sumFQ f.
Lemma Qsum_zero_in {X} (f : X -> Q) (xs : list X) :
(forall x, In x xs -> f x == 0) ->
Qsum (map f xs) == 0.
Lemma sumFQ_single_lst {X} (x0 : X) (xs : list X) (f : X -> Q) :
In x0 xs ->
NoDup xs ->
(forall x, x <> x0 -> f x == 0) ->
Qsum (map f xs) == f x0.
Lemma sumFQ_single {X} `{Finite X} (x0 : X) (f : X -> Q) :
(forall x, x <> x0 -> f x == 0) ->
sumFQ f == f x0.
Lemma Qsum_zero {X} (f : X -> Q) (xs : list X) :
(forall x, f x == 0) -> Qsum (map f xs) == 0.
Lemma sumFQ_zero {X} `{Finite X} (f : X -> Q) :
(forall x, f x == 0) -> sumFQ f == 0.
Lemma eqb_pair {X Y} `{EqDec X, EqDec Y, EqDec (X * Y)} (x x' : X) (y y' : Y) :
Classes.eqb (x,y) (x',y') =
Classes.eqb x x' && Classes.eqb y y'.
Lemma pres_uniform_lemma {Y Z} `{Finite Y, Finite Z} (f : Y -> dist Z) (d : dist Y) (ud : uniform d) :
(forall dy : dist Y, uniform dy -> uniform (mbind dy f)) ->
forall z, sumFQ (fun y => eval_dist (f y) (Classes.eqb z)) ==
Q_of_nat (card Y) / Q_of_nat (card Z).
Lemma key_lemma {X Y Z} `{Finite X, Finite Y, Finite Z} (d : dist (X * Y)) (f : Y -> dist Z) :
uniform d ->
(forall dy : dist Y, uniform dy -> uniform (mbind dy f)) ->
uniform (
p <- d;;
z <- f (snd p);;
mreturn (fst p, z)).
Lemma eval_ops_correct {n} (os : vec n op) : hoare uniform uniform (eval_ops os).
Lemma uniform_same_prob {X} `{EqDec X} (d : dist X) (q : Q) :
(forall x, eval_dist d (Classes.eqb x) == q) ->
uniform d.
Lemma init_PosMap_uniform : uniform init_PosMap.
Theorem eval_with_initialization_uniform : forall n (os : vec n op),
uniform (eval_with_initialization os).