1313require import AllCore Real Distr StdOrder StdBigop GlobalHybrid.
1414import RealOrder Bigreal BRA.
1515
16+ clone include GlobalHybrid with
17+ type input <- unit (* no additional input *)
18+ proof *.
19+
1620op n : {int | 1 <= n} as ge1_n.
1721
1822type t. (* we want t to have 2 ^ n elements, including def *)
@@ -24,13 +28,13 @@ op [lossless] dt : t distr.
2428axiom mu1_dt (x : t) : mu1 dt x = 1%r / (2 ^ n)%r.
2529
2630lemma dt_uni : is_uniform dt.
27- proof. move => x y _ _; by rewrite !mu1_dt. qed.
31+ proof. by move => x y _ _; by rewrite !mu1_dt. qed.
2832
2933lemma dt_fu : is_full dt.
3034proof.
3135rewrite funi_ll_full.
32- move => x y; by rewrite !mu1_dt.
33- rewrite dt_ll.
36+ + by move => x y; by rewrite !mu1_dt.
37+ by rewrite dt_ll.
3438qed.
3539
3640op m : {int | 1 <= m} as ge1_m.
@@ -65,7 +69,7 @@ lemma GReal_GIdeal &m :
6569*)
6670
6771module Hybrid : HYBRID = {
68- proc main (i : int ) : bool = {
72+ proc main (y : unit, i : int ) : bool = {
6973 var b <- true ;
7074 var x : t;
7175 (* start from i: *)
@@ -81,18 +85,18 @@ module Hybrid : HYBRID = {
8185}.
8286
8387lemma GReal_Hybrid_1 &m :
84- Pr[GReal.main() @ &m : res] = Pr[Hybrid.main(1 ) @ &m : res].
88+ Pr[GReal.main() @ &m : res] = Pr[Hybrid.main((), 1 ) @ &m : res].
8589proof.
8690byequiv => // ; proc.
8791seq 2 1 : (={b, i} /\ i{1 } = 1 ); first auto .
88- sim.
92+ by sim.
8993qed.
9094
9195lemma Hybrid_m &m :
92- Pr[Hybrid.main(m) @ &m : res] = Pr[GIdeal.main() @ &m : res].
96+ Pr[Hybrid.main((), m) @ &m : res] = Pr[GIdeal.main() @ &m : res].
9397proof.
9498byequiv => // ; proc; sp 1 0.
95- rcondf{1 } 1 ; auto .
99+ by rcondf{1 } 1 ; auto .
96100qed.
97101
98102(* we use upto bad reasoning *)
@@ -147,53 +151,57 @@ module GBad2 = {
147151
148152lemma Hybrid_step (i' : int) &m :
149153 1 <= i' < m =>
150- `|Pr[Hybrid.main(i' ) @ &m : res] - Pr[Hybrid.main(i' + 1 ) @ &m : res]| <=
154+ `|Pr[Hybrid.main((), i') @ &m : res] -
155+ Pr[Hybrid.main((), i' + 1) @ &m : res]| <=
151156 1%r / (2 ^ n)%r.
152157proof.
153- move => [ge1_i' lt_i'_m].
154- have -> : Pr[Hybrid.main(i' ) @ &m : res] = Pr[GBad1.main(i' ) @ &m : res].
155- byequiv => // ; proc; sp 1 2.
158+ move => [ge1_i' lt_i'_m].
159+ have -> :
160+ Pr[Hybrid.main((), i') @ &m : res] = Pr[GBad1.main(i' ) @ &m : res].
161+ + byequiv => //; proc; sp 1 2.
156162 rcondt{1} 1; first auto.
157- sim.
158- have -> : Pr[Hybrid.main(i' + 1) @ &m : res] = Pr[GBad2.main(i' ) @ &m : res].
159- byequiv => // ; proc; sp 1 2.
163+ by sim.
164+ have -> :
165+ Pr[Hybrid.main((), i' + 1 ) @ &m : res] =
166+ Pr[GBad2.main(i' ) @ &m : res].
167+ + byequiv => //; proc; sp 1 2.
160168 seq 0 3 : (={i, b}); first auto.
161- sim.
169+ by sim.
162170rewrite (ler_trans Pr[GBad2.main(i' ) @ &m : GBad2.bad]).
163- byequiv
164- (_ :
165- ={i} ==> GBad1.bad{1} = GBad2.bad{2} /\ (! GBad2.bad{2} => ={res})) :
166- GBad1.bad => //.
167- proc.
168- seq 5 5 :
169- (GBad1.bad{1} = GBad2.bad{2} /\ ={i} /\
170- (!GBad2.bad{2} => ={b})); first auto.
171- case (GBad1.bad{1}).
172- while (={i}); auto.
173- while (={i, b}); auto; smt().
174- smt().
171+ + byequiv
172+ ( :
173+ ={i} ==> GBad1.bad{1 } = GBad2.bad{2 } /\ (! GBad2.bad{2 } => ={res})) :
174+ GBad1.bad => // .
175+ + proc.
176+ seq 5 5 :
177+ (GBad1.bad{1 } = GBad2.bad{2 } /\ ={i} /\
178+ (!GBad2.bad{2 } => ={b})); first auto .
179+ case (GBad1.bad{1 }).
180+ + by while (={i}); auto .
181+ by while (={i, b}); auto ; smt().
182+ by smt ().
175183byphoare => // ; proc; sp.
176184seq 3 :
177185 GBad2.bad
178186 (1 %r / (2 ^ n)%r)
179187 1%r
180188 (1 %r - (1 %r / (2 ^ n)%r))
181189 0%r.
182- auto.
183- wp; rnd (pred1 def); auto; smt(mu1_dt).
184- conseq (_ : _ ==> _ : = 1%r).
185- while (true) (m - i) => [z |].
186- auto; smt(dt_ll).
187- auto; smt().
188- hoare; while (true); auto.
189- trivial .
190+ + by auto.
191+ + by wp; rnd (pred1 def); auto ; smt(mu1_dt).
192+ + conseq (: _ ==> _ : = 1 %r).
193+ while (true ) (m - i) => [z |].
194+ + by auto ; smt(dt_ll).
195+ by auto ; smt().
196+ + by hoare; while (true ); auto .
197+ done .
190198qed.
191199
192200lemma GReal_GIdeal &m :
193201 `|Pr[GReal.main() @ &m : res] - Pr[GIdeal.main() @ &m : res]| <=
194202 (m - 1 )%r * (1 %r / (2 ^ n)%r).
195203proof.
196204rewrite (GReal_Hybrid_1 &m) -(Hybrid_m &m).
197- rewrite (hybrid_simp _ _ Hybrid) 1:ge1_m => i ge1_i_lt_m.
205+ rewrite (hybrid_simp _ _ _ Hybrid) 1:ge1_m => i ge1_i_lt_m.
198206by rewrite Hybrid_step.
199207qed.
0 commit comments