我在 Dafny 中创建了一个经过验证的 SortedMap。它是(键,值)对的序列。键是排序的、不同的整数。我不知道如何表明“KeySet”的长度必须等于序列的长度。
——卡尔
错误:
this is the postcondition that could not be proved
|
7 | ensures |KeySet(sorted_seq)| == |sorted_seq|
简化代码:
predicate SortedSeq(sequence: seq<(int, int)>) {
forall i, j | 0 <= i < j < |sequence| :: sequence[i].0 < sequence[j].0
}
function KeySet(sorted_seq: seq<(int, int)>): set<int>
requires SortedSeq(sorted_seq)
ensures |KeySet(sorted_seq)| == |sorted_seq|
{
set i | i in sorted_seq :: i.0
}
method Main()
{
var s: seq<(int,int)> := [(1, 2), (30, 40), (50, 50)];
print KeySet(s);
}
该性质需要归纳证明。由于定义函数的方式不是递归的,因此在 Dafny 中这并不容易做到。您可以 (1) 在单独的归纳引理中证明该属性,或者 (2) 将定义更改为递归。
(1)
(2)