【发布时间】:2019-03-09 00:33:17
【问题描述】:
规格:
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 删除溢出检查
【问题讨论】:
-
尝试运行
Rulehorner (1, (Integer'Last, Integer'Last));它给出了一个Constraint_Error。 -
@Simon Wright 你知道如何用 spark 改进规范和 body horner_rule 来证明所有断言吗?
-
我的意思是你不能证明从目前的情况来看没有异常,因为这个函数将引发异常的输入!它是你的函数,你可以通过说明它应该做什么来帮助自己,最好以更好的前置条件和后置条件的形式。英语是一个开始;我不知道。
标签: ada formal-verification spark-ada spark-2014