簡體   English   中英

Dafny:沒有體的引理

[英]Dafny : lemmas without bodies

我一直在建模任務中使用抽象引理和函數(沒有主體)。 在這個例子中,

lemma py(c : int) returns (a: int, b :int)
    ensures a*a + b*b == c*c

lemma main(c : int) returns (a: int, b :int)
    ensures a*a + b*b == c*c
{
    a, b := py(c);
}

在 main 中調用 py 可確保后置條件為真,而不管 py 是如何實現的。 我有兩個問題:

  1. 在 Dafny 中使用抽象引理/函數是否安全? 以上代碼修改如下,經Dafny驗證:

     lemma py(c : int) returns (a: int, b :int) ensures a*a + b*b == c*c ensures a*a + b*b != c*c

    雖然我認為可能是達夫尼應該拋出一個錯誤。

  2. 我應該說lemma {:axiom} py(...)嗎? 我沒有觀察到包含{:axiom}{:imported}的差異。

正如 James 所提到的,在對您沒有實現的行為進行建模時,沒有實體的引理可能很有用。 如果您不提供主體,則驗證器不會嘗試驗證引理的正確性。 因此,它本質上是一個公理。

即使沒有 James 提到的/noCheating標志,Dafny 編譯器也會抱怨 body-less 引理(以及方法和函數)。 請注意,編譯器在驗證器滿足之后才會啟動。 {:axiom}屬性表示您願意為引理的真實性承擔責任。 對於無主體的非重影方法,您還可以使用{:extern}屬性,該屬性可讓您鏈接以其他語言編寫的代碼。 同樣,您對該外部代碼的正確性承擔責任,因為 Dafny 驗證程序不會檢查它。

魯斯坦

在對您沒有實現的系統部分進行建模時,沒有主體的方法和函數確實很有用。

但是,在提供此類方法和函數后置條件時必須小心,因為它們會變得可信,並且不會被 Dafny 檢查。 換句話說,如果它們有后置條件,使用沒有體的引理或函數可能是不安全的

也就是說,這些方法和函數對於建模是必不可少的,因此它們可能不安全的事實並不意味着您不應該使用它們。 相反,在寫下后置條件時應該格外小心,因為它們不會被檢查。

如果您向 Dafny 傳遞/noCheating:1標志,它會抱怨任何沒有具有后置條件的主體的方法或函數,並強制您使用{:axiom}屬性。 即使不通過/noCheating:1 ,這也很有用,只是為了標記后置條件是可信的。 是否通過/noCheating:1或是否使用該屬性取決於您。

暫無
暫無

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

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