[英]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 是如何實現的。 我有兩個問題:
在 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
雖然我認為可能是達夫尼應該拋出一個錯誤。
我應該說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.