@@ -186,13 +186,13 @@ var {:layer 0, 1} replica_store: [ReplicaId]StampedValue;
186186//////////////////////////////////////////////////////////////////////////
187187// Yield invariants
188188
189- yield invariant {:layer 1 } Monotonic(cond: bool, ts: TimeStamp, rid: ReplicaId);
189+ yield invariant {:layer 1 } Monotonic# 1 (cond: bool, ts: TimeStamp, rid: ReplicaId);
190190invariant cond ==> le(ts, replica_store[rid]-> ts);
191191
192192yield invariant {:layer 1 } MonotonicAll(old_replica_store: [ReplicaId]StampedValue);
193193invariant (forall rid: ReplicaId:: IsReplica(rid) ==> le(old_replica_store[rid]-> ts, replica_store[rid]-> ts));
194194
195- yield invariant {:layer 1 } MonotonicInduction(q: ReplicaSet, ts: TimeStamp, i: int);
195+ yield invariant {:layer 1 } MonotonicInduction# 1 (q: ReplicaSet, ts: TimeStamp, i: int);
196196invariant (forall rid: ReplicaId:: q[rid] && i <= rid && rid < numReplicas ==> le(ts, replica_store[rid]-> ts));
197197
198198yield invariant {:layer 1 } ReplicaInv();
@@ -205,15 +205,15 @@ yield invariant {:layer 1} LastWriteInv({:linear} one_pid: One ProcessId, pid_la
205205invariant lt(TimeStamp(last_write[one_pid-> val], one_pid-> val), pid_last_ts);
206206invariant (forall ts: TimeStamp:: Map_Contains(value_store, ts) && ts-> pid == one_pid-> val ==> le(ts, pid_last_ts));
207207
208- yield invariant {:layer 1 } ValueStoreInv(ts: TimeStamp, value: Value);
208+ yield invariant {:layer 1 } ValueStoreInv# 1 (ts: TimeStamp, value: Value);
209209invariant Map_Contains(value_store, ts) && Map_At(value_store, ts) == value;
210210
211211yield invariant {:layer 1 } AddToValueStoreInv({:linear} one_pid: One ProcessId, ts: TimeStamp);
212212invariant one_pid-> val == ts-> pid;
213213invariant ! Map_Contains(value_store, ts);
214214
215215yield invariant {:layer 2 } TimeStampQuorum();
216- invariant (exists {:pool "Q" } q: ReplicaSet:: {:add_to_pool "Q" , q} IsQuorum(q) && (forall rid: ReplicaId:: q[rid] ==> le(TS, replica_ts[rid])));
216+ invariant (exists q: ReplicaSet:: IsQuorum(q) && (forall rid: ReplicaId:: q[rid] ==> le(TS, replica_ts[rid])));
217217
218218yield invariant {:layer 2 } Monotonic#2 (cond: bool, ts: TimeStamp, rid: ReplicaId);
219219invariant cond ==> le(ts, replica_ts[rid]);
@@ -236,7 +236,7 @@ yield invariant {:layer 4} Yield#4();
236236// Procedures and actions
237237
238238yield procedure {:layer 4 } ReadClient({:linear} one_pid: One ProcessId) returns (value: Value)
239- preserves call ValueStoreInv(LeastTimeStamp(), InitValue);
239+ preserves call ValueStoreInv# 1 (LeastTimeStamp(), InitValue);
240240preserves call ReplicaInv();
241241requires call ValidTimeStamp();
242242preserves call TimeStampQuorum();
@@ -247,17 +247,16 @@ preserves call ValueStoreInv#3(LeastTimeStamp(), InitValue);
247247 var {:layer 2 , 3 } w: ReplicaSet;
248248 var ts: TimeStamp;
249249
250- par old_ts, w := Begin(one_pid) | ValueStoreInv(LeastTimeStamp(), InitValue) | ValidTimeStamp() | ValueStoreInv#3 (LeastTimeStamp(), InitValue);
250+ par old_ts, w := Begin(one_pid) | ValueStoreInv# 1 (LeastTimeStamp(), InitValue) | ValidTimeStamp() | ValueStoreInv#3 (LeastTimeStamp(), InitValue);
251251 call Yield#4 ();
252252 call q, ts, value := Read(one_pid, old_ts, w);
253- assume {:add_to_pool "Q" , q} true ;
254253 call Yield#4 ();
255254 par End(one_pid, ts);
256255}
257256
258257yield procedure {:layer 4 } WriteClient({:linear} one_pid: One ProcessId, value: Value, in: ReplicaSet) returns (ts: TimeStamp, out: ReplicaSet)
259- requires call MonotonicInduction(in, TimeStamp(last_write[one_pid-> val], one_pid-> val), 0 );
260- ensures call MonotonicInduction(out, ts, 0 );
258+ requires call MonotonicInduction# 1 (in, TimeStamp(last_write[one_pid-> val], one_pid-> val), 0 );
259+ ensures call MonotonicInduction# 1 (out, ts, 0 );
261260requires call LastWriteInv(one_pid, TimeStamp(last_write[one_pid-> val], one_pid-> val));
262261ensures call LastWriteInv(one_pid, ts);
263262requires call ValidTimeStamp();
@@ -270,7 +269,6 @@ preserves call ValueStoreInv#3(LeastTimeStamp(), InitValue);
270269 par old_ts, w := Begin(one_pid) | ValidTimeStamp() | ValueStoreInv#3 (LeastTimeStamp(), InitValue);
271270 call Yield#4 ();
272271 call out, ts := Write(one_pid, value, in, old_ts, w);
273- assume {:add_to_pool "Q" , out} true ;
274272 call Yield#4 ();
275273 call End(one_pid, ts);
276274}
@@ -294,21 +292,21 @@ refines action {:layer 4} _ {
294292 assume Map_Contains(value_store, ts);
295293 value := Map_At(value_store, ts);
296294}
297- preserves call ValueStoreInv(LeastTimeStamp(), InitValue);
295+ preserves call ValueStoreInv# 1 (LeastTimeStamp(), InitValue);
298296preserves call ReplicaInv();
299297preserves call AtLeastGlobalTimeStamp(w, old_ts);
300298preserves call ValidTimeStamp();
301299preserves call TimeStampQuorum();
302- requires {:layer 3 } IsQuorum(w);
303- preserves call ValueStoreInv#3 (LeastTimeStamp(), InitValue);
304300ensures call AtLeastGlobalTimeStamp(q, ts);
305301ensures {:layer 2 } IsQuorum(q);
302+ requires {:layer 3 } IsQuorum(w);
303+ preserves call ValueStoreInv#3 (LeastTimeStamp(), InitValue);
306304{
307305 var {:layer 1 } old_replica_store: [ReplicaId]StampedValue;
308306
309307 call {:layer 1 } old_replica_store := Copy(replica_store);
310308 call ts, value, q := QueryPhase(old_replica_store, old_ts, w);
311- par q := UpdatePhase(ts, value) | AtLeastGlobalTimeStamp(w, old_ts) | ValidTimeStamp() | ValueStoreInv(LeastTimeStamp(), InitValue);
309+ par q := UpdatePhase(ts, value) | AtLeastGlobalTimeStamp(w, old_ts) | ValidTimeStamp() | ValueStoreInv# 1 (LeastTimeStamp(), InitValue);
312310}
313311
314312yield procedure {:layer 3 } Write({:linear} one_pid: One ProcessId, value: Value, in: ReplicaSet, old_ts: TimeStamp, {:hide} {:layer 2 , 3 } w: ReplicaSet) returns ( out: ReplicaSet, ts: TimeStamp)
@@ -317,17 +315,17 @@ refines action {:layer 4} _ {
317315 assume ! Map_Contains(value_store, ts);
318316 value_store := Map_Update(value_store, ts, value);
319317}
320- requires call MonotonicInduction(in, TimeStamp(last_write[one_pid-> val], one_pid-> val), 0 );
321- ensures call MonotonicInduction(out, ts, 0 );
318+ requires call MonotonicInduction# 1 (in, TimeStamp(last_write[one_pid-> val], one_pid-> val), 0 );
319+ ensures call MonotonicInduction# 1 (out, ts, 0 );
322320requires call LastWriteInv(one_pid, TimeStamp(last_write[one_pid-> val], one_pid-> val));
323321ensures call LastWriteInv(one_pid, ts);
324322preserves call AtLeastGlobalTimeStamp(w, old_ts);
325323preserves call ValidTimeStamp();
326324preserves call TimeStampQuorum();
327- requires {:layer 3 } IsQuorum(w);
328- preserves call ValueStoreInv#3 (LeastTimeStamp(), InitValue);
329325ensures call AtLeastGlobalTimeStamp(out, ts);
330326ensures {:layer 2 } IsQuorum(out);
327+ requires {:layer 3 } IsQuorum(w);
328+ preserves call ValueStoreInv#3 (LeastTimeStamp(), InitValue);
331329{
332330 var q: ReplicaSet;
333331 var _value: Value;
@@ -341,13 +339,13 @@ ensures {:layer 2} IsQuorum(out);
341339}
342340
343341yield right procedure {:layer 3 } QueryPhase({:layer 1 } old_replica_store: [ReplicaId]StampedValue, old_ts: TimeStamp, {:layer 2 , 3 } w: ReplicaSet) returns (max_ts: TimeStamp, max_value: Value, q: ReplicaSet)
344- preserves call ValueStoreInv(LeastTimeStamp(), InitValue);
342+ preserves call ValueStoreInv# 1 (LeastTimeStamp(), InitValue);
345343preserves call ReplicaInv();
346344preserves call MonotonicAll(old_replica_store);
345+ ensures call ValueStoreInv#1 (max_ts, max_value);
346+ ensures {:layer 1 } IsQuorum(q) && (forall rid: ReplicaId:: q[rid] ==> le(old_replica_store[rid]-> ts, max_ts));
347347preserves call AtLeastGlobalTimeStamp(w, old_ts);
348348preserves call ValidTimeStamp();
349- ensures call ValueStoreInv(max_ts, max_value);
350- ensures {:layer 1 } IsQuorum(q) && (forall rid: ReplicaId:: q[rid] ==> le(old_replica_store[rid]-> ts, max_ts));
351349preserves call TimeStampQuorum();
352350requires {:layer 3 } IsQuorum(w);
353351preserves call ValueStoreInv#3 (LeastTimeStamp(), InitValue);
@@ -360,13 +358,13 @@ ensures {:layer 3} Map_Contains(value_store, max_ts) && Map_At(value_store, max_
360358
361359yield right procedure {:layer 3 } QueryPhaseHelper(i: int, q: ReplicaSet, {:layer 1 } old_replica_store: [ReplicaId]StampedValue, old_ts: TimeStamp, {:layer 2 , 3 } w: ReplicaSet) returns (max_ts: TimeStamp, max_value: Value)
362360requires {:layer 1 } IsReplica(i) || i == numReplicas;
363- preserves call ValueStoreInv(LeastTimeStamp(), InitValue);
361+ preserves call ValueStoreInv# 1 (LeastTimeStamp(), InitValue);
364362preserves call ReplicaInv();
365363preserves call MonotonicAll(old_replica_store);
364+ ensures call ValueStoreInv#1 (max_ts, max_value);
365+ ensures {:layer 1 } (forall rid: ReplicaId:: q[rid] && i <= rid && rid < numReplicas ==> le(old_replica_store[rid]-> ts, max_ts));
366366preserves call AtLeastGlobalTimeStamp(w, old_ts);
367367preserves call ValidTimeStamp();
368- ensures call ValueStoreInv(max_ts, max_value);
369- ensures {:layer 1 } (forall rid: ReplicaId:: q[rid] && i <= rid && rid < numReplicas ==> le(old_replica_store[rid]-> ts, max_ts));
370368preserves call TimeStampQuorum();
371369preserves call ValueStoreInv#3 (LeastTimeStamp(), InitValue);
372370ensures {:layer 3 } (exists rid: ReplicaId:: i <= rid && rid < numReplicas && q[rid] && w[rid]) ==> le(old_ts, max_ts);
@@ -392,8 +390,8 @@ ensures {:layer 3} Map_Contains(value_store, max_ts) && Map_At(value_store, max_
392390
393391yield left procedure {:layer 3 } UpdatePhase(ts: TimeStamp, value: Value) returns (q: ReplicaSet)
394392preserves call ReplicaInv();
395- preserves call ValueStoreInv(ts, value);
396- ensures call MonotonicInduction(q, ts, 0 );
393+ preserves call ValueStoreInv# 1 (ts, value);
394+ ensures call MonotonicInduction# 1 (q, ts, 0 );
397395preserves call TimeStampQuorum();
398396ensures call AtLeastGlobalTimeStamp(q, ts);
399397ensures {:layer 2 } IsQuorum(q);
@@ -406,8 +404,8 @@ yield left procedure {:layer 3} UpdatePhaseHelper(i: int, ts: TimeStamp, value:
406404requires {:layer 1 } IsReplica(i) || i == numReplicas;
407405requires {:layer 1 } IsQuorum(q);
408406preserves call ReplicaInv();
409- preserves call ValueStoreInv(ts, value);
410- ensures call MonotonicInduction(q, ts, i);
407+ preserves call ValueStoreInv# 1 (ts, value);
408+ ensures call MonotonicInduction# 1 (q, ts, i);
411409preserves call TimeStampQuorum();
412410ensures call MonotonicInduction#2 (q, ts, i);
413411{
@@ -430,7 +428,7 @@ preserves call TimeStampQuorum();
430428{
431429 call ts := Begin#0 (one_pid);
432430 call {:layer 2 } w := CalculateQuorum(replica_ts, ts);
433- assert {:layer 2 } (exists {:pool "Q" } q: ReplicaSet:: IsQuorum(q) && IsSubset(q, w));
431+ assert {:layer 2 } (exists q: ReplicaSet:: IsQuorum(q) && IsSubset(q, w));
434432}
435433
436434pure procedure {:inline 1 } CalculateQuorum(replica_ts: [ReplicaId]TimeStamp, ts: TimeStamp) returns (w: ReplicaSet)
@@ -460,14 +458,14 @@ refines right action {:layer 3} _ {
460458 value := InitValue;
461459 }
462460}
463- requires call ValueStoreInv(LeastTimeStamp(), InitValue);
461+ requires call ValueStoreInv# 1 (LeastTimeStamp(), InitValue);
464462requires {:layer 1 } IsReplica(rid);
465- requires call Monotonic(true , old_replica_ts, rid);
466- preserves call AtLeastGlobalTimeStamp(w, old_ts);
467- preserves call ValidTimeStamp();
463+ requires call Monotonic#1 (true , old_replica_ts, rid);
468464preserves call ReplicaInv();
469- ensures call ValueStoreInv(ts, value);
465+ ensures call ValueStoreInv# 1 (ts, value);
470466ensures {:layer 1 } q[rid] ==> le(old_replica_ts, ts);
467+ preserves call AtLeastGlobalTimeStamp(w, old_ts);
468+ preserves call ValidTimeStamp();
471469preserves call TimeStampQuorum();
472470{
473471 if (q[rid])
@@ -492,8 +490,8 @@ refines left action {:layer 3} _ {
492490}
493491requires {:layer 1 } IsReplica(rid);
494492preserves call ReplicaInv();
495- preserves call ValueStoreInv(ts, value);
496- ensures call Monotonic(q[rid], ts, rid);
493+ preserves call ValueStoreInv# 1 (ts, value);
494+ ensures call Monotonic# 1 (q[rid], ts, rid);
497495ensures call Monotonic#2 (q[rid], ts, rid);
498496preserves call TimeStampQuorum();
499497{
@@ -511,9 +509,9 @@ refines action {:layer 2} _ {
511509}
512510requires {:layer 1 } IsReplica(rid);
513511preserves call ReplicaInv();
514- requires call Monotonic(true , old_replica_ts, rid);
512+ requires call Monotonic# 1 (true , old_replica_ts, rid);
515513ensures {:layer 1 } le(old_replica_ts, ts);
516- ensures call ValueStoreInv(ts, value);
514+ ensures call ValueStoreInv# 1 (ts, value);
517515{
518516 call ts, value := Query#0 (rid);
519517}
@@ -539,8 +537,8 @@ refines action {:layer 2} _ {
539537}
540538requires {:layer 1 } IsReplica(rid);
541539preserves call ReplicaInv();
542- preserves call ValueStoreInv(ts, value);
543- ensures call Monotonic(true , ts, rid);
540+ preserves call ValueStoreInv# 1 (ts, value);
541+ ensures call Monotonic# 1 (true , ts, rid);
544542{
545543 call Update#0 (rid, ts, value);
546544 call {:layer 1 } replica_ts := Copy(replica_ts[rid := replica_store[rid]-> ts]);
0 commit comments