对于一个学校项目我必须写一篇关于SPARK编程语言的论文,我做过,但是它的一部分是编写一个带有整数n的短程序并输出从1到n的平方和。在C ++中,程序看起来像这样:
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
if (n < 0) return 1;
int sum = 0;
int i = 0;
while (i <= n) sum += i*i;
cout << sum;
return 0;
}
我根本不熟悉SPARK,我在Ada中发现了一个类似的程序并略微修改它,因此它可以使用整数而不是双精度并输出结果(55)。
with Ada.Text_IO; use Ada.Text_IO;
procedure Test_Sum_Of_Squares is
type Integer_Array is array (Integer range <>) of Integer;
function Sum_Of_Squares (X : Integer_Array) return Integer is
Sum : Integer := 0;
begin
for I in X'Range loop
Sum := Sum + X (I) ** 2;
end loop;
return Sum;
end Sum_Of_Squares;
begin
Put_Line (Integer'Image (Sum_Of_Squares ((1, 2, 3, 4, 5))));
end Test_Sum_Of_Squares;
现在问题是如何将这个Ada程序变成SPARK程序。我尝试将Ada.Text_IO更改为Spark_IO,但IDE(GPS)给了我&#34;文件spark_io.ads&#34;没找到。&#34; 程序也应该使用任意整数n,而不仅仅是5,如例子中所示。 任何帮助将不胜感激。
答案 0 :(得分:1)
我假设您正在使用GNAT SPARK 2014作为示例程序。您的示例程序已经是有效的SPARK程序。
您可以将Sum_Of_Squares
函数更改为以下代码,以计算在控制台上读入的任意整数的总和。没有必要使用数组循环。我将Integer
更改为Natural
,因为我认为您只对大于或等于0的数字的平方感兴趣。
with Ada.Text_IO; use Ada.Text_IO;
procedure Main is
package Nat_IO is new Integer_IO(Natural); use Nat_IO;
function Sum_Of_Squares (X : in Natural) return Natural is
Sum : Natural := 0;
begin
for I in 1 .. X loop
Sum := Sum + I ** 2;
end loop;
return Sum;
end Sum_Of_Squares;
Input : Natural := 0;
begin
Nat_IO.Get(Input);
Put_Line (Positive'Image (Sum_Of_Squares (Input)));
end Main;
但是,SPARK的一个优点是添加一些额外的信息,以便自动证明程序的已定义属性。
希望有所帮助。