Computer science 我如何修改我的岗位条件以达到防火花金标准-Ada Spark

Computer science 我如何修改我的岗位条件以达到防火花金标准-Ada Spark,computer-science,ada,formal-methods,spark-ada,Computer Science,Ada,Formal Methods,Spark Ada,我是Ada的新手,一直在尝试实现一些基础知识。我有一个简单的功能来抛硬币-不是随机的,正面应该被抛到反面,反之亦然。我添加了一个post条件,即flipcoin!=硬币据说一枚抛过的硬币不能等于原来的硬币,但当我试图用-mode gold来证明文件时,我得到了以下警告: flip_coin.ads:8:06: warning: postcondition does not mention function result flip_coin.ads:8:14: warning: call to &

我是Ada的新手,一直在尝试实现一些基础知识。我有一个简单的功能来抛硬币-不是随机的,正面应该被抛到反面,反之亦然。我添加了一个post条件,即flipcoin!=硬币据说一枚抛过的硬币不能等于原来的硬币,但当我试图用-mode gold来证明文件时,我得到了以下警告:

flip_coin.ads:8:06: warning: postcondition does not mention function result
flip_coin.ads:8:14: warning: call to "flip" within its postcondition will lead to infinite recursion
flip_coin.ads:8:14: medium: postcondition might fail, cannot prove flip(x) /= x[#0]
这是广告文件

package flip_coin with SPARK_Mode
is
  type Coin is (Heads, Tails);

  function flip (x : Coin) return Coin with
   Post => flip(x) /= x;
end flip_coin;
这是.adb文件

package body flip_coin with SPARK_Mode
is

  function flip (x : Coin) return Coin
  is
  begin
    if x = Heads then return Tails; else return Heads; end if;
  end flip;

end flip_coin;
任何帮助都会很好!在接下来的两周里,我会提出更多的要求。

试试后条件:

function flip (x : Coin) return Coin with
   Post => flip'Result /= x;
这可确保函数结果不等于函数输入x


在后置条件中声明flipx确实会导致无限递归,因为每次调用flip时都会检查后置条件。因此,该函数将始终再次求值,以检查后置条件:无限递归。

非常感谢!我尝试了flip'Resultx/=x,但它不起作用,现在我知道了原因。太神了