如何证明这个不变量?

问题描述 投票:0回答:1

我的目标是证明霍纳规则是正确的。为此,我将霍纳当前计算的值与“实”多项式的值进行比较。
所以我写了这段代码:

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 是如何工作的?您有任何想法如何解决这个问题吗?

ada proof invariants proof-of-correctness spark-ada
1个回答
11
投票

这里的反例是虚假的,它并不对应于真正的无效执行。该算法对于证明者来说过于复杂,这既导致循环不变性保持未被证明,又导致虚假的反例。

要研究此类未经证明的检查,您必须进入证明属性的“自动活动”模式,这需要将属性分解为较小的属性,直到自动证明者可以处理较小的步骤,或者您可以隔离未经证明的基本您可以在引理中隔离的属性,您可以单独验证它。

这里我在迭代开始时为 Y 的值引入了一个幽灵变量 YY,并在越来越小的断言中分解了循环不变量,这表明问题出在求幂 (X ** (I - A'First + 1) = X * (X ** (I - A'First)) 我也在断言中隔离了它:

package body Poly with SPARK_Mode is
   function Horner (X : Integer; A : Vector) return Integer is
      Y : Integer := 0;
      Z : Integer := 0 with Ghost;
      YY : Integer with Ghost;
   begin
      for I in reverse A'First .. A'Last loop
         pragma Loop_Invariant (Y * (X ** (I - A'First + 1)) = Z);
         YY := Y;
         Y := A(I) + Y * X;
         Z := Z + A(I) * (X ** (I - A'First));
         pragma Assert (Z = YY * (X ** (I - A'First + 1)) + A(I) * (X ** (I - A'First)));
         pragma Assert (X ** (I - A'First + 1) = X * (X ** (I - A'First)));
         pragma Assert (Z = YY * X * (X ** (I - A'First)) + A(I) * (X ** (I - A'First)));
         pragma Assert (Z = (YY * X + A(I)) * (X ** (I - A'First)));
         pragma Assert (Z = Y * (X ** (I - A'First)));
      end loop;
      pragma Assert (Y = Z);
      return Y;
   end Horner;
end Poly;

现在所有断言和循环不变量都使用 SPARK Community 2020 中的 --level=2 进行证明。当然,有些断言是不需要的,因此您可以删除它们。

© www.soinside.com 2019 - 2024. All rights reserved.