@@ -85,7 +85,7 @@ module {:options "-functionSyntax:4"} OptimizedMergeSort {
85
85
// This lemma works around this
86
86
// by proving that the outcomes are always deterministic and the same.
87
87
// It does this by proving that given a total ordering,
88
- // there is one and only one way to sort a given sequence.
88
+ // there is one and only one way to sort a given sequence.
89
89
TotalOrderingImpliesSortingIsUnique (right[..], other, lessThanOrEq);
90
90
}
91
91
}
@@ -412,21 +412,36 @@ module {:options "-functionSyntax:4"} OptimizedMergeSort {
412
412
label BEFORE_RETURN:
413
413
assert left[.. lo] == old (left[.. lo]) && right[.. lo] == old (right[.. lo]);
414
414
if resultPlacement. Left? && where == Right {
415
- forall i | lo <= i < hi {
415
+ for i := lo to hi
416
+ modifies right
417
+ invariant left[.. lo] == old (left[.. lo]) && right[.. lo] == old (right[.. lo])
418
+ invariant left[hi.. ] == old (left[hi.. ]) && right[hi.. ] == old (right[hi.. ])
419
+ invariant right[lo.. i] == left[lo.. i]
420
+ {
416
421
right[i] := left[i];
417
422
}
418
423
419
- assert right[lo.. hi] == mergedResult;
424
+ assert right[lo.. hi] == mergedResult by {
425
+ assert mergedResult == left[lo.. hi];
426
+ }
420
427
assert left[.. ] == old @BEFORE_RETURN (left[..]);
421
428
assert right[.. lo] == old (right[.. lo]);
422
429
423
430
resultPlacement := Right;
424
431
}
425
432
if resultPlacement. Right? && where == Left {
426
- forall i | lo <= i < hi {
433
+ for i := lo to hi
434
+ modifies left
435
+ invariant left[.. lo] == old (left[.. lo]) && right[.. lo] == old (right[.. lo])
436
+ invariant left[hi.. ] == old (left[hi.. ]) && right[hi.. ] == old (right[hi.. ])
437
+ invariant left[lo.. i] == right[lo.. i]
438
+ {
427
439
left[i] := right[i];
428
440
}
429
- assert left[lo.. hi] == mergedResult;
441
+
442
+ assert left[lo.. hi] == mergedResult by {
443
+ assert mergedResult == right[lo.. hi];
444
+ }
430
445
assert right[.. ] == old @BEFORE_RETURN (right[..]);
431
446
assert left[.. lo] == old (left[.. lo]);
432
447
0 commit comments