1-
2- module SPARSE-BYTES
3- imports BOOL
1+ module SPARSE-BYTES-SYNTAX
42 imports BYTES
53 imports INT
64
@@ -9,11 +7,33 @@ module SPARSE-BYTES
97
108
119 syntax SBItemChunk ::= SBChunk(SBItem)
12-
10+
1311 syntax SparseBytes ::= List{SBItemChunk, ""}
1412
1513 syntax Bytes ::= unwrap(SparseBytes)
1614 [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)]
1737// -----------------------------------------------------------------
1838 rule unwrap(SBChunk(SBI) REST) => unwrap(SBI) +Bytes unwrap(REST)
1939 rule unwrap(.SparseBytes) => .Bytes
@@ -23,24 +43,24 @@ module SPARSE-BYTES
2343// ---------------------------------------------------------
2444 rule fromBytes(Bs) => SBChunk(#bytes(Bs))
2545
26- syntax Bytes ::= unwrap(SBItem)
27- [function, total, symbol(SBItem:unwrap)]
46+ // syntax Bytes ::= unwrap(SBItem)
47+ // [function, total, symbol(SBItem:unwrap)]
2848// -----------------------------------------------
2949 rule unwrap(#bytes(Bs)) => Bs
3050 rule unwrap(#empty(N)) => zeros(N)
3151
32- syntax Bytes ::= zeros(Int) [function, total, symbol(zeros)]
52+ // syntax Bytes ::= zeros(Int) [function, total, symbol(zeros)]
3353// -------------------------------------------------------------------
3454 rule zeros(N) => padLeftBytes(.Bytes, size(#empty(N)), 0)
3555
36- syntax Int ::= size(SparseBytes)
37- [function, total, symbol(SparseBytes:size)]
56+ // syntax Int ::= size(SparseBytes)
57+ // [function, total, symbol(SparseBytes:size)]
3858// ---------------------------------------------------
3959 rule size(SBChunk(SBI) SBS) => size(SBI) +Int size(SBS)
4060 rule size(.SparseBytes) => 0
4161
42- syntax Int ::= size(SBItem)
43- [function, total, symbol(SBItem:size)]
62+ // syntax Int ::= size(SBItem)
63+ // [function, total, symbol(SBItem:size)]
4464// -----------------------------------------------
4565 rule size(#bytes(Bs)) => lengthBytes(Bs)
4666 rule size(#empty(N)) => maxInt(N,0)
@@ -59,7 +79,7 @@ module SPARSE-BYTES
5979 requires 0 <=Int S andBool S <=Int E
6080 andBool size(SBI) <=Int S
6181
62- rule substrSparseBytes(SBChunk(SBI) REST, S, E)
82+ rule substrSparseBytes(SBChunk(SBI) REST, S, E)
6383 => #let SUB = substrSBItem(SBI, S, E)
6484 #in SUB substrSparseBytes(REST, 0, E -Int size(SBI))
6585 requires 0 <=Int S andBool S <=Int E
@@ -78,22 +98,27 @@ module SPARSE-BYTES
7898 rule substrSBItem(#empty(N), S, E) => SBChunk( #empty( minInt(E, N) -Int S) )
7999 requires 0 <=Int S andBool S <=Int E
80100 andBool S <Int N
81-
101+
82102 rule substrSBItem(#bytes(Bs), S, E) => .SparseBytes
83103 requires 0 <=Int S andBool S <=Int E
84104 andBool lengthBytes(Bs) <=Int S
85105
86- rule substrSBItem(#bytes(Bs), S, E)
106+ rule substrSBItem(#bytes(Bs), S, E)
87107 => SBChunk(#bytes( substrBytes(Bs, S, minInt(E, lengthBytes(Bs))) ))
88108 requires 0 <=Int S andBool S <=Int E
89- andBool S <Int lengthBytes(Bs)
109+ andBool S <Int lengthBytes(Bs)
90110
111+ endmodule
112+
113+ module REPLACE-AT-COMMON
114+ imports BOOL
115+ imports SPARSE-BYTES-SYNTAX
91116
92117 syntax SparseBytes ::= replaceAt(SparseBytes, Int, Bytes)
93118 [function, total, symbol(SparseBytes:replaceAt)]
94119// --------------------------------------------------------
95120 // invalid argument
96- rule replaceAt(_, S, _) => .SparseBytes
121+ rule replaceAt(_, S, _) => .SparseBytes
97122 requires S <Int 0
98123
99124 // append
@@ -105,52 +130,47 @@ module SPARSE-BYTES
105130 requires 0 <Int S
106131
107132 // skip
108- rule replaceAt(SBChunk(SBI) REST, S, Bs)
133+ rule replaceAt(SBChunk(SBI) REST, S, Bs)
109134 => SBChunk(SBI) replaceAt(REST, S -Int size(SBI), Bs)
110135 requires size(SBI) <=Int S
111136
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-
117137 syntax SparseBytes ::= replaceAtZ(Int, SparseBytes, Int, Bytes)
118138 [function, total, symbol(SparseBytes:replaceAtZ)]
119139// ---------------------------------------------------------------
120140 ////////////// S < 0
121- rule replaceAtZ(_, _, S, _) => .SparseBytes
141+ rule replaceAtZ(_, _, S, _) => .SparseBytes
122142 requires S <Int 0
123143
124144 ////////////// S > 0
125145 // split zeros: 0 < S < N
126146 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)
128148 requires 0 <Int S
129149 andBool S <Int N
130150
131151 // skip zeros: 0 <= N <= S
132152 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)
134154 requires 0 <Int S
135155 andBool 0 <=Int N
136156 andBool N <=Int S
137157
138158 ////////////// S == 0
139159 ///////// len(Bs) < N
140160 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
142162 requires 0 ==Int S
143163 andBool lengthBytes(Bs) <Int N
144164
145165 ///////// len(Bs) = N
146166 rule replaceAtZ(N, REST, S, Bs)
147- => SBChunk(#bytes(Bs)) REST
167+ => SBChunk(#bytes(Bs)) REST
148168 requires 0 ==Int S
149169 andBool lengthBytes(Bs) ==Int N
150170
151171 ///////// len(Bs) > N
152172 rule replaceAtZ(N, REST, S, Bs)
153- => replaceAt(SBChunk(#bytes(zeros(N))) REST, S, Bs)
173+ => replaceAt(SBChunk(#bytes(zeros(N))) REST, S, Bs)
154174 requires 0 ==Int S
155175 andBool lengthBytes(Bs) >Int N
156176
@@ -172,7 +192,7 @@ module SPARSE-BYTES
172192 Bs
173193 )
174194 requires 0 <=Int S
175- andBool lengthBytes(MB) <Int S +Int lengthBytes(Bs)
195+ andBool lengthBytes(MB) <Int S +Int lengthBytes(Bs)
176196
177197
178198 // join list items until Bs is at least I bytes
@@ -190,5 +210,26 @@ module SPARSE-BYTES
190210 rule joinUntil(Bs, .SparseBytes, I)
191211 => SBChunk(#bytes( padRightBytes(Bs, I, 0) ))
192212 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]
193234
194235endmodule
0 commit comments