Skip to content

Commit 43e403a

Browse files
committed
Merge the default optional postcondition for exception into the map of exceptions
1 parent cc03b30 commit 43e403a

15 files changed

Lines changed: 139 additions & 135 deletions

src/ecAst.ml

Lines changed: 26 additions & 45 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 Mp.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 Mp.t)
569569

570570
module POE = struct
571-
let mk (main : form) (exnmap : form Mp.t * form option) =
571+
let mk (main : form) (exnmap : form Mp.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 = Mp.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+
Mp.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 = Mp.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
@@ -602,9 +602,8 @@ module POE = struct
602602

603603
let main = f main1 main2 in
604604
let map = Mp.merge (fun _ -> merge) map1 map2 in
605-
let dfl = merge d1 d2 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+
|| Mp.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+
&& Mp.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+
&& Mp.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+
Mp.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 = Mp.fold (fun _ f state -> tx state f) poe.exnmap state in
645638
state
646639

647640
let iter (tx : form -> unit) (poe : exnpost) =
@@ -657,13 +650,7 @@ module POE = struct
657650
f poe1.main poe2.main;
658651
Mp.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+
(Mp.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+
&& Mp.equal f_equal poe1.exnmap poe2.exnmap
10641050

10651051
(*-------------------------------------------------------------------- *)
10661052
let hf_equal hf1 hf2 =
@@ -1141,13 +1127,9 @@ let post_hash (p : path) (f : form) =
11411127
Why3.Hashcons.combine (EcPath.p_hash p) (f_hash f)
11421128

11431129
let posts_hash (poe : exnpost) =
1144-
let h =
1145-
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
1130+
Mp.fold
1131+
(fun e f a -> Why3.Hashcons.combine a (post_hash e f))
1132+
poe.exnmap (f_hash poe.main)
11511133

11521134
(* -------------------------------------------------------------------- *)
11531135
let hf_hash hf =
@@ -1510,10 +1492,9 @@ module Hsform = Why3.Hashcons.Make (struct
15101492

15111493
let posts_fv (poe : exnpost) =
15121494
let fv = f_fv poe.main in
1513-
let fv = snd poe.exnmap |> omap f_fv |> odfl fv in
15141495
Mp.fold
15151496
(fun _ f acc -> fv_union (f_fv f) acc)
1516-
(fst poe.exnmap) fv
1497+
poe.exnmap fv
15171498

15181499
let fv_node f =
15191500
let union ex nodes =

src/ecAst.mli

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ and bdHoareS = {
300300

301301
and exnpost = {
302302
main : form;
303-
exnmap : form Mp.t * form option;
303+
exnmap : form Mp.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 Mp.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 Mp.t -> exnpost
385385

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

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

src/ecCoreLib.ml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ let i_top = "Top"
1010
let i_self = "Self"
1111
let p_top = EcPath.psymbol i_top
1212

13+
let i_wild = "_"
14+
let p_wild = EcPath.psymbol i_wild
15+
1316
(* -------------------------------------------------------------------- *)
1417
let i_Pervasive = "Pervasive"
1518
let p_Pervasive = EcPath.pqname p_top i_Pervasive

src/ecCoreLib.mli

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ val i_top : symbol
2323
val i_self : symbol
2424
val p_top : path
2525

26+
val i_wild : symbol
27+
val p_wild : path
28+
2629
(* -------------------------------------------------------------------- *)
2730
val i_Pervasive : symbol
2831
val p_Pervasive : path

src/ecPrinting.ml

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1973,7 +1973,12 @@ and pp_form_core_r
19731973
let ppepr = PPEnv.create_and_push_mem ppe ~active:true mepr in
19741974
let ppepo = PPEnv.create_and_push_mem ppe ~active:true mepo in
19751975
let pm = debug_mode || hf.hf_m.id_symb <> "&hr" in
1976-
let { main = post; exnmap = (poe, d) } = (hf_po hf).hsi_inv in
1976+
let { main = post; exnmap = poe } = (hf_po hf).hsi_inv in
1977+
let poe, d =
1978+
match EcPath.Mp.find EcCoreLib.p_wild poe with
1979+
| x -> EcPath.Mp.remove EcCoreLib.p_wild poe, Some x
1980+
| exception Not_found -> poe, None
1981+
in
19771982
Format.fprintf fmt "hoare[@[<hov 2>@ %a %a:@ @[%a ==>@ %a@ %a]@]]"
19781983
(pp_funname ppe) hf.hf_f
19791984
(pp_pl_mem_binding pm ppe) hf.hf_m
@@ -1983,7 +1988,12 @@ and pp_form_core_r
19831988

19841989
| FhoareS hs ->
19851990
let ppe = PPEnv.push_mem ppe ~active:true hs.hs_m in
1986-
let { main = post; exnmap = (poe, d); } = (hs_po hs).hsi_inv in
1991+
let { main = post; exnmap = poe; } = (hs_po hs).hsi_inv in
1992+
let poe, d =
1993+
match EcPath.Mp.find EcCoreLib.p_wild poe with
1994+
| x -> EcPath.Mp.remove EcCoreLib.p_wild poe, Some x
1995+
| exception Not_found -> poe, None
1996+
in
19871997
let pm = debug_mode || (fst hs.hs_m).id_symb <> "&hr" in
19881998
Format.fprintf fmt "hoare[@[<hov 2>@ %a %a:@ @[%a ==>@ %a@ %a]@]]"
19891999
(pp_stmt_for_form ppe) hs.hs_s
@@ -3079,7 +3089,12 @@ let pp_hoareF (ppe : PPEnv.t) ?prpo fmt hf =
30793089
let ppepr = PPEnv.create_and_push_mem ppe ~active:true mepr in
30803090
let ppepo = PPEnv.create_and_push_mem ppe ~active:true mepo in
30813091

3082-
let { main = post; exnmap = (poe, d); } = (hf_po hf).hsi_inv in
3092+
let { main = post; exnmap = poe; } = (hf_po hf).hsi_inv in
3093+
let poe, d =
3094+
match EcPath.Mp.find EcCoreLib.p_wild poe with
3095+
| x -> EcPath.Mp.remove EcCoreLib.p_wild poe, Some x
3096+
| exception Not_found -> poe, None
3097+
in
30833098

30843099
Format.fprintf fmt "%a@\n%!" (pp_pre ppepr ?prpo) (hf_pr hf).inv;
30853100
let pm = debug_mode || hf.hf_m.id_symb <> "&hr" in
@@ -3093,7 +3108,12 @@ let pp_hoareS (ppe : PPEnv.t) ?prpo fmt hs =
30933108
let ppef = PPEnv.push_mem ppe ~active:true hs.hs_m in
30943109
let ppnode = collect2_s ppef hs.hs_s.s_node [] in
30953110

3096-
let { main = post; exnmap = (poe, d); } = (hs_po hs).hsi_inv in
3111+
let { main = post; exnmap = poe; } = (hs_po hs).hsi_inv in
3112+
let poe, d =
3113+
match EcPath.Mp.find EcCoreLib.p_wild poe with
3114+
| x -> EcPath.Mp.remove EcCoreLib.p_wild poe, Some x
3115+
| exception Not_found -> poe, None
3116+
in
30973117

30983118
let ppnode = c_ppnode ~width:ppe.PPEnv.ppe_width ppef ppnode in
30993119

src/ecProofTyping.ml

Lines changed: 10 additions & 3 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+
Mp.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 poe2 =
266+
let aux poe =
267+
match EcPath.Mp.find EcCoreLib.p_wild poe with
268+
| x -> EcPath.Mp.remove EcCoreLib.p_wild poe, Some x
269+
| exception Not_found -> poe, None
270+
in
271+
let poe1, d1 = aux poe1 in
272+
let poe2, d2 = aux poe2 in
266273
let get_default d =
267274
match d with
268275
| Some d -> d

src/ecProofTyping.mli

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ val pf_process_xreal : proofenv -> ?mv:metavs -> LDecl.hyps -> pformula -> fo
3333

3434
val pf_process_exp : proofenv -> LDecl.hyps -> [`InProc|`InOp] -> ty option -> pexpr -> expr
3535
val pf_process_pattern : proofenv -> LDecl.hyps -> pformula -> ptnenv * form
36-
val pf_process_poe : LDecl.hyps -> phoare_exception -> form Mp.t * form option
36+
val pf_process_poe : LDecl.hyps -> phoare_exception -> form Mp.t
3737

3838
(* Typing in the [proofenv] implies for the [tcenv].
3939
* Typing exceptions are recasted in the proof env. context *)
@@ -83,7 +83,4 @@ val destruct_product: ?reduce:bool -> EcEnv.LDecl.hyps -> form -> dproduct optio
8383
val destruct_exists : ?reduce:bool -> EcEnv.LDecl.hyps -> form -> dexists option
8484

8585
(* -------------------------------------------------------------------- *)
86-
val merge2_poe_list :
87-
form Mp.t * form option ->
88-
form Mp.t * form option ->
89-
form list
86+
val merge2_poe_list : form Mp.t -> form Mp.t -> form list

src/ecReduction.ml

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1344,19 +1344,13 @@ let ztuple args1 args2 ty stk = zpush Ztuple [] args1 args2 ty stk
13441344
let zproj i ty stk = zpush (Zproj i) [] [] [] ty stk
13451345
let zhl f fs1 fs2 stk = zpush (Zhl f) [] fs1 fs2 f.f_ty stk
13461346

1347-
let zpoe ({ exnmap = (epost, d) } : exnpost) (dpoe : form list) =
1348-
let d, dpoe =
1349-
match d, dpoe with
1350-
| None, _ -> None, dpoe
1351-
| _, h::q -> Some h, q
1352-
| _, _ -> assert false
1353-
in
1347+
let zpoe ({ exnmap = epost } : exnpost) (dpoe : form list) =
13541348
let key = List.map fst (Mp.bindings epost) in
13551349
let poe =
13561350
List.fold_left2
13571351
(fun m a b -> Mp.add a b m)
13581352
Mp.empty key dpoe
1359-
in (poe,d)
1353+
in poe
13601354

13611355
let zpop ri side f hd =
13621356
let args =
@@ -1376,16 +1370,16 @@ let zpop ri side f hd =
13761370
| Zproj i, [f1] -> f_proj f1 i hd.se_ty
13771371
| Zhl {f_node = FhoareF hf}, (pr :: po :: dpoe) ->
13781372
let m = hf.hf_m in
1379-
let poe, d = zpoe (hf_po hf).hsi_inv dpoe in
1380-
f_hoareF {m;inv=pr} hf.hf_f { hsi_m = m; hsi_inv = POE.mk po (poe, d); }
1373+
let poe = zpoe (hf_po hf).hsi_inv dpoe in
1374+
f_hoareF {m;inv=pr} hf.hf_f { hsi_m = m; hsi_inv = POE.mk po poe; }
13811375
| Zhl {f_node = FhoareS hs}, (pr :: po :: dpoe) ->
13821376
let m = fst hs.hs_m in
1383-
let (poe, d) = zpoe (hs_po hs).hsi_inv dpoe in
1377+
let poe = zpoe (hs_po hs).hsi_inv dpoe in
13841378
f_hoareS
13851379
(snd hs.hs_m)
13861380
{ m; inv = pr}
13871381
hs.hs_s
1388-
{ hsi_m = m ; hsi_inv = POE.mk po (poe, d); }
1382+
{ hsi_m = m ; hsi_inv = POE.mk po poe; }
13891383
| Zhl {f_node = FeHoareF hf}, [pr;po] ->
13901384
let m = hf.ehf_m in
13911385
f_eHoareF {m;inv=pr} hf.ehf_f {m;inv=po}
@@ -1510,9 +1504,9 @@ let rec conv ri env f1 f2 stk =
15101504
->
15111505
let pr2 = (ss_inv_rebind (hf_pr hf2) hf1.hf_m).inv in
15121506
let po2 = (hs_inv_rebind (hf_po hf2) hf1.hf_m).hsi_inv in
1513-
let aux { main = post; exnmap = (poe, d); } =
1507+
let aux { main = post; exnmap = poe; } =
15141508
let poe = List.map snd (Mp.bindings poe) in
1515-
match d with None -> post :: poe | Some d -> post :: d :: poe
1509+
post :: poe
15161510
in
15171511
let lf1 = aux (hf_po hf1).hsi_inv in
15181512
let lf2 = aux po2 in
@@ -1524,9 +1518,9 @@ let rec conv ri env f1 f2 stk =
15241518
| _subst ->
15251519
let pr2 = (ss_inv_rebind (hs_pr hs2) (fst hs1.hs_m)).inv in
15261520
let po2 = (hs_inv_rebind (hs_po hs2) (fst hs1.hs_m)).hsi_inv in
1527-
let aux { main = post; exnmap = (poe, d) } =
1521+
let aux { main = post; exnmap = poe } =
15281522
let poe = List.map snd (Mp.bindings poe) in
1529-
match d with None -> post :: poe | Some d -> post :: d :: poe
1523+
post :: poe
15301524
in
15311525
let lf1 = aux (hs_po hs1).hsi_inv in
15321526
let lf2 = aux po2 in

src/ecSubst.ml

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -811,14 +811,13 @@ and subst_module (s : subst) (m : module_expr) =
811811
and subst_hs_inv (s : subst) (inv : hs_inv) =
812812
let s = add_memory s inv.hsi_m inv.hsi_m in
813813
let main = subst_form s inv.hsi_inv.main in
814-
let map =
814+
let exnmap =
815815
Mp.fold (fun p f m ->
816816
let p = subst_path s p in
817817
let f = subst_form s f in
818818
Mp.add p f m
819-
) (fst inv.hsi_inv.exnmap) Mp.empty in
820-
let dfl = omap (subst_form s) (snd inv.hsi_inv.exnmap) in
821-
{ hsi_inv = { main; exnmap = (map, dfl) }; hsi_m = inv.hsi_m }
819+
) inv.hsi_inv.exnmap Mp.empty in
820+
{ hsi_inv = { main; exnmap }; hsi_m = inv.hsi_m }
822821

823822
(* -------------------------------------------------------------------- *)
824823
let subst_modsig ?params (s : subst) (comps : module_sig) =

0 commit comments

Comments
 (0)