Что вам нужно сделать, это присвоить выходные данные метода insertionSort
переменной, подобной этой:
subOne := insertionSort(subOne);
subTwo := insertionSort(subTwo);
Теперь у вас будет проблема на следующей строке
input := subTwo + subOne;
потому что
subOne + subTwo
- это последовательность, а input
- указатель на массив.Вы не хотите менять указатель, вы хотите изменить содержимое массива.Один из способов сделать это показан ниже:
method probOneSort(input:array?<int>)
modifies input;
requires input != null;
requires input.Length > 0;
requires input.Length%2==0;
{
var mid:= input.Length/2;
var subOne := input[0..mid];
var subTwo := input[mid..input.Length];
subOne := insertionSort(subOne);
subTwo := insertionSort(subTwo);
var val := subOne + subTwo ;
forall i | 0 <= i && i < input.Length { input[i] := val[i] ; }
}
Для этого вам нужно, чтобы insertionSort
гарантировал, что длина его вывода равна длине его ввода.В противном случае верификатор не может проверить, что нижний индекс val[i]
находится в диапазоне.