Global Instance Finite_unit : Finite unit.Global Instance Finite_bool_vec {n} : Finite (vec n bool).Definition transform_pair {X Y Z} (tp : X * Y * Z) : X * (Y * Z) :=
  (fst (fst tp), (snd (fst tp), snd tp)).

(* Specifications: *)
Lemma transform_pair_bijection {X Y Z} : bijection (@transform_pair X Y Z).
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 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).
Lemma transform_pair_bijection {X Y Z} : bijection (@transform_pair X Y Z).
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 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).