Spark Proof注释

时间:2013-11-17 12:14:40

标签: ada spark-ada

你好我试图从这个函数编写证明注释..这是使用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.

3 个答案:

答案 0 :(得分:2)

您必须在引用标识符之前声明它们(除了一些例外)。

最重要的是,SPARK和Ada的基本原则是可以在不知道可能的匹配实现的情况下处理规范。

由于规范中未声明overallcount1count2count3,因此您无法在那里引用它们。

两个小旁注:

  • 请使用与语言参考手册中相同的标识符样式。 (领先大写,下划线分隔单词。)
  • 为什么Sensor_Index_TypeInteger的子类型?

答案 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,所以这是我最好的猜测。