@@ -18,18 +18,17 @@ let t_pr_lemma lemma tc =
18
18
(* -------------------------------------------------------------------- *)
19
19
let pr_eq env m f args p1 p2 =
20
20
let mem = Fun. prF_memenv mhr f env in
21
- let hyp = f_forall_mems [mem] (f_iff p1 p2) in
21
+ let hyp = f_forall_mems [ mem ] (f_iff p1 p2) in
22
22
let concl = f_eq (f_pr m f args p1) (f_pr m f args p2) in
23
- f_imp hyp (f_eq concl f_true)
23
+ f_imp hyp (f_eq concl f_true)
24
24
25
25
let pr_sub env m f args p1 p2 =
26
26
let mem = Fun. prF_memenv mhr f env in
27
- let hyp = f_forall_mems [mem] (f_imp p1 p2) in
27
+ let hyp = f_forall_mems [ mem ] (f_imp p1 p2) in
28
28
let concl = f_real_le (f_pr m f args p1) (f_pr m f args p2) in
29
- f_imp hyp (f_eq concl f_true)
29
+ f_imp hyp (f_eq concl f_true)
30
30
31
- let pr_false m f args =
32
- f_eq (f_pr m f args f_false) f_r0
31
+ let pr_false m f args = f_eq (f_pr m f args f_false) f_r0
33
32
34
33
let pr_not m f args p =
35
34
f_eq
@@ -41,18 +40,18 @@ let pr_or m f args por p1 p2 =
41
40
let pr2 = f_pr m f args p2 in
42
41
let pr12 = f_pr m f args (f_and p1 p2) in
43
42
let pr = f_real_sub (f_real_add pr1 pr2) pr12 in
44
- f_eq (f_pr m f args (por p1 p2)) pr
43
+ f_eq (f_pr m f args (por p1 p2)) pr
45
44
46
45
let pr_disjoint env m f args por p1 p2 =
47
46
let mem = Fun. prF_memenv mhr f env in
48
- let hyp = f_forall_mems [mem] (f_not (f_and p1 p2)) in
47
+ let hyp = f_forall_mems [ mem ] (f_not (f_and p1 p2)) in
49
48
let pr1 = f_pr m f args p1 in
50
49
let pr2 = f_pr m f args p2 in
51
- let pr = f_real_add pr1 pr2 in
52
- f_imp hyp (f_eq (f_pr m f args (por p1 p2)) pr)
50
+ let pr = f_real_add pr1 pr2 in
51
+ f_imp hyp (f_eq (f_pr m f args (por p1 p2)) pr)
53
52
54
53
let pr_split m f args ev1 ev2 =
55
- let pr = f_pr m f args ev1 in
54
+ let pr = f_pr m f args ev1 in
56
55
let pr1 = f_pr m f args (f_and ev1 ev2) in
57
56
let pr2 = f_pr m f args (f_and ev1 (f_not ev2)) in
58
57
f_eq pr (f_real_add pr1 pr2)
@@ -68,129 +67,139 @@ let pr_le1 m f args ev =
68
67
let pr_sum env pr =
69
68
let prf = EcEnv.Fun. by_xpath pr.pr_fun env in
70
69
let xty = prf.f_sig.fs_ret in
71
- let x = EcIdent. create " x" in
72
- let fx = f_local x xty in
70
+ let x = EcIdent. create " x" in
71
+ let fx = f_local x xty in
73
72
74
73
let prx =
75
74
let event =
76
- f_and_simpl
77
- pr.pr_event
78
- (f_eq (f_pvar EcTypes. pv_res xty EcFol. mhr) fx)
79
- in f_pr pr.pr_mem pr.pr_fun pr.pr_args event in
75
+ f_and_simpl pr.pr_event (f_eq (f_pvar EcTypes. pv_res xty EcFol. mhr) fx)
76
+ in
77
+ f_pr pr.pr_mem pr.pr_fun pr.pr_args event
78
+ in
80
79
81
80
let prx =
82
81
EcFol. f_app
83
- (EcFol. f_op
84
- EcCoreLib.CI_Sum. p_sum
85
- [xty]
82
+ (EcFol. f_op EcCoreLib.CI_Sum. p_sum [ xty ]
86
83
(EcTypes. tfun (EcTypes. tfun xty EcTypes. treal) EcTypes. treal))
87
- [EcFol. f_lambda [x, GTty xty] prx]
84
+ [ EcFol. f_lambda [ ( x, GTty xty) ] prx ]
88
85
EcTypes. treal
89
86
in
90
87
91
88
f_eq (f_pr_r pr) prx
92
89
90
+ let pr_mu1_le_eq_mu1 m f args resv k fresh_id d =
91
+ let kfresh = f_local fresh_id k.f_ty in
92
+ let f_ll = f_bdHoareF f_true f f_true FHeq f_r1
93
+ and f_le_mu1 = f_forall [ (fresh_id, gtty k.f_ty) ]
94
+ (f_real_le (f_pr m f args (f_eq resv kfresh)) (f_mu_x d kfresh))
95
+ and concl =
96
+ f_eq (f_pr m f args (f_eq resv k)) (f_mu_x d k) in
97
+ f_imp f_ll (f_imp f_le_mu1 concl)
98
+
93
99
(* -------------------------------------------------------------------- *)
94
100
exception FoundPr of form
95
101
96
102
let select_pr on_ev sid f =
97
103
match f.f_node with
98
104
| Fpr { pr_event = ev } ->
99
- if on_ev ev && Mid. set_disjoint f.f_fv sid
100
- then raise (FoundPr f)
105
+ if on_ev ev && Mid. set_disjoint f.f_fv sid then raise (FoundPr f)
101
106
else false
102
107
| _ -> false
103
108
104
109
let select_pr_cmp on_cmp sid f =
105
110
match f.f_node with
106
- | Fapp ({f_node = Fop (op,_)},
107
- [{f_node = Fpr pr1};
108
- {f_node = Fpr pr2}]) ->
109
-
110
- if on_cmp op
111
- && EcIdent. id_equal pr1.pr_mem pr2.pr_mem
112
- && EcPath. x_equal pr1.pr_fun pr2.pr_fun
113
- && f_equal pr1.pr_args pr2.pr_args
114
- && Mid. set_disjoint f.f_fv sid
111
+ | Fapp
112
+ ({ f_node = Fop (op, _) }, [ { f_node = Fpr pr1 }; { f_node = Fpr pr2 } ])
113
+ ->
114
+ if on_cmp op
115
+ && EcIdent. id_equal pr1.pr_mem pr2.pr_mem
116
+ && EcPath. x_equal pr1.pr_fun pr2.pr_fun
117
+ && f_equal pr1.pr_args pr2.pr_args
118
+ && Mid. set_disjoint f.f_fv sid
115
119
then raise (FoundPr f)
116
120
else false
117
-
118
121
| _ -> false
119
122
120
123
let select_pr_ge0 sid f =
121
124
match f.f_node with
122
- | Fapp ( { f_node = Fop (op ,_ ) } , [f' ; {f_node = Fpr _ } ]) ->
123
- if EcPath. p_equal EcCoreLib.CI_Real. p_real_le op
124
- && f_equal f' f_r0
125
- && Mid. set_disjoint f.f_fv sid
125
+ | Fapp ( { f_node = Fop (op , _ ) } , [ f' ; { f_node = Fpr _ } ]) ->
126
+ if EcPath. p_equal EcCoreLib.CI_Real. p_real_le op
127
+ && f_equal f' f_r0
128
+ && Mid. set_disjoint f.f_fv sid
126
129
then raise (FoundPr f)
127
130
else false
128
-
129
131
| _ -> false
130
132
131
133
let select_pr_le1 sid f =
132
134
match f.f_node with
133
- | Fapp ( { f_node = Fop (op ,_ ) } , [{ f_node = Fpr _ } ; f' ]) ->
134
- if EcPath. p_equal EcCoreLib.CI_Real. p_real_le op
135
- && f_equal f' f_r1
136
- && Mid. set_disjoint f.f_fv sid
135
+ | Fapp ( { f_node = Fop (op , _ ) } , [ { f_node = Fpr _ } ; f' ]) ->
136
+ if EcPath. p_equal EcCoreLib.CI_Real. p_real_le op
137
+ && f_equal f' f_r1
138
+ && Mid. set_disjoint f.f_fv sid
137
139
then raise (FoundPr f)
138
140
else false
139
-
140
141
| _ -> false
141
142
142
143
(* -------------------------------------------------------------------- *)
143
- let pr_rewrite_lemma = [
144
- " mu_eq" , `MuEq ;
145
- " mu_sub" , `MuSub ;
146
- " mu_false" , `MuFalse ;
147
- " mu_not" , `MuNot ;
148
- " mu_or" , `MuOr ;
149
- " mu_disjoint" , `MuDisj ;
150
- " mu_split" , `MuSplit ;
151
- " mu_ge0" , `MuGe0 ;
152
- " mu_le1" , `MuLe1 ;
153
- " muE" , `MuSum ;
154
- ]
144
+ let pr_rewrite_lemma =
145
+ [
146
+ (" mu1_le_eq_mu1" , `Mu1LeEqMu1 );
147
+ (" muE" , `MuSum );
148
+ (" mu_disjoint" , `MuDisj );
149
+ (" mu_eq" , `MuEq );
150
+ (" mu_false" , `MuFalse );
151
+ (" mu_ge0" , `MuGe0 );
152
+ (" mu_le1" , `MuLe1 );
153
+ (" mu_not" , `MuNot );
154
+ (" mu_or" , `MuOr );
155
+ (" mu_split" , `MuSplit );
156
+ (" mu_sub" , `MuSub );
157
+ ]
155
158
156
159
(* -------------------------------------------------------------------- *)
157
- let t_pr_rewrite_low (s ,dof ) tc =
160
+ let t_pr_rewrite_low (s , dof ) tc =
158
161
let kind =
159
- try List. assoc s pr_rewrite_lemma with Not_found ->
160
- tc_error !! tc " do not reconize %s as a probability lemma" s in
162
+ try List. assoc s pr_rewrite_lemma
163
+ with Not_found ->
164
+ tc_error !! tc " Pr-rewrite: `%s` is not a suitable probability lemma" s
165
+ in
161
166
162
- let check_f dof =
163
- match kind, dof with
164
- | `MuSplit , None -> tc_error !! tc " argument expected for %s" s
165
- | `MuSplit , Some _ -> ()
166
- | _ , Some _ -> tc_error !! tc " no argument expected for %s" s
167
- | _ , _ -> () in
168
- check_f dof;
167
+ let expect_arg = function `MuSplit | `Mu1LeEqMu1 -> true | _ -> false in
168
+ (if not (is_some dof = expect_arg kind) then
169
+ let neg = if is_some dof then " no " else " " in
170
+ tc_error !! tc " Pr-rewrite: %sargument expected for `%s`" neg s);
169
171
170
172
let select =
171
173
match kind with
172
- | `MuEq -> select_pr_cmp (EcPath. p_equal EcCoreLib.CI_Bool. p_eq)
173
- | `MuSub -> select_pr_cmp (EcPath. p_equal EcCoreLib.CI_Real. p_real_le)
174
+ | `Mu1LeEqMu1 -> select_pr is_eq
175
+ | `MuDisj | `MuOr -> select_pr is_or
176
+ | `MuEq -> select_pr_cmp (EcPath. p_equal EcCoreLib.CI_Bool. p_eq)
174
177
| `MuFalse -> select_pr is_false
175
- | `MuNot -> select_pr is_not
176
- | `MuOr
177
- | `MuDisj -> select_pr is_or
178
+ | `MuGe0 -> select_pr_ge0
179
+ | `MuLe1 -> select_pr_le1
180
+ | `MuNot -> select_pr is_not
178
181
| `MuSplit -> select_pr (fun _ev -> true )
179
- | `MuGe0 -> select_pr_ge0
180
- | `MuLe1 -> select_pr_le1
181
- | `MuSum -> select_pr (fun _ev -> true )
182
+ | `MuSub -> select_pr_cmp (EcPath. p_equal EcCoreLib.CI_Real. p_real_le)
183
+ | `MuSum -> select_pr (fun _ev -> true )
182
184
in
183
185
184
186
let select xs fp = if select xs fp then `Accept (- 1 ) else `Continue in
185
- let env, _ , concl = FApi. tc1_eflat tc in
187
+ let env, hyps , concl = FApi. tc1_eflat tc in
186
188
let torw =
187
189
try
188
190
ignore (EcMatching.FPosition. select select concl);
189
- tc_error !! tc " cannot find a pattern for %s " s
191
+ tc_error !! tc " Pr-rewrite: cannot find a pattern for `%s` " s
190
192
with FoundPr f -> f in
191
193
192
194
let lemma, args =
193
195
match kind with
196
+ | `Mu1LeEqMu1 ->
197
+ let { pr_mem; pr_fun; pr_args; pr_event } = destr_pr torw in
198
+ let (resv, k) = destr_eq pr_event in
199
+ let k_id = EcEnv.LDecl. fresh_id hyps " k" in
200
+ let d = (oget dof) tc torw (EcTypes. tdistr k.f_ty) in
201
+ (pr_mu1_le_eq_mu1 pr_mem pr_fun pr_args resv k k_id d, 2 )
202
+
194
203
| (`MuEq | `MuSub as kind ) -> begin
195
204
match torw.f_node with
196
205
| Fapp (_, [{f_node = Fpr ({ pr_event = ev1 } as pr) };
@@ -225,7 +234,7 @@ let t_pr_rewrite_low (s,dof) tc =
225
234
226
235
| `MuSplit ->
227
236
let pr = destr_pr torw in
228
- let ev' = (oget dof) tc torw in
237
+ let ev' = (oget dof) tc torw EcTypes. tbool in
229
238
(pr_split pr.pr_mem pr.pr_fun pr.pr_args pr.pr_event ev', 0 )
230
239
231
240
| `MuGe0 -> begin
@@ -255,16 +264,16 @@ let t_pr_rewrite_low (s,dof) tc =
255
264
(t_pr_lemma lemma)
256
265
(t_rewrite rwpt (`LtoR , None ) tc)
257
266
258
- let t_pr_rewrite_i (s ,f ) tc =
259
- let do_ev = omap (fun f _ _ -> f) f in
260
- t_pr_rewrite_low (s,do_ev) tc
261
-
262
- let t_pr_rewrite (s ,f ) tc =
263
- let do_ev =
264
- omap ( fun f tc torw ->
265
- let env,hyps,_ = FApi. tc1_eflat tc in
266
- let pr = destr_pr torw in
267
- let mp = EcEnv.Fun. prF_memenv EcFol. mhr pr.pr_fun env in
268
- let hyps = LDecl. push_active mp hyps in
269
- EcProofTyping. process_formula hyps f) f in
270
- t_pr_rewrite_low (s,do_ev ) tc
267
+ let t_pr_rewrite_i (s , f ) tc =
268
+ let do_ev = omap (fun f _ _ _ -> f) f in
269
+ t_pr_rewrite_low (s, do_ev) tc
270
+
271
+ let t_pr_rewrite (s , f ) tc =
272
+ let to_env f tc torw ty =
273
+ let env, hyps, _ = FApi. tc1_eflat tc in
274
+ let pr = destr_pr torw in
275
+ let mp = EcEnv.Fun. prF_memenv EcFol. mhr pr.pr_fun env in
276
+ let hyps = LDecl. push_active mp hyps in
277
+ EcProofTyping. process_form hyps f ty
278
+ in
279
+ t_pr_rewrite_low (s, omap to_env f ) tc
0 commit comments