你好我试图从这个函数编写证明注释..这是使用Spark编程语言编写的
function Read_Sensor_Majority return Sensor_Type is
count1:Integer:=0;
count2:Integer:=0;
count3:Integer:=0;
overall:Sensor_Type;
begin
for index in Integer range 1..3 loop
if State(index) = Proceed then
count1:=count1+1;
elsif State (index) = Caution then
count2:=count2+1;
elsif State (index)=Danger then
count3:=count3+1;
end if;
end loop;
if count1>=2 then
overall:=Proceed;
elsif count2>=2 then
overall:=Caution;
elsif count3>=2 then
overall:=Danger;
else
overall:=Undef;
end if;
return overall;
end Read_Sensor_Majority;
begin -- initialization
State:= Sensordata'(Sensor_Index_Type => Undef);
end Sensors;
这是.ads文件
package Sensors
--# own State;
--# initializes State;
is
type Sensor_Type is (Proceed, Caution, Danger, Undef);
subtype Sensor_Index_Type is Integer range 1..3;
procedure Write_Sensors(Value_1, Value_2, Value_3: in Sensor_Type);
--# global in out State;
--# derives State from State ,Value_1, Value_2, Value_3;
function Read_Sensor(Sensor_Index: in Sensor_Index_Type) return Sensor_Type;
--# global in State;
function Read_Sensor_Majority return Sensor_Type;
--# global in State;
--# return overall => (count1>=2 -> overall=Proceed) and
--# (count2>=2 -> overall=Caution) and
--# (count3>=2 -> overall=Danger);
end Sensors;
这些是我在使用spark审查员检查文件后得到的错误
Examiner Semantic Error 1 - The identifier count1 is either undeclared or not visible at this point. <b>34:27</b> Semantic Error 1 - The identifier count1 is either undeclared or not visible at this point. Examiner
Sensors.ads:34:27
Semantic Error 1 - The identifier count1 is either undeclared or not visible at this point.
答案 0 :(得分:2)
您必须在引用标识符之前声明它们(除了一些例外)。
最重要的是,SPARK和Ada的基本原则是可以在不知道可能的匹配实现的情况下处理规范。
由于规范中未声明overall
,count1
,count2
或count3
,因此您无法在那里引用它们。
两个小旁注:
Sensor_Index_Type
是Integer
的子类型?答案 1 :(得分:1)
我自己只是在玩SPARK,所以这不是一个完整的答案。
(值得一提的是哪个SPARK有不同的版本,SPARK-2014似乎与其他版本有很大不同)我目前只有2006版Barnes,但不包括最新版本
基本问题非常明显:在规范中提供了包状态--# own State;
的抽象视图,然后您无法进入并观察具体细节。
该怎么办对我来说并不完全清楚,但有大纲形式: 为规范中的Read_Sensor_Majority提供更抽象的后置条件形式,并将具体形式移动到正文中。
Ada-2012采用的一种方法(我不知道如何适用于Spark-2005)是在规范function satisfies_conditions (...) return boolean;
中提供一个附加功能,可以在注释中调用,其主体包含具体实施。
Barnes(上文编辑)p.278确实显示了“证明函数”,可以在注释中为此目的声明。然后他们的身体可以进入内部状态进行具体检查。
答案 2 :(得分:0)
鉴于您正在显示.ads和.adb文件,我注意到.ads文件中的证明是引用正文中的项目。可能是证明者无法进入身体并拉动这些变量吗? (即可见度问题。)
消息:
The identifier count1 is either undeclared or not visible at this point.
似乎表明情况就是这样。
我不知道SPARK,所以这是我最好的猜测。