Skip to content

Commit 0df0731

Browse files
committed
squash
1 parent c54cbb5 commit 0df0731

83 files changed

Lines changed: 3951 additions & 2692 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/ecAst.ml

Lines changed: 343 additions & 16 deletions
Large diffs are not rendered by default.

src/ecAst.mli

Lines changed: 137 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -201,80 +201,214 @@ and f_node =
201201

202202
| Fpr of pr (* hr *)
203203

204+
(* We use the alert system for privacy because we want to
205+
permit access in *some* instances, and the other fields are fine *)
204206
and eagerF = {
207+
eg_ml : memory;
208+
eg_mr : memory;
205209
eg_pr : form;
210+
(*[@alert priv_pl "Use the accessor function `eg_pr` instead of the field"]*)
206211
eg_sl : stmt; (* No local program variables *)
207212
eg_fl : EcPath.xpath;
208213
eg_fr : EcPath.xpath;
209214
eg_sr : stmt; (* No local program variables *)
210215
eg_po : form
216+
(*[@alert priv_pl "Use the accessor function `es_po` instead of the field"]*)
211217
}
212218

213219
and equivF = {
220+
ef_ml : memory;
221+
ef_mr : memory;
214222
ef_pr : form;
223+
(*[@alert priv_pl "Use the accessor function `ef_pr` instead of the field"]*)
215224
ef_fl : EcPath.xpath;
216225
ef_fr : EcPath.xpath;
217226
ef_po : form;
227+
(*[@alert priv_pl "Use the accessor function `ef_po` instead of the field"]*)
218228
}
219229

220230
and equivS = {
221231
es_ml : memenv;
222232
es_mr : memenv;
223233
es_pr : form;
234+
(*[@alert priv_pl "Use the accessor function `es_pr` instead of the field"]*)
224235
es_sl : stmt;
225236
es_sr : stmt;
226-
es_po : form; }
237+
es_po : form;
238+
(*[@alert priv_pl "Use the accessor function `es_po` instead of the field"]*)
239+
}
227240

228241
and sHoareF = {
242+
hf_m : memory;
229243
hf_pr : form;
244+
[@alert priv_pl "Use the accessor function `hf_pr` instead of the field"]
230245
hf_f : EcPath.xpath;
231246
hf_po : form;
247+
[@alert priv_pl "Use the accessor function `hf_pr` instead of the field"]
232248
}
233249

234250
and sHoareS = {
235251
hs_m : memenv;
236252
hs_pr : form;
253+
(*[@alert priv_pl "Use the accessor function `hs_pr` instead of the field"]*)
237254
hs_s : stmt;
238-
hs_po : form; }
255+
hs_po : form;
256+
(*[@alert priv_pl "Use the accessor function `hs_po` instead of the field"]*)
257+
}
239258

240259

241260
and eHoareF = {
261+
ehf_m : memory;
242262
ehf_pr : form;
263+
(*[@alert priv_pl "Use the accessor function `ehf_pr` instead of the field"]*)
243264
ehf_f : EcPath.xpath;
244265
ehf_po : form;
266+
(*[@alert priv_pl "Use the accessor function `ehf_po` instead of the field"]*)
245267
}
246268

247269
and eHoareS = {
248270
ehs_m : memenv;
249271
ehs_pr : form;
272+
(*[@alert priv_pl "Use the accessor function `ehs_pr` instead of the field"]*)
250273
ehs_s : stmt;
251274
ehs_po : form;
275+
(*[@alert priv_pl "Use the accessor function `ehs_po` instead of the field"]*)
252276
}
253277

254278
and bdHoareF = {
279+
bhf_m : memory;
255280
bhf_pr : form;
281+
(*[@alert priv_pl "Use the accessor function `bhf_pr` instead of the field"]*)
256282
bhf_f : EcPath.xpath;
257283
bhf_po : form;
284+
(*[@alert priv_pl "Use the accessor function `bhf_po` instead of the field"]*)
258285
bhf_cmp : hoarecmp;
259286
bhf_bd : form;
260287
}
261288

