Skip to content

Commit 595fa43

Browse files
lyonel2017strub
authored andcommitted
Represent exception default postconditions inside the exception map
Store exceptional postconditions as a single `Mop.t`, using the default case as the `None` key instead of a separate optional field.
1 parent f0827a1 commit 595fa43

13 files changed

Lines changed: 190 additions & 185 deletions

src/ecAst.ml

Lines changed: 33 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ and pr = {
294294

295295
and exnpost = {
296296
main : form;
297-
exnmap : form Mp.t * form option;
297+
exnmap : form Mop.t;
298298
}
299299

300300
let map_ss_inv ?m (fn: form list -> form) (invs: ss_inv list): ss_inv =
@@ -565,33 +565,33 @@ let map_inv3 (fn: form -> form -> form -> form)
565565
failwith "incompatible invariants for map_inv3"
566566

567567
(* ----------------------------------------------------------------- *)
568-
type 'a prepoe = 'a * ('a Mp.t * 'a option)
568+
type 'a prepoe = 'a * ('a Mop.t)
569569

570570
module POE = struct
571-
let mk (main : form) (exnmap : form Mp.t * form option) =
571+
let mk (main : form) (exnmap : form Mop.t) =
572572
{ main; exnmap; }
573573

574574
let destruct (poe : exnpost) =
575575
(poe.main, poe.exnmap)
576576

577577
let empty (f : form) : exnpost =
578-
{ main = f; exnmap = (Mp.empty, None); }
578+
{ main = f; exnmap = Mop.empty; }
579579

580-
let is_empty ({ exnmap = (m, dfl) } : exnpost) =
581-
Option.is_none dfl && Mp.is_empty m
580+
let is_empty ({ exnmap } : exnpost) =
581+
Mop.is_empty exnmap
582582

583583
let lift (f : ss_inv) =
584584
{ hsi_m = f.m; hsi_inv = empty f.inv; }
585585

586586
let lower (f : hs_inv) =
587587
{ m = f.hsi_m; inv = f.hsi_inv.main; }
588588

589-
let map (f : form -> form) ({ main; exnmap = (m, d) } : exnpost) : exnpost =
590-
{ main = f main; exnmap = (Mp.map f m, omap f d)}
589+
let map (f : form -> form) ({ main; exnmap } : exnpost) : exnpost =
590+
{ main = f main; exnmap = Mop.map f exnmap}
591591

592592
let map2_pre (f : 'a -> 'b -> 'c) (poe1 : 'a prepoe) (poe2 : 'b prepoe) : 'c prepoe =
593-
let (main1, (map1, d1)) = poe1 in
594-
let (main2, (map2, d2)) = poe2 in
593+
let (main1, map1) = poe1 in
594+
let (main2, map2) = poe2 in
595595

596596
let merge (a : 'a option) (b : 'b option) =
597597
match a, b with
@@ -601,10 +601,9 @@ module POE = struct
601601
in
602602

603603
let main = f main1 main2 in
604-
let map = Mp.merge (fun _ -> merge) map1 map2 in
605-
let dfl = merge d1 d2 in
604+
let map = Mop.merge (fun _ -> merge) map1 map2 in
606605

607-
(main, (map, dfl))
606+
(main, map)
608607

609608
let map2 (f : form -> form -> form) (poe1 : exnpost) (poe2 : exnpost) =
610609
let main, exnmap =
@@ -614,34 +613,28 @@ module POE = struct
614613

615614
let exists (f : form -> bool) (poe : exnpost) =
616615
f poe.main
617-
|| Mp.exists (fun _ -> f) (fst poe.exnmap)
618-
|| omap_dfl f false (snd poe.exnmap)
616+
|| Mop.exists (fun _ -> f) poe.exnmap
619617

620618
let forall (f : form -> bool) (poe : exnpost) =
621619
f poe.main
622-
&& Mp.for_all (fun _ -> f) (fst poe.exnmap)
623-
&& omap_dfl f true (snd poe.exnmap)
620+
&& Mop.for_all (fun _ -> f) poe.exnmap
624621

625622
let forall2 (f : form -> form -> bool) (poe1 : exnpost) (poe2 : exnpost) =
626623
f poe1.main poe2.main
627-
&& Mp.equal f (fst poe1.exnmap) (fst poe2.exnmap)
628-
&& oeq f (snd poe1.exnmap) (snd poe2.exnmap)
624+
&& Mop.equal f poe1.exnmap poe2.exnmap
629625

630-
let to_list_pre ((main, (map, d)) : 'a prepoe) =
631-
let l =
632-
Mp.fold
633-
(fun _ p1 a -> p1 :: a)
634-
map
635-
[main]
636-
in otolist d @ l
626+
let to_list_pre ((main, map) : 'a prepoe) =
627+
Mop.fold
628+
(fun _ p1 a -> p1 :: a)
629+
map
630+
[main]
637631

638632
let to_list (poe : exnpost) =
639633
to_list_pre (destruct poe)
640634

641635
let fold (tx : 'a -> form -> 'a) (state : 'a) (poe : exnpost) =
642636
let state = tx state poe.main in
643-
let state = Mp.fold (fun _ f state -> tx state f) (fst poe.exnmap) state in
644-
let state = ofold (fun f state -> tx state f) state (snd poe.exnmap) in
637+
let state = Mop.fold (fun _ f state -> tx state f) poe.exnmap state in
645638
state
646639

647640
let iter (tx : form -> unit) (poe : exnpost) =
@@ -655,15 +648,9 @@ module POE = struct
655648
| _, _ -> assert false in
656649

657650
f poe1.main poe2.main;
658-
Mp.iter
651+
Mop.iter
659652
(fun _ (a, b) -> f a b)
660-
(Mp.merge (fun _ -> merge) (fst poe1.exnmap) (fst poe2.exnmap));
661-
begin
662-
match snd poe1.exnmap, snd poe2.exnmap with
663-
| None, None -> ()
664-
| Some a, Some b -> f a b
665-
| _, _ -> assert false
666-
end
653+
(Mop.merge (fun _ -> merge) poe1.exnmap poe2.exnmap)
667654
end
668655

669656
(* ----------------------------------------------------------------- *)
@@ -1059,8 +1046,7 @@ let b_hash (bs : bindings) =
10591046
(*-------------------------------------------------------------------- *)
10601047
let posts_equal (poe1 : exnpost) (poe2 : exnpost) =
10611048
f_equal poe1.main poe2.main
1062-
&& Mp.equal f_equal (fst poe1.exnmap) (fst poe2.exnmap)
1063-
&& oeq f_equal (snd poe1.exnmap) (snd poe2.exnmap)
1049+
&& Mop.equal f_equal poe1.exnmap poe2.exnmap
10641050

10651051
(*-------------------------------------------------------------------- *)
10661052
let hf_equal hf1 hf2 =
@@ -1137,17 +1123,15 @@ let pr_equal pr1 pr2 =
11371123
&& mem_equal pr1.pr_event.m pr2.pr_event.m
11381124

11391125
(*-------------------------------------------------------------------- *)
1140-
let post_hash (p : path) (f : form) =
1141-
Why3.Hashcons.combine (EcPath.p_hash p) (f_hash f)
1142-
11431126
let posts_hash (poe : exnpost) =
1144-
let h =
1127+
let post_hash (p : path option) (f : form) =
11451128
Why3.Hashcons.combine
1146-
(f_hash poe.main) (omap_dfl f_hash 0 (snd poe.exnmap))
1147-
in
1148-
Mp.fold
1149-
(fun e f a -> Why3.Hashcons.combine a (post_hash e f))
1150-
(fst poe.exnmap) h
1129+
(Why3.Hashcons.combine_option EcPath.p_hash p)
1130+
(f_hash f) in
1131+
1132+
Mop.fold
1133+
(fun e f a -> Why3.Hashcons.combine a (post_hash e f))
1134+
poe.exnmap (f_hash poe.main)
11511135

11521136
(* -------------------------------------------------------------------- *)
11531137
let hf_hash hf =
@@ -1510,10 +1494,9 @@ module Hsform = Why3.Hashcons.Make (struct
15101494

15111495
let posts_fv (poe : exnpost) =
15121496
let fv = f_fv poe.main in
1513-
let fv = snd poe.exnmap |> omap f_fv |> odfl fv in
1514-
Mp.fold
1497+
Mop.fold
15151498
(fun _ f acc -> fv_union (f_fv f) acc)
1516-
(fst poe.exnmap) fv
1499+
poe.exnmap fv
15171500

15181501
let fv_node f =
15191502
let union ex nodes =

src/ecAst.mli

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -294,13 +294,13 @@ and bdHoareS = {
294294
bhs_po : form;
295295
[@alert priv_pl "Use the accessor function `bhs_po` instead of the field"]
296296
bhs_cmp : hoarecmp;
297-
bhs_bd : form;
297+
bhs_bd : form;
298298
[@alert priv_pl "Use the accessor function `bhs_bd` instead of the field"]
299299
}
300300

301301
and exnpost = {
302302
main : form;
303-
exnmap : form Mp.t * form option;
303+
exnmap : form Mop.t;
304304
}
305305

306306
and ss_inv = {
@@ -370,7 +370,7 @@ type hs_inv = {
370370
}
371371

372372
(* -------------------------------------------------------------------- *)
373-
type 'a prepoe = 'a * ('a Mp.t * 'a option)
373+
type 'a prepoe = 'a * ('a Mop.t)
374374

375375
module POE : sig
376376
val empty : form -> exnpost
@@ -381,9 +381,9 @@ module POE : sig
381381

382382
val lower : hs_inv -> ss_inv
383383

384-
val mk : form -> (form Mp.t * form option) -> exnpost
384+
val mk : form -> form Mop.t -> exnpost
385385

386-
val destruct : exnpost -> form * (form Mp.t * form option)
386+
val destruct : exnpost -> form * (form Mop.t)
387387

388388
val to_list_pre : 'a prepoe -> 'a list
389389

src/ecPrinting.ml

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ module Msym = EcSymbols.Msym
1919
module Sid = EcIdent.Sid
2020
module Mid = EcIdent.Mid
2121
module Sp = EcPath.Sp
22+
module Mop = EcPath.Mop
2223

2324
(* -------------------------------------------------------------------- *)
2425
type prpo_display = { prpo_pr : bool; prpo_po : bool; }
@@ -1836,7 +1837,7 @@ and try_pp_notations
18361837
let f = f_app (f_op p tv rty) (args @ eargs) f.f_ty in
18371838
pp_form_core_r ppe outer fmt f; true
18381839

1839-
and pp_poe ppe fmt (l,d) =
1840+
and pp_poe (ppe : PPEnv.t) (fmt : Format.formatter) (poe : form Mop.t) =
18401841
let pp_branch fmt (e, f) =
18411842
let bd, br = EcFol.decompose_lambda f in
18421843
let doarg (x, gty) =
@@ -1850,7 +1851,14 @@ and pp_poe ppe fmt (l,d) =
18501851
let ppe = PPEnv.add_locals ppe (List.map fst bd) in
18511852
Format.fprintf fmt "@[<hov 2>| %a =>@ %a]" (pp_form ppe) eargs (pp_form ppe) br
18521853
in
1853-
(pp_list "@ " pp_branch) fmt (EcPath.Mp.bindings l);
1854+
1855+
let poe, d =
1856+
List.partition_map (fun (p, v) ->
1857+
match p with Some p -> Left (p , v) | None -> Right v
1858+
) (Mop.bindings poe) in
1859+
let d = List.ohead d in
1860+
1861+
(pp_list "@ " pp_branch) fmt poe;
18541862
oiter (fun br -> Format.fprintf fmt "@[<hov 2>| _ =>@ %a]" (pp_form ppe) br) d
18551863

18561864
and pp_form_core_r
@@ -1985,24 +1993,24 @@ and pp_form_core_r
19851993
let ppepr = PPEnv.create_and_push_mem ppe ~active:true mepr in
19861994
let ppepo = PPEnv.create_and_push_mem ppe ~active:true mepo in
19871995
let pm = debug_mode || hf.hf_m.id_symb <> "&hr" in
1988-
let { main = post; exnmap = (poe, d) } = (hf_po hf).hsi_inv in
1996+
let { main = post; exnmap = poe } = (hf_po hf).hsi_inv in
19891997
Format.fprintf fmt "hoare[@[<hov 2>@ %a %a:@ @[%a ==>@ %a@ %a@]@]]"
19901998
(pp_funname ppe) hf.hf_f
19911999
(pp_pl_mem_binding pm ppe) hf.hf_m
19922000
(pp_form ppepr) (hf_pr hf).inv
19932001
(pp_form ppepo) (post)
1994-
(pp_poe ppepo) (poe, d)
2002+
(pp_poe ppepo) poe
19952003

19962004
| FhoareS hs ->
19972005
let ppe = PPEnv.push_mem ppe ~active:true hs.hs_m in
1998-
let { main = post; exnmap = (poe, d); } = (hs_po hs).hsi_inv in
2006+
let { main = post; exnmap = poe; } = (hs_po hs).hsi_inv in
19992007
let pm = debug_mode || (fst hs.hs_m).id_symb <> "&hr" in
20002008
Format.fprintf fmt "hoare[@[<hov 2>@ %a %a:@ @[%a ==>@ %a@ %a@]@]]"
20012009
(pp_stmt_for_form ppe) hs.hs_s
20022010
(pp_pl_mem_binding pm ppe) (fst hs.hs_m)
20032011
(pp_form ppe) (hs_pr hs).inv
20042012
(pp_form ppe) post
2005-
(pp_poe ppe) (poe, d)
2013+
(pp_poe ppe) poe
20062014

20072015
| FeHoareF hf ->
20082016
let mepr, mepo = EcEnv.Fun.hoareF_memenv hf.ehf_m hf.ehf_f ppe.PPEnv.ppe_env in
@@ -3092,8 +3100,8 @@ let pp_post (ppe : PPEnv.t) ?prpo fmt post =
30923100
fmt post None
30933101

30943102
(* -------------------------------------------------------------------- *)
3095-
let pp_poe (ppe : PPEnv.t) ?prpo (fmt: Format.formatter) (poe,d) =
3096-
let pp_branch e f =
3103+
let pp_poe (ppe : PPEnv.t) ?prpo (fmt: Format.formatter) poe =
3104+
let pp_branch (p : EcPath.path) (f : form) =
30973105
let bd, br = EcFol.decompose_lambda f in
30983106
let doarg (x, gty) =
30993107
match gty with
@@ -3102,41 +3110,42 @@ let pp_poe (ppe : PPEnv.t) ?prpo (fmt: Format.formatter) (poe,d) =
31023110
let args = List.map doarg bd in
31033111
let tys = List.map (fun (_, ty) -> EcFol.as_gtty ty) bd in
31043112
let ty = EcTypes.toarrow tys EcTypes.texn in
3105-
let eargs = EcFol.f_app (EcFol.f_op e [] ty) args EcTypes.texn in
3113+
let eargs = EcFol.f_app (EcFol.f_op p [] ty) args EcTypes.texn in
31063114
let ppe = PPEnv.add_locals ppe (List.map fst bd) in
31073115
pp_prpo ppe
31083116
(pp_form ppe) eargs
31093117
(omap (fun x -> x.prpo_po) prpo |> odfl false)
31103118
fmt br None
31113119
in
3112-
EcPath.Mp.iter pp_branch poe;
3120+
3121+
EcPath.Mop.iter (fun p f -> oiter (pp_branch^~ f) p) poe;
31133122
oiter (fun d ->
31143123
pp_prpo ppe Format.pp_print_string "_"
31153124
(omap (fun x -> x.prpo_po) prpo |> odfl false)
3116-
fmt d None) d
3125+
fmt d None)
3126+
(Mop.find_opt None poe)
31173127

31183128
(* -------------------------------------------------------------------- *)
31193129
let pp_hoareF (ppe : PPEnv.t) ?prpo fmt hf =
31203130
let mepr, mepo = EcEnv.Fun.hoareF_memenv hf.hf_m hf.hf_f ppe.PPEnv.ppe_env in
31213131
let ppepr = PPEnv.create_and_push_mem ppe ~active:true mepr in
31223132
let ppepo = PPEnv.create_and_push_mem ppe ~active:true mepo in
31233133

3124-
let { main = post; exnmap = (poe, d); } = (hf_po hf).hsi_inv in
3134+
let { main = post; exnmap = poe; } = (hf_po hf).hsi_inv in
31253135

31263136
Format.fprintf fmt "%a@\n%!" (pp_pre ppepr ?prpo) (hf_pr hf).inv;
31273137
let pm = debug_mode || hf.hf_m.id_symb <> "&hr" in
31283138
Format.fprintf fmt " %a %a@\n%!" (pp_funname ppe) hf.hf_f (pp_pl_mem_binding pm ppe) hf.hf_m;
31293139
Format.fprintf fmt "@\n%a" (pp_post ppepo ?prpo) post;
3130-
Format.fprintf fmt "@\n%a%!" (pp_poe ppepo ?prpo) (poe,d)
3140+
Format.fprintf fmt "@\n%a%!" (pp_poe ppepo ?prpo) poe
31313141

31323142
(* -------------------------------------------------------------------- *)
31333143

31343144
let pp_hoareS (ppe : PPEnv.t) ?prpo fmt hs =
31353145
let ppef = PPEnv.push_mem ppe ~active:true hs.hs_m in
31363146
let ppnode = collect2_s ppef hs.hs_s.s_node [] in
31373147

3138-
let { main = post; exnmap = (poe, d); } = (hs_po hs).hsi_inv in
3139-
3148+
let { main = post; exnmap = poe; } = (hs_po hs).hsi_inv in
31403149
let ppnode = c_ppnode ~width:ppe.PPEnv.ppe_width ppef ppnode in
31413150

31423151
Format.fprintf fmt "Context : %a: %a@\n%!" (pp_mem ppe) (fst hs.hs_m)
@@ -3148,7 +3157,7 @@ let pp_hoareS (ppe : PPEnv.t) ?prpo fmt hs =
31483157
Format.fprintf fmt "@\n%!";
31493158
Format.fprintf fmt "%a%!" (pp_post ppef ?prpo) post;
31503159
Format.fprintf fmt "@\n%!";
3151-
Format.fprintf fmt "%a%!" (pp_poe ppef ?prpo) (poe,d)
3160+
Format.fprintf fmt "%a%!" (pp_poe ppef ?prpo) poe
31523161

31533162
(* -------------------------------------------------------------------- *)
31543163
let pp_eHoareF (ppe : PPEnv.t) ?prpo fmt hf =

src/ecProofTyping.ml

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,9 @@ let pf_process_pattern pe hyps fp =
8989
let pf_process_poe hyps poe =
9090
let env = LDecl.toenv hyps in
9191
let ue = unienv_of_hyps hyps in
92-
let m, d = EcTyping.trans_poe env ue poe in
92+
let m = EcTyping.trans_poe env ue poe in
9393
let ts = Tuni.subst (EcUnify.UniEnv.close ue) in
94-
Mp.map (EcFol.Fsubst.f_subst ts) m, omap (EcFol.Fsubst.f_subst ts) d
94+
Mop.map (EcFol.Fsubst.f_subst ts) m
9595

9696
(* ------------------------------------------------------------------ *)
9797
let tc1_process_form_opt ?mv tc oty pf =
@@ -262,7 +262,14 @@ let destruct_exists ?(reduce = true) hyps fp : dexists option =
262262
lazy_destruct ~reduce hyps doit fp
263263

264264
(* -------------------------------------------------------------------- *)
265-
let merge2_poe_list (poe1,d1) (poe2,d2) =
265+
let merge2_poe_list (poe1 : form Mop.t) (poe2 : form Mop.t) =
266+
let remove_default (poe : form Mop.t) =
267+
match Mop.find_opt None poe with
268+
| None -> poe, None
269+
| Some x -> Mop.remove None poe, Some x
270+
in
271+
let poe1, d1 = remove_default poe1 in
272+
let poe2, d2 = remove_default poe2 in
266273
let get_default d =
267274
match d with
268275
| Some d -> d
@@ -285,8 +292,8 @@ let merge2_poe_list (poe1,d1) (poe2,d2) =
285292

286293
| None, None -> assert false
287294
in
288-
let epost = Mp.merge aux poe1 poe2 in
289-
let poe = List.map snd (Mp.bindings epost) in
295+
let epost = Mop.merge aux poe1 poe2 in
296+
let poe = List.map snd (Mop.bindings epost) in
290297
match d2, d1 with
291298
| None, _ -> poe
292299
| Some d2, Some d1 -> f_imp d2 d1 :: poe

0 commit comments

Comments
 (0)