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};
}
我猜 HashObj
是 trait
? (如果它是 class
,那么你的例子为我验证。)验证失败,因为验证者认为 x
可能等于 parent
.
验证者应该知道 Node
不是 HashObj
(当然,除非你的 class Node
确实扩展了 HashObj
) ,但事实并非如此。您可以在 https://github.com/dafny-lang/dafny 上将其作为问题提交以进行更正。
与此同时,你可以写一个前提条件说 x
和 parent
是不同的。在这里,也有一个皱纹。你想写
requires x != parent
但是(除非 Node
确实扩展了 HashObj
)这不会进行类型检查。因此,您可能希望将 parent
转换为 object?
。这种向上转换没有直接的语法,但您可以使用 let 表达式来实现:
requires x != var o: object? := parent; o
以下构造函数不工作并在
失败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};
}
我猜 HashObj
是 trait
? (如果它是 class
,那么你的例子为我验证。)验证失败,因为验证者认为 x
可能等于 parent
.
验证者应该知道 Node
不是 HashObj
(当然,除非你的 class Node
确实扩展了 HashObj
) ,但事实并非如此。您可以在 https://github.com/dafny-lang/dafny 上将其作为问题提交以进行更正。
与此同时,你可以写一个前提条件说 x
和 parent
是不同的。在这里,也有一个皱纹。你想写
requires x != parent
但是(除非 Node
确实扩展了 HashObj
)这不会进行类型检查。因此,您可能希望将 parent
转换为 object?
。这种向上转换没有直接的语法,但您可以使用 let 表达式来实现:
requires x != var o: object? := parent; o