dafny - Dafny:构造函数中的后置条件错误
问题描述
以下构造函数不起作用并在
parent !in 代表
为什么 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
不是 a HashObj
(当然,除非你的类Node
确实是 extend HashObj
),但事实并非如此。您可以在https://github.com/dafny-lang/dafny上将此作为问题提交以更正。
同时,你可以写一个先决条件,说x
和parent
不同。在这里,也有皱纹。你想写
requires x != parent
但是(除非Node
确实扩展HashObj
)这不会进行类型检查。parent
所以,你会想投到object?
. 这种向上转换没有直接的语法,但您可以使用 let 表达式来实现:
requires x != var o: object? := parent; o
推荐阅读
- service - 统一 Kubernetes 中的服务端点
- node.js - 纱线启动和 ExecCommand.execute 出错
- aws-glue - 使用 Java 开发工具包的 AWS Glue 作业状态
- python - 如何“非规范化”一个 pytorch 张量?
- .net - Salesforce API 客户端
- javascript - How can a modal reopen another modal? (Angular 4+)
- php - how to split string by first new line
- javascript - ES2015 string iterator information about index
- c# - 我该如何修复'System.IO.IOException:'进程无法访问文件'
- react-native - React Native assembleRelease does not work for version 0.59.10