@@ -92,12 +92,14 @@ module Enumerators {
92
92
e. CanProduce (consumed, produced) ==> exists n: nat | n <= limit :: Terminated (produced, None, n)
93
93
}
94
94
95
- ghost predicate ConsumesAnything< T (!new)> (a: Action< (), Option< T>> ) {
96
- forall consumed, produced, next | a. CanProduce (consumed, produced) :: a. CanConsume (consumed, produced, next)
95
+ ghost predicate ConsumesAnything< T (!new), R (!new)> (a: Action< T, R> , ins: seq < T> , outs: seq < R> , nextIn: T)
96
+ requires a. CanProduce (ins, outs)
97
+ {
98
+ exists nextOut :: a. CanProduce (ins + [nextIn], outs + [nextOut])
97
99
}
98
100
99
101
ghost predicate IsEnumerator< T (!new)> (a: Action< (), Option< T>> ) {
100
- && ConsumesAnything (a)
102
+ && forall ins, outs, nextIn | a . CanProduce (ins, outs) :: ConsumesAnything (a, ins, outs, nextIn )
101
103
&& exists limit :: EnumerationBoundedBy (a, limit)
102
104
}
103
105
@@ -207,11 +209,6 @@ module Enumerators {
207
209
Repr := {this };
208
210
}
209
211
210
- ghost predicate CanConsume (consumed: seq <()> , produced: seq < Option< T>> , next: ())
211
- decreases height
212
- {
213
- true
214
- }
215
212
ghost predicate CanProduce (consumed: seq <()> , produced: seq < Option< T>> )
216
213
decreases height
217
214
{
@@ -223,7 +220,7 @@ module Enumerators {
223
220
224
221
method Invoke (t: ()) returns (r: Option< T> )
225
222
requires Valid ()
226
- requires CanConsume (consumed, produced, t )
223
+ requires exists r :: CanProduce (consumed + [t] , produced + [r] )
227
224
modifies Repr
228
225
decreases height
229
226
ensures Valid ()
@@ -285,11 +282,6 @@ module Enumerators {
285
282
Repr := {this };
286
283
}
287
284
288
- ghost predicate CanConsume (consumed: seq <()> , produced: seq < T> , next: ())
289
- decreases height
290
- {
291
- |consumed| + 1 <= |elements|
292
- }
293
285
ghost predicate CanProduce (consumed: seq <()> , produced: seq < T> )
294
286
decreases height
295
287
{
@@ -298,7 +290,7 @@ module Enumerators {
298
290
299
291
method Invoke (t: ()) returns (r: T)
300
292
requires Valid ()
301
- requires CanConsume (consumed, produced, t )
293
+ requires exists r :: CanProduce (consumed + [t] , produced + [r] )
302
294
modifies Repr
303
295
decreases height
304
296
ensures Valid ()
@@ -325,6 +317,11 @@ module Enumerators {
325
317
decreases EnumerationTerminationMetric (e2)
326
318
{
327
319
label beforeLoop:
320
+
321
+ assert IsEnumerator (e2);
322
+ assert e2. CanProduce (e2.consumed, e2.produced);
323
+ assert ConsumesAnything (e2, e2.consumed, e2.produced, ());
324
+ assert exists r :: e2. CanProduce (e2.consumed + [()], e2. produced + [r]);
328
325
var next: Option< int > := e2. Invoke (());
329
326
if next. None? { break ; }
330
327
EnumerationTerminationMetricDecreased@beforeLoop (e2, next);
0 commit comments