[英]Dafny: Postcondition error in constructor
以下構造函數不起作用並在
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
不是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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.