【发布时间】:2021-03-10 11:17:54
【问题描述】:
我试图证明在 Dafny 中实现二叉搜索树的正确性,但我正在努力证明计算出的大小对应于元素集的大小。
到目前为止,我已经编写了以下代码:
datatype TreeSet =
Leaf
| Node(left: TreeSet, data: int, right: TreeSet)
predicate Valid(treeSet: TreeSet) {
match treeSet
case Leaf => true
case Node(left, data, right) => Valid(left) && Valid(right)
&& treeSet != left && treeSet != right
&& (forall elem :: elem in elems(left) ==> elem < data)
&& (forall elem :: elem in elems(right) ==> elem > data)
&& treeSet !in descendants(left)
&& treeSet !in descendants(right)
}
function descendants(treeSet: TreeSet) : set<TreeSet> {
match treeSet {
case Leaf => {}
case Node(left, _, right) => descendants(left) + descendants(right)
}
}
function size(treeSet: TreeSet): nat
requires Valid(treeSet)
ensures |elems(treeSet)| == size(treeSet)
{
match treeSet
case Leaf => 0
case Node(left,_,right) =>
size(left) + 1 + size(right)
}
function elems(treeSet: TreeSet): set<int>
{
match treeSet
case Leaf => {}
case Node(left, data, right) => elems(left) + {data} + elems(right)
}
Dafny 未能证明 size 函数,特别是 ensures |elems(treeSet)| == size(treeSet) 后置条件。
可以推断出元素集合的基数小于等于size函数,但不能推断出相等。我试图断言 Valid 谓词中元素的唯一性树不变量,但它仍然无法证明函数的正确性。知道我该如何完成这项工作吗?
【问题讨论】:
标签: dafny