在 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。
继续我从 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。