Skip to content

Commit 1185838

Browse files
committed
Add exception declaration, raise, and update logic
1 parent c063e99 commit 1185838

Some content is hidden

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

59 files changed

+1524
-559
lines changed

examples/exception.ec

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
require import AllCore.
2+
3+
exception assume.
4+
exception assert.
5+
6+
module M' ={
7+
proc truc (x:int) : int = {
8+
if (x = 3) {
9+
raise assume;
10+
}
11+
if (x=3) {
12+
raise assert;
13+
}
14+
return x;
15+
}
16+
}.
17+
18+
op p7: bool.
19+
op p1: bool.
20+
op p2: bool.
21+
op p3: bool.
22+
23+
lemma assume_assert :
24+
hoare [M'.truc : p7 ==> p3 | assume:p1 |assert: p2 ].
25+
proof.
26+
admitted.
27+
28+
op p8: bool.
29+
op q1: bool.
30+
op q2: bool.
31+
op q3: bool.
32+
33+
lemma assert_assume :
34+
hoare [M'.truc : p8 ==> q3 | assume:q1 |assert: q2 ].
35+
proof.
36+
admitted.
37+
38+
op p4: bool.
39+
op p5: bool.
40+
op p6: bool.
41+
op p9: bool.
42+
lemma assert_assume' :
43+
hoare [M'.truc : p9 ==> p4 | assume:p6 |assert: p5 ].
44+
proof.
45+
conseq (assume_assert) (assert_assume).
46+
+ admit.
47+
+ admit.
48+
+ admit.
49+
+ admit.
50+
qed.
51+
52+
exception e1.
53+
exception e2.
54+
exception e3.
55+
56+
module M ={
57+
proc f1 (x:int) : int = {
58+
if (x = 3) {
59+
raise e1;
60+
} else {
61+
x <- 5;
62+
}
63+
return x;
64+
}
65+
66+
proc f2 (x:int) : int = {
67+
if (x = 3) {
68+
x <- x;
69+
x <@ f1(x);
70+
} else {
71+
x <@ f1(x);
72+
}
73+
return x;
74+
}
75+
}.
76+
77+
78+
(* Multiple time post for the same exception *)
79+
80+
lemma l_f1 (_x: int):
81+
hoare [M.f1 : _x = x ==> (4 < res) | e1:_x = 3 | e2:false ].
82+
proof.
83+
proc.
84+
conseq (: _ ==> x = 5 | e1: p1 | e2: p2 ).
85+
+ auto.
86+
+ auto. admit.
87+
+ admit.
88+
+ admit.
89+
qed.
90+
91+
lemma l_f2 (_x: int):
92+
hoare [M.f2 : p9 ==> p4 | e1: p2 | e2:p1 | e3: p6 ].
93+
proof.
94+
proc.
95+
if.
96+
+ call (: p5 ==> p3 | e1 : p9 | e2: p7).
97+
proc.
98+
wp.
99+
admit.
100+
+ admit.
101+
+ call (l_f1 _x);auto. admit.
102+
qed.

src/ecAst.ml

Lines changed: 73 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -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

121121
and stmt = {
@@ -234,19 +234,23 @@ and equivS = {
234234
es_sr : stmt;
235235
es_po : form; }
236236

237+
and post = (EcPath.path * form) list
238+
237239
and sHoareF = {
238240
hf_m : memory;
239241
hf_pr : form;
240242
hf_f : EcPath.xpath;
241243
hf_po : form;
244+
hf_poe : post
242245
}
243246

244247
and 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

251255
and 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

324328
let 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

337341
let 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+
436440
let 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+
554558
let 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}
574578
let es_pr es = {ml=fst es.es_ml; mr=fst es.es_mr; inv=es.es_pr}
575579
let 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

580585
let hs_pr hs = {m=fst hs.hs_m; inv=hs.hs_pr}
581586
let 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

583589
let ehf_pr ehf = {m=ehf.ehf_m; inv=ehf.ehf_pr}
584590
let 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+
934950
let 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

940957
let 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
(* -------------------------------------------------------------------- *)
10081036
let 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

10121043
let 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

10421074
let 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

Comments
 (0)