262289
and bdHoareS = {
263290
bhs_m : memenv;
264291
bhs_pr : form;
292+
(*[@alert priv_pl "Use the accessor function `bhs_pr` instead of the field"]*)
265293
bhs_s : stmt;
266294
bhs_po : form;
295+
(*[@alert priv_pl "Use the accessor function `bhs_po` instead of the field"]*)
267296
bhs_cmp : hoarecmp;
268297
bhs_bd : form;
269298
}
270299

300+
and ss_inv = {
301+
m : memory;
302+
inv : form;
303+
}
304+
271305
and pr = {
272306
pr_mem : memory;
273307
pr_fun : EcPath.xpath;
274308
pr_args : form;
275-
pr_event : form;
309+
pr_event : ss_inv;
310+
}
311+
312+
313+
val map_ss_inv : ?m:memory -> (form list -> form) -> ss_inv list -> ss_inv
314+
val map_ss_inv1 : (form -> form) -> ss_inv -> ss_inv
315+
val map_ss_inv2 : (form -> form -> form) -> ss_inv -> ss_inv -> ss_inv
316+
val map_ss_inv3 : (form -> form -> form -> form) -> ss_inv -> ss_inv -> ss_inv -> ss_inv
317+
318+
val map_ss_inv_destr2 : (form -> form * form) -> ss_inv -> ss_inv * ss_inv
319+
val map_ss_inv_destr3 : (form -> form * form * form) -> ss_inv -> ss_inv * ss_inv * ss_inv
320+
321+
type ts_inv = {
322+
ml : memory;
323+
mr : memory;
324+
inv : form;
276325
}
277326

