【发布时间】:2021-05-16 05:20:39
【问题描述】:
我是 Dafny 的新手,正在尝试编写一个简单的链表实现,它将存储在链表中的所有整数相加。代码如下:
class Node {
var elem: int;
var next: Node?;
constructor (data: int)
{
elem := data;
next := null;
}
method addLinkedList() returns (res: int)
{
res := 0;
var current := this;
while(current != null)
{
res := res + current.elem;
current := current.next;
}
}
}
我有一个简单的节点类,我将整数相加并将指针移动到下一个节点。对我来说很明显,在真正的链表上,这将终止,因为我们最终会到达一个为空的节点,但是我不知道如何向 Dafny 证明这一点。当我使用数组时,总是有一个明显的 decreses 子句,我可以将其添加到 while 循环中,但我不知道这里减少了什么。我尝试将 length 函数编写为:
function length(node:Node?):int
{
if(node == null) then 0
else 1 + length(node.next)
}
但是 Dafny 警告我,它也不能证明它的终止,所以我不能将它用作我的 while 循环中的 decreses 子句。
我已经尝试在其他地方搜索,但没有找到任何可以解决此问题的方法,因此非常感谢您的帮助,谢谢。
【问题讨论】: