-
Notifications
You must be signed in to change notification settings - Fork 45
/
outline.ec
130 lines (110 loc) · 1.79 KB
/
outline.ec
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
require import AllCore.
op dint : int distr.
module M = {
var x : int
proc f1() : unit = {
M.x <- 0;
}
proc f2(a: int) : unit = {
M.x <- a;
}
proc f3(a: int, b: int) : int = {
return a + b;
}
proc f4(a: int, b: int) : int = {
var t;
if (a <= b) {
t <- b;
} else {
t <- a;
}
return t;
}
proc f5(d: int distr) : int = {
var v;
v <$ d;
return v;
}
}.
module N = {
proc g1() : unit = {
M.f1();
}
proc g2(a) : unit = {
M.f2(a);
}
proc g3(a, b) : unit = {
var r;
r <@ M.f3(a, b);
}
proc g4(a: int, b: int) : unit = {
var m;
if (a <= b) {
m <- b;
} else {
m <- a;
}
M.x <- m;
}
proc g5() : unit = {
var x;
x <$ dint;
}
proc g6() : unit = {
var a, b, m;
a <$ dint;
b <$ dint;
if (a <= b) {
m <- b;
} else {
m <- a;
}
M.x <- m;
}
}.
equiv outline_no_args_no_ret: N.g1 ~ N.g1: true ==> true.
proc.
inline {1} 1.
outline {1} [1] <@ M.f1.
by sim.
qed.
equiv outline_no_ret: N.g2 ~ N.g2: true ==> true.
proc.
inline {1} 1.
outline {1} [2] <@ M.f2.
by inline*; auto.
qed.
equiv outline_no_body: N.g3 ~ N.g3: true ==> true.
proc.
inline {1} 1.
outline {1} [3] <@ M.f3.
by inline*; auto.
qed.
equiv outline_slice: N.g4 ~ N.g4: true ==> true.
proc.
outline {1} [1-2] <@ M.f4.
by inline*; auto.
qed.
equiv outline_explicit_ret: N.g5 ~ N.g5: true ==> true.
proc.
outline {1} [1] x <@ M.f5.
by inline*; auto.
qed.
equiv outline_multi: N.g6 ~ N.g6: true ==> true.
proof.
proc.
outline {1} [3-4] <@ N.g4.
outline {1} [2] b <@ M.f5.
outline {1} [1] a <@ M.f5.
by inline*; auto.
qed.
equiv outline_stmt: N.g6 ~ N.g6: true ==> true.
proof.
proc.
outline {1} [1-4] {
a <@ M.f5(dint);
b <@ M.f5(dint);
N.g4(a,b);
}.
by inline*; auto.
qed.