在 SPARK 检查数组元素报告中设置前提条件 'array index check might fail'

Making a precondition in SPARK checking array element reports 'array index check might fail'

继续我从 Dafny 转录到 SPARK 的努力,我 运行 遇到了为调用函数时应排序的数组设定前提条件的问题:

type Integer_Array is array (Positive range <>) of Integer;
function BinarySearch(a : Integer_Array; key: Integer) return Integer
  with
    --      requires forall i,j :: 0 <= i < j < a.Length ==> a[i] <= a[j] // a is a sorted array
    Pre => ((a'Length >= 2) and then (for all i in 1 .. a'Length - 1 => a(i-1) < a(i)))
--                                                                        |        ^---- array index check might fail
--                                                                        \------------- array index check might fail

我错过了什么?

(i-1) 绝对可以超出范围。例如,对于索引从 1 到 5 的数组,i-1 将为 0。我认为如果使用 'First'Last 而不是 'Range 会更好:

for all i in a'First + 1 .. a'Last => a(i-1) < a(i)

一般来说,避免在 Ada 的循环中使用数字作为索引是个好主意。该数组可以从各种值开始,例如 3 到 6,而不仅仅是 1。