谓词
# 谓词
谓词是一个返回布尔值的函数。这是一个简单但强大的想法,发生在Dafny
的程序。例如,我们将整数数组上的sorted
谓词定义为一个函数,该函数接受一个数组作为参数,当且仅当该数组按递增顺序排序时,返回true
。谓词的使用使我们的代码更短,因为我们不需要一遍又一遍地写出一个很长的属性。它还可以通过给一个公共属性命名来使我们的代码更容易阅读。
我们有很多方法可以写sorted
谓词,但最简单的是在数组的下标上使用一个量词。我们可以写一个量词来表示属性“如果数组中x
在y
之前,那么x <= y
,作为一个量词在两个绑定变量上:
forall j, k :: 0 <= j < k < a.Length ==> a[j] <= a[k]
1
这里我们有两个绑定变量,j
和k
,都是整数。两者之间的比较保证了它们在数组中都是有效的下标,并且j
在k
之前。然后第二部分说它们彼此之间的顺序是正确的。量词在Dafny
中只是一种布尔值表达式,所以我们可以将排序谓词写为:
predicate sorted(a: array<int>)
requires a != null
{
forall j, k :: 0 <= j < k < a.Length ==> a[j] <= a[k]
}
1
2
3
4
5
2
3
4
5
注意,没有返回类型,因为谓词总是返回布尔值。
Dafny
拒绝给出的这段代码,声称谓词读不出a
。修复此问题需要另一个注释,读取注释。
编辑 (opens new window)
上次更新: 2022/03/26, 19:35:15