Skip to content

Commit bad3054

Browse files
committed
Experimenting with no CanConsume
1 parent 300c012 commit bad3054

File tree

3 files changed

+18
-25
lines changed

3 files changed

+18
-25
lines changed

src/Actions/Actions.dfy

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,13 @@ module Actions {
2323
&& CanProduce(consumed, produced)
2424
decreases height, 0
2525

26-
ghost predicate CanConsume(consumed: seq<T>, produced: seq<R>, next: T)
27-
requires CanProduce(consumed, produced)
26+
ghost predicate CanProduce(ins: seq<T>, outs: seq<R>)
2827
decreases height
2928

30-
ghost predicate CanProduce(consumed: seq<T>, produced: seq<R>)
29+
ghost predicate CanConsume(ins: seq<T>, outs: seq<R>, nextIn: T)
3130
decreases height
31+
ensures CanConsume(ins, outs, nextIn)
32+
<==> exists nextOut :: CanProduce(ins + [nextIn], outs + [nextOut])
3233

3334
ghost method Update(t: T, r: R)
3435
modifies `consumed, `produced
@@ -41,7 +42,7 @@ module Actions {
4142

4243
method Invoke(t: T) returns (r: R)
4344
requires Valid()
44-
requires CanConsume(consumed, produced, t)
45+
requires exists r :: CanProduce(consumed + [t], produced + [r])
4546
modifies Repr
4647
decreases height
4748
ensures Valid()

src/Actions/Enumerators.dfy

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,14 @@ module Enumerators {
9292
e.CanProduce(consumed, produced) ==> exists n: nat | n <= limit :: Terminated(produced, None, n)
9393
}
9494

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])
9799
}
98100

99101
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)
101103
&& exists limit :: EnumerationBoundedBy(a, limit)
102104
}
103105

@@ -207,11 +209,6 @@ module Enumerators {
207209
Repr := {this};
208210
}
209211

210-
ghost predicate CanConsume(consumed: seq<()>, produced: seq<Option<T>>, next: ())
211-
decreases height
212-
{
213-
true
214-
}
215212
ghost predicate CanProduce(consumed: seq<()>, produced: seq<Option<T>>)
216213
decreases height
217214
{
@@ -223,7 +220,7 @@ module Enumerators {
223220

224221
method Invoke(t: ()) returns (r: Option<T>)
225222
requires Valid()
226-
requires CanConsume(consumed, produced, t)
223+
requires exists r :: CanProduce(consumed + [t], produced + [r])
227224
modifies Repr
228225
decreases height
229226
ensures Valid()
@@ -285,11 +282,6 @@ module Enumerators {
285282
Repr := {this};
286283
}
287284

288-
ghost predicate CanConsume(consumed: seq<()>, produced: seq<T>, next: ())
289-
decreases height
290-
{
291-
|consumed| + 1 <= |elements|
292-
}
293285
ghost predicate CanProduce(consumed: seq<()>, produced: seq<T>)
294286
decreases height
295287
{
@@ -298,7 +290,7 @@ module Enumerators {
298290

299291
method Invoke(t: ()) returns (r: T)
300292
requires Valid()
301-
requires CanConsume(consumed, produced, t)
293+
requires exists r :: CanProduce(consumed + [t], produced + [r])
302294
modifies Repr
303295
decreases height
304296
ensures Valid()
@@ -325,6 +317,11 @@ module Enumerators {
325317
decreases EnumerationTerminationMetric(e2)
326318
{
327319
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]);
328325
var next: Option<int> := e2.Invoke(());
329326
if next.None? { break; }
330327
EnumerationTerminationMetricDecreased@beforeLoop(e2, next);

src/Actions/MappingEnumerator.dfy

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,6 @@ module Mapped {
5353
assert ValidWrappedProduced(consumed, produced, wrapped.produced);
5454
}
5555

56-
ghost predicate CanConsume(consumed: seq<()>, produced: seq<Option<R>>, next: ())
57-
decreases height
58-
{
59-
true
60-
}
6156
ghost predicate CanProduce(consumed: seq<()>, produced: seq<Option<R>>)
6257
decreases height
6358
{
@@ -71,7 +66,7 @@ module Mapped {
7166

7267
method Invoke(t: ()) returns (r: Option<R>)
7368
requires Valid()
74-
requires CanConsume(consumed, produced, t)
69+
requires exists r :: CanProduce(consumed + [t], produced + [r])
7570
modifies Repr
7671
decreases height
7772
ensures Valid()

0 commit comments

Comments
 (0)