=和< =>之间的差异在扩展的隐式函数定义中

时间:2016-02-12 06:24:50

标签: vdm++

我看到了一些扩展显式函数的有趣行为。

我定义了一个隐含函数

  isLeap (year:nat) res:bool
    post res = year rem 4 = 0 and (year rem 100 = 0 => year rem 400 = 0);

和相应的显式函数(因为post条件是可计算的)

  isLeap2 : nat -> bool
  isLeap2 (year) == year rem 4 = 0 and (year rem 100 = 0 => year rem 400 = 0);

isLeap2返回预期的值。然后我定义了一个扩展的隐式函数

  isLeap (year:nat) res:bool
    == year rem 4 = 0 and (year rem 100 = 0 => year rem 400 = 0)
    post res = year rem 4 = 0 and (year rem 100 = 0 => year rem 400 = 0);

这是按预期工作的,除非提供的参数是100的倍数而不是400.结果是

Error 4056: Postcondition failure: post_isLeap in 'test' (/Users/paul/Documents/Overture/workspace/test/test.vdmsl) at line 8:31

然后当我在输入时,我想,

  isLeap (year:nat) res:bool
    == year rem 4 = 0 and (year rem 100 = 0 => year rem 400 = 0)
    post res <=> year rem 4 = 0 and (year rem 100 = 0 => year rem 400 = 0);

,结果与预期一致。 '='和'&lt; =&gt;'之间有什么区别?在这种背景下?在VDM-10语言手册(2014年11月发行)的3.1.1节中,状态“当我们处理布尔值时,语义&lt; =&gt;和=是等价的”。它们在操作上是不同的吗?

1 个答案:

答案 0 :(得分:0)

答案当然是运营商优先权。如果我将第一个版本括号,那么一切都很好。

post res =(year rem 4 = 0 and(year rem 100 = 0 =&gt; year rem 400 = 0));