1
-
2
- module SPARSE-BYTES
3
- imports BOOL
1
+ module SPARSE-BYTES-SYNTAX
4
2
imports BYTES
5
3
imports INT
6
4
@@ -9,11 +7,33 @@ module SPARSE-BYTES
9
7
10
8
11
9
syntax SBItemChunk ::= SBChunk(SBItem)
12
-
10
+
13
11
syntax SparseBytes ::= List{SBItemChunk, ""}
14
12
15
13
syntax Bytes ::= unwrap(SparseBytes)
16
14
[function, total, symbol(SparseBytes:unwrap)]
15
+
16
+ syntax Bytes ::= unwrap(SBItem)
17
+ [function, total, symbol(SBItem:unwrap)]
18
+
19
+ syntax Int ::= size(SparseBytes)
20
+ [function, total, symbol(SparseBytes:size)]
21
+
22
+ syntax Int ::= size(SBItem)
23
+ [function, total, symbol(SBItem:size)]
24
+
25
+ syntax Bytes ::= zeros(Int) [function, total, symbol(zeros)]
26
+ endmodule
27
+
28
+ module SPARSE-BYTES
29
+ imports BOOL
30
+ imports SPARSE-BYTES-SYNTAX
31
+ imports REPLACE-AT-COMMON
32
+ imports REPLACE-AT-CONCRETE
33
+ imports REPLACE-AT-SYMBOLIC
34
+
35
+ // syntax Bytes ::= unwrap(SparseBytes)
36
+ // [function, total, symbol(SparseBytes:unwrap)]
17
37
// -----------------------------------------------------------------
18
38
rule unwrap(SBChunk(SBI) REST) => unwrap(SBI) +Bytes unwrap(REST)
19
39
rule unwrap(.SparseBytes) => .Bytes
@@ -23,24 +43,24 @@ module SPARSE-BYTES
23
43
// ---------------------------------------------------------
24
44
rule fromBytes(Bs) => SBChunk(#bytes(Bs))
25
45
26
- syntax Bytes ::= unwrap(SBItem)
27
- [function, total, symbol(SBItem:unwrap)]
46
+ // syntax Bytes ::= unwrap(SBItem)
47
+ // [function, total, symbol(SBItem:unwrap)]
28
48
// -----------------------------------------------
29
49
rule unwrap(#bytes(Bs)) => Bs
30
50
rule unwrap(#empty(N)) => zeros(N)
31
51
32
- syntax Bytes ::= zeros(Int) [function, total, symbol(zeros)]
52
+ // syntax Bytes ::= zeros(Int) [function, total, symbol(zeros)]
33
53
// -------------------------------------------------------------------
34
54
rule zeros(N) => padLeftBytes(.Bytes, size(#empty(N)), 0)
35
55
36
- syntax Int ::= size(SparseBytes)
37
- [function, total, symbol(SparseBytes:size)]
56
+ // syntax Int ::= size(SparseBytes)
57
+ // [function, total, symbol(SparseBytes:size)]
38
58
// ---------------------------------------------------
39
59
rule size(SBChunk(SBI) SBS) => size(SBI) +Int size(SBS)
40
60
rule size(.SparseBytes) => 0
41
61
42
- syntax Int ::= size(SBItem)
43
- [function, total, symbol(SBItem:size)]
62
+ // syntax Int ::= size(SBItem)
63
+ // [function, total, symbol(SBItem:size)]
44
64
// -----------------------------------------------
45
65
rule size(#bytes(Bs)) => lengthBytes(Bs)
46
66
rule size(#empty(N)) => maxInt(N,0)
@@ -59,7 +79,7 @@ module SPARSE-BYTES
59
79
requires 0 <=Int S andBool S <=Int E
60
80
andBool size(SBI) <=Int S
61
81
62
- rule substrSparseBytes(SBChunk(SBI) REST, S, E)
82
+ rule substrSparseBytes(SBChunk(SBI) REST, S, E)
63
83
=> #let SUB = substrSBItem(SBI, S, E)
64
84
#in SUB substrSparseBytes(REST, 0, E -Int size(SBI))
65
85
requires 0 <=Int S andBool S <=Int E
@@ -78,22 +98,27 @@ module SPARSE-BYTES
78
98
rule substrSBItem(#empty(N), S, E) => SBChunk( #empty( minInt(E, N) -Int S) )
79
99
requires 0 <=Int S andBool S <=Int E
80
100
andBool S <Int N
81
-
101
+
82
102
rule substrSBItem(#bytes(Bs), S, E) => .SparseBytes
83
103
requires 0 <=Int S andBool S <=Int E
84
104
andBool lengthBytes(Bs) <=Int S
85
105
86
- rule substrSBItem(#bytes(Bs), S, E)
106
+ rule substrSBItem(#bytes(Bs), S, E)
87
107
=> SBChunk(#bytes( substrBytes(Bs, S, minInt(E, lengthBytes(Bs))) ))
88
108
requires 0 <=Int S andBool S <=Int E
89
- andBool S <Int lengthBytes(Bs)
109
+ andBool S <Int lengthBytes(Bs)
90
110
111
+ endmodule
112
+
113
+ module REPLACE-AT-COMMON
114
+ imports BOOL
115
+ imports SPARSE-BYTES-SYNTAX
91
116
92
117
syntax SparseBytes ::= replaceAt(SparseBytes, Int, Bytes)
93
118
[function, total, symbol(SparseBytes:replaceAt)]
94
119
// --------------------------------------------------------
95
120
// invalid argument
96
- rule replaceAt(_, S, _) => .SparseBytes
121
+ rule replaceAt(_, S, _) => .SparseBytes
97
122
requires S <Int 0
98
123
99
124
// append
@@ -105,52 +130,47 @@ module SPARSE-BYTES
105
130
requires 0 <Int S
106
131
107
132
// skip
108
- rule replaceAt(SBChunk(SBI) REST, S, Bs)
133
+ rule replaceAt(SBChunk(SBI) REST, S, Bs)
109
134
=> SBChunk(SBI) replaceAt(REST, S -Int size(SBI), Bs)
110
135
requires size(SBI) <=Int S
111
136
112
- rule replaceAt(SBChunk(#empty(N)) REST, S, Bs) => replaceAtZ(N, REST, S, Bs)
113
- requires S <Int N
114
- rule replaceAt(SBChunk(#bytes(B)) REST, S, Bs) => replaceAtB(B, REST, S, Bs)
115
- requires S <Int lengthBytes(B)
116
-
117
137
syntax SparseBytes ::= replaceAtZ(Int, SparseBytes, Int, Bytes)
118
138
[function, total, symbol(SparseBytes:replaceAtZ)]
119
139
// ---------------------------------------------------------------
120
140
////////////// S < 0
121
- rule replaceAtZ(_, _, S, _) => .SparseBytes
141
+ rule replaceAtZ(_, _, S, _) => .SparseBytes
122
142
requires S <Int 0
123
143
124
144
////////////// S > 0
125
145
// split zeros: 0 < S < N
126
146
rule replaceAtZ(N, REST, S, Bs)
127
- => SBChunk(#empty(S)) replaceAtZ(N -Int S, REST, 0, Bs)
147
+ => SBChunk(#empty(S)) replaceAtZ(N -Int S, REST, 0, Bs)
128
148
requires 0 <Int S
129
149
andBool S <Int N
130
150
131
151
// skip zeros: 0 <= N <= S
132
152
rule replaceAtZ(N, REST, S, Bs)
133
- => SBChunk(#empty(N)) replaceAt(REST, S -Int N, Bs)
153
+ => SBChunk(#empty(N)) replaceAt(REST, S -Int N, Bs)
134
154
requires 0 <Int S
135
155
andBool 0 <=Int N
136
156
andBool N <=Int S
137
157
138
158
////////////// S == 0
139
159
///////// len(Bs) < N
140
160
rule replaceAtZ(N, REST, S, Bs)
141
- => SBChunk(#bytes(Bs)) SBChunk(#empty(N -Int lengthBytes(Bs))) REST
161
+ => SBChunk(#bytes(Bs)) SBChunk(#empty(N -Int lengthBytes(Bs))) REST
142
162
requires 0 ==Int S
143
163
andBool lengthBytes(Bs) <Int N
144
164
145
165
///////// len(Bs) = N
146
166
rule replaceAtZ(N, REST, S, Bs)
147
- => SBChunk(#bytes(Bs)) REST
167
+ => SBChunk(#bytes(Bs)) REST
148
168
requires 0 ==Int S
149
169
andBool lengthBytes(Bs) ==Int N
150
170
151
171
///////// len(Bs) > N
152
172
rule replaceAtZ(N, REST, S, Bs)
153
- => replaceAt(SBChunk(#bytes(zeros(N))) REST, S, Bs)
173
+ => replaceAt(SBChunk(#bytes(zeros(N))) REST, S, Bs)
154
174
requires 0 ==Int S
155
175
andBool lengthBytes(Bs) >Int N
156
176
@@ -172,7 +192,7 @@ module SPARSE-BYTES
172
192
Bs
173
193
)
174
194
requires 0 <=Int S
175
- andBool lengthBytes(MB) <Int S +Int lengthBytes(Bs)
195
+ andBool lengthBytes(MB) <Int S +Int lengthBytes(Bs)
176
196
177
197
178
198
// join list items until Bs is at least I bytes
@@ -190,5 +210,26 @@ module SPARSE-BYTES
190
210
rule joinUntil(Bs, .SparseBytes, I)
191
211
=> SBChunk(#bytes( padRightBytes(Bs, I, 0) ))
192
212
requires I >Int lengthBytes(Bs)
213
+ endmodule
214
+
215
+ module REPLACE-AT-CONCRETE [concrete]
216
+ imports REPLACE-AT-COMMON
217
+
218
+ rule replaceAt(SBChunk(#empty(N)) REST, S, Bs) => replaceAtZ(N, REST, S, Bs)
219
+ requires S <Int N
220
+ rule replaceAt(SBChunk(#bytes(B)) REST, S, Bs) => replaceAtB(B, REST, S, Bs)
221
+ requires S <Int lengthBytes(B)
222
+
223
+ endmodule
224
+
225
+ module REPLACE-AT-SYMBOLIC [symbolic]
226
+ imports REPLACE-AT-COMMON
227
+
228
+ rule replaceAt(SBChunk(#empty(N)) REST, S, Bs) => replaceAtZ(N, REST, S, Bs)
229
+ requires S <Int N
230
+ [simplification, concrete]
231
+ rule replaceAt(SBChunk(#bytes(B)) REST, S, Bs) => replaceAtB(B, REST, S, Bs)
232
+ requires S <Int lengthBytes(B)
233
+ [simplification, concrete]
193
234
194
235
endmodule
0 commit comments