Dafny:构造函数中的后置条件错误

Dafny: Postcondition error in constructor

以下构造函数不工作并在

失败

parent !in Repr

为什么 Dafny 不能证明后置条件,那个父节点不是 Repr 集的一部分?

constructor Init(x: HashObj, parent:Node?)
    ensures Valid() && fresh(Repr - {this, data})
    ensures Contents == {x.get_hash()}
    ensures Repr == {this, data};
    ensures left == null;
    ensures right == null;
    ensures data == x;
    ensures parent != null ==> parent !in Repr;
    ensures this in Repr;
{
    data := x;
    left := null;
    right := null;
    Contents := {x.get_hash()};
    Repr := {this} + {data};
}

我猜 HashObjtrait? (如果它是 class,那么你的例子为我验证。)验证失败,因为验证者认为 x 可能等于 parent.

验证者应该知道 Node 不是 HashObj(当然,除非你的 class Node 确实扩展了 HashObj) ,但事实并非如此。您可以在 https://github.com/dafny-lang/dafny 上将其作为问题提交以进行更正。

与此同时,你可以写一个前提条件说 xparent 是不同的。在这里,也有一个皱纹。你想写

requires x != parent

但是(除非 Node 确实扩展了 HashObj)这不会进行类型检查。因此,您可能希望将 parent 转换为 object?。这种向上转换没有直接的语法,但您可以使用 let 表达式来实现:

requires x != var o: object? := parent; o