规格:
package PolyPack with SPARK_Mode is
type Vector is array (Natural range <>) of Integer;
function RuleHorner (X: Integer; A : Vector) return Integer
with
Pre => A'Length > 0 and A'Last < Integer'Last;
end PolyPack ;
我想用 Assert 和 loop_invariants 编写 PolyPack 包的主体,以便 gnatprove 程序可以证明我的函数 RuleHorner 的正确性。
我写了我的函数 Horner 但我不知道如何在这个程序中放置断言和 loop_invariants 来证明它的正确性:
with Ada.Integer_Text_IO;
package body PolyPack with SPARK_Mode is
function RuleHorner (X: Integer; A : Vector) return Integer is
Y : Integer := 0;
begin
for I in 0 .. A'Length - 1 loop
Y := (Y*X) + A(A'Last - I);
end loop;
return Y;
end RuleHorner ;
end PolyPack ;
gnatprove:
overflow check might fail (e.g. when X = 2 and Y = -2)
overflow check might fail
溢出检查用于行 Y := (Y*X) + A(A'Last - I);
有人可以帮助我如何使用 loop_invariants 删除溢出检查