我旨在证明霍纳规则(Horner's Rule)的正确性。为此,我将当前由霍纳计算得到的值与“真实”多项式的值进行比较。
因此,我编写了以下代码:
package body Poly with SPARK_Mode is
function Horner (X : Integer; A : Vector) return Integer is
Y : Integer := 0;
Z : Integer := 0 with Ghost;
begin
for I in reverse A'First .. A'Last loop
pragma Loop_Invariant (Y * (X ** (I - A'First + 1)) = Z);
Y := A(I) + Y * X;
Z := Z + A(I) * (X ** (I - A'First));
end loop;
pragma Assert (Y = Z);
return Y;
end Horner;
end Poly;
这应该证明不变性。不幸的是,gnatprove 告诉我:
cannot prove Y * (X ** (I - A'First + 1)) = Z
e.g. when A = (1 => 0, others => 0) and A'First = 0 and A'Last = 1 and I = 0 and X = 1 and Y = -1 and Z = 0
在这种情况下,Y = -1是如何工作的?您有任何修复的想法吗?
X ** V
有一个上界,其中包括单独显示X
和V = I - A'First + 1
的上界。尽管这可能仍然对证明者来说太难了。 - jklmnn