@@ -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);
@@ -527,11 +531,11 @@ let map_inv (fn: form list -> form) (inv: inv list): inv =
527531 assert (List. length inv > 0 );
528532 match List. hd inv with
529533 | Inv_ss ss' ->
530- Inv_ss (map_ss_inv fn (List. map (function
534+ Inv_ss (map_ss_inv fn (List. map (function
531535 Inv_ss ss -> assert (ss.m = ss'.m); ss
532536 | _ -> failwith " expected all invariants to have same kind" ) inv))
533537 | Inv_ts ts' ->
534- Inv_ts (map_ts_inv fn (List. map (function
538+ Inv_ts (map_ts_inv fn (List. map (function
535539 Inv_ts ts -> assert (ts.ml = ts'.ml && ts.mr = ts'.mr); ts
536540 | _ -> failwith " expected all invariants to have same kind" ) inv))
537541
@@ -550,7 +554,7 @@ let map_inv2 (fn: form -> form -> form) (inv1: inv) (inv2: inv): inv =
550554 Inv_ts (map_ts_inv2 fn ts1 ts2)
551555 | _ ->
552556 failwith " incompatible invariants for map_inv2"
553-
557+
554558let map_inv3 (fn : form -> form -> form -> form )
555559 (inv1 : inv ) (inv2 : inv ) (inv3 : inv ): inv =
556560 match inv1, inv2, inv3 with
@@ -574,11 +578,13 @@ let ef_po ef = {ml=ef.ef_ml; mr=ef.ef_mr; inv=ef.ef_po}
574578let es_pr es = {ml= fst es.es_ml; mr= fst es.es_mr; inv= es.es_pr}
575579let es_po es = {ml= fst es.es_ml; mr= fst es.es_mr; inv= es.es_po}
576580
577- let hf_pr hf = {m= hf.hf_m; inv= hf.hf_pr}
578- let hf_po hf = {m= hf.hf_m; inv= hf.hf_po}
581+ let hf_pr hf = {m= hf.hf_m; inv= hf.hf_pr}
582+ let hf_po hf = {m= hf.hf_m; inv= hf.hf_po}
583+ let hf_poe hf = List. map (fun (e ,f ) -> e,{m= hf.hf_m; inv= f}) hf.hf_poe
579584
580585let hs_pr hs = {m= fst hs.hs_m; inv= hs.hs_pr}
581586let hs_po hs = {m= fst hs.hs_m; inv= hs.hs_po}
587+ let hs_poe hs = List. map (fun (e ,f ) -> e,{m= fst hs.hs_m; inv= f}) hs.hs_poe
582588
583589let ehf_pr ehf = {m= ehf.ehf_m; inv= ehf.ehf_pr}
584590let ehf_po ehf = {m= ehf.ehf_m; inv= ehf.ehf_po}
@@ -931,14 +937,26 @@ let b_hash (bs : bindings) =
931937 Why3.Hashcons. combine_list b1_hash 0 bs
932938
933939(* -------------------------------------------------------------------- *)
940+
941+ let post_equal (e1 , f1 ) (e2 ,f2 ) =
942+ EcPath. p_equal e1 e2 &&
943+ f_equal f1 f2
944+
945+ let posts_equal posts1 posts2 =
946+ List. equal post_equal posts1 posts2
947+
948+ (* -------------------------------------------------------------------- *)
949+
934950let hf_equal hf1 hf2 =
935951 f_equal hf1.hf_pr hf2.hf_pr
952+ && posts_equal hf1.hf_poe hf2.hf_poe
936953 && f_equal hf1.hf_po hf2.hf_po
937954 && EcPath. x_equal hf1.hf_f hf2.hf_f
938955 && mem_equal hf1.hf_m hf2.hf_m
939956
940957let hs_equal hs1 hs2 =
941958 f_equal hs1.hs_pr hs2.hs_pr
959+ && posts_equal hs1.hs_poe hs2.hs_poe
942960 && f_equal hs1.hs_po hs2.hs_po
943961 && s_equal hs1.hs_s hs2.hs_s
944962 && me_equal hs1.hs_m hs2.hs_m
@@ -1004,14 +1022,28 @@ let pr_equal pr1 pr2 =
10041022 && f_equal pr1.pr_args pr2.pr_args
10051023 && mem_equal pr1.pr_event.m pr2.pr_event.m
10061024
1025+ (* -------------------------------------------------------------------- *)
1026+
1027+ let post_hash (e , f ) =
1028+ Why3.Hashcons. combine
1029+ (EcPath. p_hash e)
1030+ (f_hash f)
1031+
1032+ let posts_hash posts =
1033+ Why3.Hashcons. combine_list post_hash 0 posts
1034+
10071035(* -------------------------------------------------------------------- *)
10081036let hf_hash hf =
10091037 Why3.Hashcons. combine3
1010- (f_hash hf.hf_pr) (f_hash hf.hf_po) (EcPath. x_hash hf.hf_f) (mem_hash hf.hf_m)
1038+ (f_hash hf.hf_pr)
1039+ (Why3.Hashcons. combine (f_hash hf.hf_po) (posts_hash hf.hf_poe))
1040+ (EcPath. x_hash hf.hf_f)
1041+ (mem_hash hf.hf_m)
10111042
10121043let hs_hash hs =
10131044 Why3.Hashcons. combine3
1014- (f_hash hs.hs_pr) (f_hash hs.hs_po)
1045+ (f_hash hs.hs_pr)
1046+ (Why3.Hashcons. combine (f_hash hs.hs_po) (posts_hash hs.hs_poe))
10151047 (s_hash hs.hs_s)
10161048 (me_hash hs.hs_m)
10171049
@@ -1040,7 +1072,7 @@ let bhs_hash bhs =
10401072 [bhs.bhs_pr;bhs.bhs_po;bhs.bhs_bd]
10411073
10421074let ef_hash ef =
1043- Why3.Hashcons. combine_list f_hash
1075+ Why3.Hashcons. combine_list f_hash
10441076 (Why3.Hashcons. combine3 (EcPath. x_hash ef.ef_fl) (EcPath. x_hash ef.ef_fr)
10451077 (mem_hash ef.ef_ml) (mem_hash ef.ef_mr))
10461078 [ef.ef_pr;ef.ef_po]
@@ -1359,6 +1391,11 @@ module Hsform = Why3.Hashcons.Make (struct
13591391
13601392 let fv_mlr ml mr = Sid. add ml (Sid. singleton mr)
13611393
1394+ let posts_fv init posts =
1395+ List. fold
1396+ (fun acc (_ ,f ) -> fv_union (f_fv f) acc)
1397+ init posts
1398+
13621399 let fv_node f =
13631400 let union ex nodes =
13641401 List. fold_left (fun s a -> fv_union s (ex a)) Mid. empty nodes
@@ -1386,11 +1423,13 @@ module Hsform = Why3.Hashcons.Make (struct
13861423 fv_union (f_fv f1) fv2
13871424
13881425 | FhoareF hf ->
1389- let fv = fv_union (f_fv hf.hf_pr) (f_fv hf.hf_po) in
1426+ let fv = f_fv hf.hf_po in
1427+ let fv = fv_union (f_fv hf.hf_pr) (posts_fv fv hf.hf_poe) in
13901428 EcPath. x_fv (Mid. remove hf.hf_m fv) hf.hf_f
13911429
13921430 | FhoareS hs ->
1393- let fv = fv_union (f_fv hs.hs_pr) (f_fv hs.hs_po) in
1431+ let fv = f_fv hs.hs_po in
1432+ let fv = fv_union (f_fv hs.hs_pr) (posts_fv fv hs.hs_poe) in
13941433 fv_union (s_fv hs.hs_s) (Mid. remove (fst hs.hs_m) fv)
13951434
13961435 | FeHoareF hf ->
@@ -1485,8 +1524,9 @@ module Hinstr = Why3.Hashcons.Make (struct
14851524 in List. all2 forbs bs1 bs2 && s_equal s1 s2
14861525 in e_equal e1 e2 && List. all2 forb b1 b2
14871526
1488- | Sassert e1 , Sassert e2 ->
1489- (e_equal e1 e2)
1527+ | Sraise (e1 , es1 ), Sraise (e2 , es2 ) ->
1528+ (EcPath. p_equal e1 e2)
1529+ && (List. all2 e_equal es1 es2)
14901530
14911531 | Sabstract id1 , Sabstract id2 -> EcIdent. id_equal id1 id2
14921532
@@ -1524,7 +1564,10 @@ module Hinstr = Why3.Hashcons.Make (struct
15241564 in Why3.Hashcons. combine_list forbs (s_hash s) bds
15251565 in Why3.Hashcons. combine_list forb (e_hash e) b
15261566
1527- | Sassert e -> e_hash e
1567+ | Sraise (e , tys ) ->
1568+ Why3.Hashcons. combine_list e_hash
1569+ (EcPath. p_hash e)
1570+ tys
15281571
15291572 | Sabstract id -> EcIdent. id_hash id
15301573
@@ -1558,8 +1601,10 @@ module Hinstr = Why3.Hashcons.Make (struct
15581601 (fun s b -> EcIdent. fv_union s (forb b))
15591602 (e_fv e) b
15601603
1561- | Sassert e ->
1562- e_fv e
1604+ | Sraise (_ , args ) ->
1605+ List. fold_left
1606+ (fun s a -> EcIdent. fv_union s (e_fv a))
1607+ Mid. empty args
15631608
15641609 | Sabstract id ->
15651610 EcIdent. fv_singleton id
0 commit comments