@@ -115,7 +115,7 @@ and instr_node =
115115 | Sif of expr * stmt * stmt
116116 | Swhile of expr * stmt
117117 | Smatch of expr * ((EcIdent. t * ty) list * stmt) list
118- | Sassert of expr
118+ | Sraise of EcPath. path * expr list
119119 | Sabstract of EcIdent. t
120120
121121and stmt = {
@@ -234,19 +234,23 @@ and equivS = {
234234 es_sr : stmt ;
235235 es_po : form ; }
236236
237+ and post = (EcPath. path * form) list
238+
237239and sHoareF = {
238240 hf_m : memory ;
239241 hf_pr : form ;
240242 hf_f : EcPath .xpath ;
241243 hf_po : form ;
244+ hf_poe : post
242245}
243246
244247and sHoareS = {
245- hs_m : memenv ;
246- hs_pr : form ;
247- hs_s : stmt ;
248- hs_po : form ; }
249-
248+ hs_m : memenv ;
249+ hs_pr : form ;
250+ hs_s : stmt ;
251+ hs_po : form ;
252+ hs_poe : post
253+ }
250254
251255and eHoareF = {
252256 ehf_m : memory ;
@@ -292,7 +296,7 @@ and pr = {
292296 pr_event : ss_inv ;
293297}
294298
295- let map_ss_inv ?m (fn : form list -> form ) (invs : ss_inv list ): ss_inv =
299+ let map_ss_inv ?m (fn : form list -> form ) (invs : ss_inv list ): ss_inv =
296300 let m' = match m with
297301 | Some m -> m
298302 | None -> (List. hd invs).m in
@@ -318,7 +322,7 @@ let map_ss_inv_destr2 (fn: form -> form * form) (inv: ss_inv): ss_inv * ss_inv =
318322 let inv1, inv2 = fn inv.inv in
319323 let m = inv.m in
320324 (* Everything should be boolean *)
321- assert (inv1.f_ty = inv2.f_ty && inv1.f_ty = inv.inv.f_ty);
325+ assert (inv1.f_ty = inv2.f_ty && inv1.f_ty = inv.inv.f_ty);
322326 {m;inv= inv1}, {m;inv= inv2}
323327
324328let map_ss_inv_destr3 (fn : form -> form * form * form ) (inv : ss_inv ): ss_inv * ss_inv * ss_inv =
@@ -335,11 +339,11 @@ type ts_inv = {
335339}
336340
337341let map_ts_inv ?ml ?mr (fn : form list -> form ) (invs : ts_inv list ): ts_inv =
338- let ml' = match ml with
339- | Some m -> m
342+ let ml' = match ml with
343+ | Some m -> m
340344 | None -> (List. hd invs).ml in
341- let mr' = match mr with
342- | Some m -> m
345+ let mr' = match mr with
346+ | Some m -> m
343347 | None -> (List. hd invs).mr in
344348 let inv = fn (List. map (fun {inv;ml;mr} -> assert (ml = ml' && mr = mr'); inv) invs) in
345349 { ml = ml'; mr = mr'; inv = inv }
@@ -432,7 +436,7 @@ let ts_inv_lower_left2 (fn: ss_inv -> ss_inv -> form) (inv1: ts_inv) inv2 =
432436 assert (inv1.mr = inv2.mr);
433437 let inv' = fn {m= inv1.ml; inv= inv1.inv} {m= inv2.ml; inv= inv2.inv} in
434438 { m = inv1.mr; inv = inv' }
435-
439+
436440let ts_inv_lower_left3 (fn : ss_inv -> ss_inv -> ss_inv -> form )
437441 (inv1 : ts_inv ) (inv2 : ts_inv ) (inv3 : ts_inv ): ss_inv =
438442 assert (inv1.mr = inv2.mr && inv2.mr = inv3.mr);
@@ -512,11 +516,11 @@ let map_inv (fn: form list -> form) (inv: inv list): inv =
512516 assert (List. length inv > 0 );
513517 match List. hd inv with
514518 | Inv_ss ss' ->
515- Inv_ss (map_ss_inv fn (List. map (function
519+ Inv_ss (map_ss_inv fn (List. map (function
516520 Inv_ss ss -> assert (ss.m = ss'.m); ss
517521 | _ -> failwith " expected all invariants to have same kind" ) inv))
518522 | Inv_ts ts' ->
519- Inv_ts (map_ts_inv fn (List. map (function
523+ Inv_ts (map_ts_inv fn (List. map (function
520524 Inv_ts ts -> assert (ts.ml = ts'.ml && ts.mr = ts'.mr); ts
521525 | _ -> failwith " expected all invariants to have same kind" ) inv))
522526
@@ -535,7 +539,7 @@ let map_inv2 (fn: form -> form -> form) (inv1: inv) (inv2: inv): inv =
535539 Inv_ts (map_ts_inv2 fn ts1 ts2)
536540 | _ ->
537541 failwith " incompatible invariants for map_inv2"
538-
542+
539543let map_inv3 (fn : form -> form -> form -> form )
540544 (inv1 : inv ) (inv2 : inv ) (inv3 : inv ): inv =
541545 match inv1, inv2, inv3 with
@@ -559,11 +563,13 @@ let ef_po ef = {ml=ef.ef_ml; mr=ef.ef_mr; inv=ef.ef_po}
559563let es_pr es = {ml= fst es.es_ml; mr= fst es.es_mr; inv= es.es_pr}
560564let es_po es = {ml= fst es.es_ml; mr= fst es.es_mr; inv= es.es_po}
561565
562- let hf_pr hf = {m= hf.hf_m; inv= hf.hf_pr}
563- let hf_po hf = {m= hf.hf_m; inv= hf.hf_po}
566+ let hf_pr hf = {m= hf.hf_m; inv= hf.hf_pr}
567+ let hf_po hf = {m= hf.hf_m; inv= hf.hf_po}
568+ let hf_poe hf = List. map (fun (e ,f ) -> e,{m= hf.hf_m; inv= f}) hf.hf_poe
564569
565570let hs_pr hs = {m= fst hs.hs_m; inv= hs.hs_pr}
566571let hs_po hs = {m= fst hs.hs_m; inv= hs.hs_po}
572+ let hs_poe hs = List. map (fun (e ,f ) -> e,{m= fst hs.hs_m; inv= f}) hs.hs_poe
567573
568574let ehf_pr ehf = {m= ehf.ehf_m; inv= ehf.ehf_pr}
569575let ehf_po ehf = {m= ehf.ehf_m; inv= ehf.ehf_po}
@@ -916,14 +922,26 @@ let b_hash (bs : bindings) =
916922 Why3.Hashcons. combine_list b1_hash 0 bs
917923
918924(* -------------------------------------------------------------------- *)
925+
926+ let post_equal (e1 , f1 ) (e2 ,f2 ) =
927+ EcPath. p_equal e1 e2 &&
928+ f_equal f1 f2
929+
930+ let posts_equal posts1 posts2 =
931+ List. equal post_equal posts1 posts2
932+
933+ (* -------------------------------------------------------------------- *)
934+
919935let hf_equal hf1 hf2 =
920936 f_equal hf1.hf_pr hf2.hf_pr
937+ && posts_equal hf1.hf_poe hf2.hf_poe
921938 && f_equal hf1.hf_po hf2.hf_po
922939 && EcPath. x_equal hf1.hf_f hf2.hf_f
923940 && mem_equal hf1.hf_m hf2.hf_m
924941
925942let hs_equal hs1 hs2 =
926943 f_equal hs1.hs_pr hs2.hs_pr
944+ && posts_equal hs1.hs_poe hs2.hs_poe
927945 && f_equal hs1.hs_po hs2.hs_po
928946 && s_equal hs1.hs_s hs2.hs_s
929947 && me_equal hs1.hs_m hs2.hs_m
@@ -989,14 +1007,28 @@ let pr_equal pr1 pr2 =
9891007 && f_equal pr1.pr_args pr2.pr_args
9901008 && mem_equal pr1.pr_event.m pr2.pr_event.m
9911009
1010+ (* -------------------------------------------------------------------- *)
1011+
1012+ let post_hash (e , f ) =
1013+ Why3.Hashcons. combine
1014+ (EcPath. p_hash e)
1015+ (f_hash f)
1016+
1017+ let posts_hash posts =
1018+ Why3.Hashcons. combine_list post_hash 0 posts
1019+
9921020(* -------------------------------------------------------------------- *)
9931021let hf_hash hf =
9941022 Why3.Hashcons. combine3
995- (f_hash hf.hf_pr) (f_hash hf.hf_po) (EcPath. x_hash hf.hf_f) (mem_hash hf.hf_m)
1023+ (f_hash hf.hf_pr)
1024+ (Why3.Hashcons. combine (f_hash hf.hf_po) (posts_hash hf.hf_poe))
1025+ (EcPath. x_hash hf.hf_f)
1026+ (mem_hash hf.hf_m)
9961027
9971028let hs_hash hs =
9981029 Why3.Hashcons. combine3
999- (f_hash hs.hs_pr) (f_hash hs.hs_po)
1030+ (f_hash hs.hs_pr)
1031+ (Why3.Hashcons. combine (f_hash hs.hs_po) (posts_hash hs.hs_poe))
10001032 (s_hash hs.hs_s)
10011033 (me_hash hs.hs_m)
10021034
@@ -1025,7 +1057,7 @@ let bhs_hash bhs =
10251057 [bhs.bhs_pr;bhs.bhs_po;bhs.bhs_bd]
10261058
10271059let ef_hash ef =
1028- Why3.Hashcons. combine_list f_hash
1060+ Why3.Hashcons. combine_list f_hash
10291061 (Why3.Hashcons. combine3 (EcPath. x_hash ef.ef_fl) (EcPath. x_hash ef.ef_fr)
10301062 (mem_hash ef.ef_ml) (mem_hash ef.ef_mr))
10311063 [ef.ef_pr;ef.ef_po]
@@ -1344,6 +1376,11 @@ module Hsform = Why3.Hashcons.Make (struct
13441376
13451377 let fv_mlr ml mr = Sid. add ml (Sid. singleton mr)
13461378
1379+ let posts_fv init posts =
1380+ List. fold
1381+ (fun acc (_ ,f ) -> fv_union (f_fv f) acc)
1382+ init posts
1383+
13471384 let fv_node f =
13481385 let union ex nodes =
13491386 List. fold_left (fun s a -> fv_union s (ex a)) Mid. empty nodes
@@ -1371,11 +1408,13 @@ module Hsform = Why3.Hashcons.Make (struct
13711408 fv_union (f_fv f1) fv2
13721409
13731410 | FhoareF hf ->
1374- let fv = fv_union (f_fv hf.hf_pr) (f_fv hf.hf_po) in
1411+ let fv = f_fv hf.hf_po in
1412+ let fv = fv_union (f_fv hf.hf_pr) (posts_fv fv hf.hf_poe) in
13751413 EcPath. x_fv (Mid. remove hf.hf_m fv) hf.hf_f
13761414
13771415 | FhoareS hs ->
1378- let fv = fv_union (f_fv hs.hs_pr) (f_fv hs.hs_po) in
1416+ let fv = f_fv hs.hs_po in
1417+ let fv = fv_union (f_fv hs.hs_pr) (posts_fv fv hs.hs_poe) in
13791418 fv_union (s_fv hs.hs_s) (Mid. remove (fst hs.hs_m) fv)
13801419
13811420 | FeHoareF hf ->
@@ -1470,8 +1509,9 @@ module Hinstr = Why3.Hashcons.Make (struct
14701509 in List. all2 forbs bs1 bs2 && s_equal s1 s2
14711510 in e_equal e1 e2 && List. all2 forb b1 b2
14721511
1473- | Sassert e1 , Sassert e2 ->
1474- (e_equal e1 e2)
1512+ | Sraise (e1 , es1 ), Sraise (e2 , es2 ) ->
1513+ (EcPath. p_equal e1 e2)
1514+ && (List. all2 e_equal es1 es2)
14751515
14761516 | Sabstract id1 , Sabstract id2 -> EcIdent. id_equal id1 id2
14771517
@@ -1509,7 +1549,10 @@ module Hinstr = Why3.Hashcons.Make (struct
15091549 in Why3.Hashcons. combine_list forbs (s_hash s) bds
15101550 in Why3.Hashcons. combine_list forb (e_hash e) b
15111551
1512- | Sassert e -> e_hash e
1552+ | Sraise (e , tys ) ->
1553+ Why3.Hashcons. combine_list e_hash
1554+ (EcPath. p_hash e)
1555+ tys
15131556
15141557 | Sabstract id -> EcIdent. id_hash id
15151558
@@ -1543,8 +1586,10 @@ module Hinstr = Why3.Hashcons.Make (struct
15431586 (fun s b -> EcIdent. fv_union s (forb b))
15441587 (e_fv e) b
15451588
1546- | Sassert e ->
1547- e_fv e
1589+ | Sraise (_ , args ) ->
1590+ List. fold_left
1591+ (fun s a -> EcIdent. fv_union s (e_fv a))
1592+ Mid. empty args
15481593
15491594 | Sabstract id ->
15501595 EcIdent. fv_singleton id
0 commit comments