簡體   English   中英

Dafny:構造函數中的后置條件錯誤

[英]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以得到更正。

同時,您可以編寫一個前提條件,說明xparent不同。 在這里,也有皺紋。 你想寫

requires x != parent

但是(除非Node確實擴展HashObj )這不會進行類型檢查。 那么,您是否希望將parent轉換為object? . 這種向上轉換沒有直接的語法,但您可以使用 let 表達式來實現:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM