【发布时间】:2019-03-15 21:39:49
【问题描述】:
我想找到具有以下规格的值的最小因子
procedure S_Factor (N : in out Positive; Factor : out Positive) with
SPARK_Mode,
Pre => N > 1,
Post => (Factor > 1) and
(N'Old / Factor = N) and
(N'Old rem Factor = 0) and
(for all J in 2 .. Factor - 1 => N'Old rem J /= 0)
is
begin
...
end S_Factor;
我写了程序的主体,试图涵盖所有断言,但总是有一个后置条件失败......
procedure S_Factor (N : in out Positive; Factor : out Positive) with
SPARK_Mode,
Pre => N > 1,
Post => (Factor > 1) and
(N'Old / Factor = N) and
(N'Old rem Factor = 0) and
(for all J in 2 .. Factor - 1 => N'Old rem J /= 0)
is
begin
Factor := N;
for J in 2 .. Factor loop
if N rem J /= 0 then
null;
else
Factor := J;
N := N / Factor;
exit;
end if;
end loop;
end S_Factor ;
我做错了什么?有人可以帮助我通过规范中的所有断言吗?
【问题讨论】:
-
是否需要使用然后而不是and来确保短路功能?我对 SPARK 不太熟悉,但在 Ada 中你很熟悉。
-
@Jere、@john-perry 和我发现
and then在受保护的子程序上造成了问题。 -
@SimonWright 是错误还是定义了某些实现?我没有做过很多复杂的发布条件,所以这个话题很有趣(或者如果有指向这个问题的链接,那也很好,不管你更容易)。
-
@Jere,
and then表示一侧或另一侧可能无法评估;这违反了ARM 6.1.1(27) 的最后一句话,“可能未评估的旧属性引用的前缀应静态表示一个实体”(不,我也不明白 :-) -
@SimonWright 谢谢!
标签: ada formal-verification spark-ada spark-2014