327+
val map_ts_inv : ?ml:memory -> ?mr:memory -> (form list -> form) -> ts_inv list -> ts_inv
328+
val map_ts_inv1 : (form -> form) -> ts_inv -> ts_inv
329+
val map_ts_inv2 : (form -> form -> form) -> ts_inv -> ts_inv -> ts_inv
330+
val map_ts_inv3 : (form -> form -> form -> form) -> ts_inv -> ts_inv -> ts_inv -> ts_inv
331+
332+
val map_ts_inv_left : (ss_inv list -> ss_inv) -> ts_inv list -> ts_inv
333+
val map_ts_inv_left1 : (ss_inv -> ss_inv) -> ts_inv -> ts_inv
334+
val map_ts_inv_left2 : (ss_inv -> ss_inv -> ss_inv) -> ts_inv -> ts_inv -> ts_inv
335+
val map_ts_inv_left3 : (ss_inv -> ss_inv -> ss_inv -> ss_inv) ->
336+
ts_inv -> ts_inv -> ts_inv -> ts_inv
337+
338+
val map_ts_inv_right : (ss_inv list -> ss_inv) -> ts_inv list -> ts_inv
339+
val map_ts_inv_right1 : (ss_inv -> ss_inv) -> ts_inv -> ts_inv
340+
val map_ts_inv_right2 : (ss_inv -> ss_inv -> ss_inv) -> ts_inv -> ts_inv -> ts_inv
341+
val map_ts_inv_right3 : (ss_inv -> ss_inv -> ss_inv -> ss_inv) ->
342+
ts_inv -> ts_inv -> ts_inv -> ts_inv
343+
344+
val map_ts_inv_destr2 : (form -> form * form) -> ts_inv -> ts_inv * ts_inv
345+
val map_ts_inv_destr3 : (form -> form * form * form) -> ts_inv -> ts_inv * ts_inv * ts_inv
346+
347+
(* -------------------------------------------------------------------- *)
348+
(* Lowering tactics *)
349+
(* -------------------------------------------------------------------- *)
350+
351+
val ts_inv_lower_left : (ss_inv list -> form) -> ts_inv list -> ss_inv
352+
val ts_inv_lower_left1 : (ss_inv -> form) -> ts_inv -> ss_inv
353+
val ts_inv_lower_left2 : (ss_inv -> ss_inv -> form) -> ts_inv -> ts_inv -> ss_inv
354+
val ts_inv_lower_left3 : (ss_inv -> ss_inv -> ss_inv -> form) ->
355+
ts_inv -> ts_inv -> ts_inv -> ss_inv
356+
357+
val ts_inv_lower_right : (ss_inv list -> form) -> ts_inv list -> ss_inv
358+
val ts_inv_lower_right1 : (ss_inv -> form) -> ts_inv -> ss_inv
359+
val ts_inv_lower_right2 : (ss_inv -> ss_inv -> form) -> ts_inv -> ts_inv -> ss_inv
360+
val ts_inv_lower_right3 : (ss_inv -> ss_inv -> ss_inv -> form) ->
361+
ts_inv -> ts_inv -> ts_inv -> ss_inv
362+
363+
(* -------------------------------------------------------------------- *)
364+
(* Invariants *)
365+
(* -------------------------------------------------------------------- *)
366+
367+
type inv =
368+
| Inv_ss of ss_inv
369+
| Inv_ts of ts_inv
370+
371+
val inv_of_inv : inv -> form
372+
373+
val lift_ss_inv : (ss_inv -> 'a) -> inv -> 'a
374+
val lift_ss_inv2 : (ss_inv -> ss_inv -> 'a) -> inv -> inv -> 'a
375+
val lift_ss_inv3 : (ss_inv -> ss_inv -> ss_inv -> 'a) -> inv -> inv -> inv -> 'a
376+
val lift_ts_inv : (ts_inv -> 'a) -> inv -> 'a
377+
val lift_ts_inv2 : (ts_inv -> ts_inv -> 'a) -> inv -> inv -> 'a
378+
val lift_inv_adapter : (form -> 'a) -> inv -> 'a
379+
val lift_inv_adapter2 : (form -> form -> 'a) -> inv -> inv -> 'a
380+
381+
val ss_inv_generalize_left : ss_inv -> memory -> ts_inv
382+
val ss_inv_generalize_right : ss_inv -> memory -> ts_inv
383+
384+
val map_inv : (form list -> form) -> inv list -> inv
385+
val map_inv1 : (form -> form) -> inv -> inv
386+
val map_inv2 : (form -> form -> form) -> inv -> inv -> inv
387+
val map_inv3 : (form -> form -> form -> form) -> inv -> inv -> inv -> inv
388+
389+
val eg_pr : eagerF -> ts_inv
390+
val eg_po : eagerF -> ts_inv
391+
val ef_pr : equivF -> ts_inv
392+
val ef_po : equivF -> ts_inv
393+
val es_pr : equivS -> ts_inv
394+
val es_po : equivS -> ts_inv
395+
val hf_pr : sHoareF -> ss_inv
396+
val hf_po : sHoareF -> ss_inv
397+
val hs_pr : sHoareS -> ss_inv
398+
val hs_po : sHoareS -> ss_inv
399+
val ehf_pr : eHoareF -> ss_inv
400+
val ehf_po : eHoareF -> ss_inv
401+
val ehs_pr : eHoareS -> ss_inv
402+
val ehs_po : eHoareS -> ss_inv
403+
val bhf_pr : bdHoareF -> ss_inv
404+
val bhf_po : bdHoareF -> ss_inv
405+
val bhf_bd : bdHoareF -> ss_inv
406+
val bhs_pr : bdHoareS -> ss_inv
407+
val bhs_po : bdHoareS -> ss_inv
408+
val bhs_bd : bdHoareS -> ss_inv
409+
410+
(* -------------------------------------------------------------------- *)
411+
278412
type 'a equality = 'a -> 'a -> bool
279413
type 'a hash = 'a -> int
280414
type 'a fv = 'a -> int EcIdent.Mid.t

src/ecCallbyValue.ml

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ open EcEnv
77
open EcFol
88
open EcReduction
99
open EcBaseLogic
10+
open EcMemory
1011
module BI = EcBigInt
1112

1213
(* -------------------------------------------------------------------- *)
@@ -297,7 +298,7 @@ and try_reduce_fixdef
297298
subst bds cargs)
298299
subst bds pargs in
299300

300-
let body = EcFol.form_of_expr EcFol.mhr body in
301+
let body = EcFol.form_of_expr body in
301302
let body =
302303
Tvar.f_subst ~freshen:true (List.map fst op.EcDecl.op_tparams) tys body in
303304

@@ -457,7 +458,7 @@ and cbv (st : state) (s : subst) (f : form) (args : args) : form =
457458
if st.st_ri.modpath
458459
then EcEnv.NormMp.norm_pvar st.st_env pv
459460
else pv in
460-
app_red st (f_pvar pv f.f_ty m) args
461+
app_red st (f_pvar pv f.f_ty m).inv args
461462

462463
| Fop _ -> app_red st (Subst.subst s f) args
463464

@@ -479,11 +480,12 @@ and cbv (st : state) (s : subst) (f : form) (args : args) : form =
479480

480481
| FhoareF hf ->
481482
assert (Args.isempty args);
482-
assert (not (Subst.has_mem s mhr));
483-
let hf_pr = norm st s hf.hf_pr in
484-
let hf_po = norm st s hf.hf_po in
483+
assert (not (Subst.has_mem s hf.hf_m));
484+
let hf_pr = norm st s hf.hf_pr [@alert "-priv_pl"] in
485+
let hf_po = norm st s hf.hf_po [@alert "-priv_pl"] in
485486
let hf_f = norm_xfun st s hf.hf_f in
486-
f_hoareF_r { hf_pr; hf_f; hf_po }
487+
let (m,_) = norm_me s (abstract hf.hf_m) in
488+
f_hoareF {m;inv=hf_pr} hf_f {m;inv=hf_po}
487489

488490
| FhoareS hs ->
489491
assert (Args.isempty args);
@@ -492,33 +494,36 @@ and cbv (st : state) (s : subst) (f : form) (args : args) : form =
492494
let hs_po = norm st s hs.hs_po in
493495
let hs_s = norm_stmt s hs.hs_s in
494496
let hs_m = norm_me s hs.hs_m in
495-
f_hoareS_r { hs_pr; hs_po; hs_s; hs_m }
497+
let m = fst hs_m in
498+
f_hoareS (snd hs_m) {m;inv=hs_pr} hs_s {m;inv=hs_po}
496499

497500
| FeHoareF hf ->
498501
assert (Args.isempty args);
499502
assert (not (Subst.has_mem s mhr));
500503
let ehf_pr = norm st s hf.ehf_pr in
501504
let ehf_po = norm st s hf.ehf_po in
502505
let ehf_f = norm_xfun st s hf.ehf_f in
503-
f_eHoareF_r { ehf_pr; ehf_f; ehf_po; }
506+
let (m,_) = norm_me s (abstract hf.ehf_m) in
507+
f_eHoareF {m;inv=ehf_pr} ehf_f {m;inv=ehf_po}
504508

505509
| FeHoareS hs ->
506510
assert (Args.isempty args);
507511
assert (not (Subst.has_mem s (fst hs.ehs_m)));
508512
let ehs_pr = norm st s hs.ehs_pr in
509513
let ehs_po = norm st s hs.ehs_po in
510514
let ehs_s = norm_stmt s hs.ehs_s in
511-
let ehs_m = norm_me s hs.ehs_m in
512-
f_eHoareS_r { ehs_pr; ehs_po; ehs_s; ehs_m }
515+
let (m,mt) = norm_me s hs.ehs_m in
516+
f_eHoareS mt {m;inv=ehs_pr} ehs_s {m;inv=ehs_po}
513517

514518
| FbdHoareF hf ->
515519
assert (Args.isempty args);
516-
assert (not (Subst.has_mem s mhr));
520+
assert (not (Subst.has_mem s hf.bhf_m));
517521
let bhf_pr = norm st s hf.bhf_pr in
518522
let bhf_po = norm st s hf.bhf_po in
519523
let bhf_f = norm_xfun st s hf.bhf_f in
520524
let bhf_bd = norm st s hf.bhf_bd in
521-
f_bdHoareF_r { hf with bhf_pr; bhf_po; bhf_f; bhf_bd }
525+
let (m,_) = norm_me s (abstract hf.bhf_m) in
526+
f_bdHoareF {m;inv=bhf_pr} bhf_f {m;inv=bhf_po} hf.bhf_cmp {m;inv=bhf_bd}
522527

523528
| FbdHoareS bhs ->
524529
assert (Args.isempty args);
@@ -527,18 +532,20 @@ and cbv (st : state) (s : subst) (f : form) (args : args) : form =
527532
let bhs_po = norm st s bhs.bhs_po in
528533
let bhs_s = norm_stmt s bhs.bhs_s in
529534
let bhs_bd = norm st s bhs.bhs_bd in
530-
let bhs_m = norm_me s bhs.bhs_m in
531-
f_bdHoareS_r { bhs with bhs_m; bhs_pr; bhs_po; bhs_s; bhs_bd }
535+
let (m,mt) = norm_me s bhs.bhs_m in
536+
f_bdHoareS mt {m;inv=bhs_pr} bhs_s {m;inv=bhs_po} bhs.bhs_cmp {m;inv=bhs_bd}
532537

533538
| FequivF ef ->
534539
assert (Args.isempty args);
535-
assert (not (Subst.has_mem s mleft));
536-
assert (not (Subst.has_mem s mright));
540+
assert (not (Subst.has_mem s ef.ef_ml));
541+
assert (not (Subst.has_mem s ef.ef_mr));
537542
let ef_pr = norm st s ef.ef_pr in
538543
let ef_po = norm st s ef.ef_po in
539544
let ef_fl = norm_xfun st s ef.ef_fl in
540545
let ef_fr = norm_xfun st s ef.ef_fr in
541-
f_equivF_r {ef_pr; ef_fl; ef_fr; ef_po }
546+
let (ml,_) = norm_me s (abstract ef.ef_ml) in
547+
let (mr,_) = norm_me s (abstract ef.ef_mr) in
548+
f_equivF {ml;mr;inv=ef_pr} ef_fl ef_fr {ml;mr;inv=ef_po}
542549

543550
| FequivS es ->
544551
assert (Args.isempty args);
@@ -548,9 +555,9 @@ and cbv (st : state) (s : subst) (f : form) (args : args) : form =
548555
let es_po = norm st s es.es_po in
549556
let es_sl = norm_stmt s es.es_sl in
550557
let es_sr = norm_stmt s es.es_sr in
551-
let es_ml = norm_me s es.es_ml in
552-
let es_mr = norm_me s es.es_mr in
553-
f_equivS_r {es_ml; es_mr; es_pr; es_sl; es_sr; es_po }
558+
let (ml,mlt) = norm_me s es.es_ml in
559+
let (mr,mrt) = norm_me s es.es_mr in
560+
f_equivS mlt mrt {ml;mr;inv=es_pr} es_sl es_sr {ml;mr;inv=es_po}
554561

555562
| FeagerF eg ->
556563
assert (Args.isempty args);
@@ -562,16 +569,19 @@ and cbv (st : state) (s : subst) (f : form) (args : args) : form =
562569
let eg_fr = norm_xfun st s eg.eg_fr in
563570
let eg_sl = norm_stmt s eg.eg_sl in
564571
let eg_sr = norm_stmt s eg.eg_sr in
565-
f_eagerF_r {eg_pr; eg_sl; eg_fl; eg_fr; eg_sr; eg_po }
572+
let (ml,_) = norm_me s (abstract eg.eg_ml) in
573+
let (mr,_) = norm_me s (abstract eg.eg_mr) in
574+
f_eagerF {ml;mr;inv=eg_pr} eg_sl eg_fl eg_fr eg_sr {ml;mr;inv=eg_po}
566575

567576
| Fpr pr ->
568577
assert (Args.isempty args);
569578
assert (not (Subst.has_mem s mhr));
570579
let pr_mem = Subst.subst_m s pr.pr_mem in
571580
let pr_fun = norm_xfun st s pr.pr_fun in
572581
let pr_args = norm st s pr.pr_args in
573-
let pr_event = norm st s pr.pr_event in
574-
f_pr_r { pr_mem; pr_fun; pr_args; pr_event; }
582+
let pr_event = norm st s pr.pr_event.inv in
583+
let (m,_) = norm_me s (abstract pr.pr_event.m) in
584+
f_pr pr_mem pr_fun pr_args {m;inv=pr_event}
575585

576586
(* -------------------------------------------------------------------- *)
577587
(* FIXME : initialize the subst with let in hyps *)

0 commit comments

Comments
 (0)