簡體   English   中英

將WhyML映射到SMT邏輯的確切機制

[英]The exact mechanism of mapping WhyML into SMT logic

美好的一天,自動演繹和驗證黑客!

為了更深入地了解WhyML如何為帶有ACSL注釋的C程序提供准確的證明,我試圖手動“復制” Why3對WhyML程序所做的工作,同時將它轉換為SMT邏輯並將其饋入Z3證明者。

假設我們有以下C片段:

const int L = 3;
int a[L] = {0};
int i = 0;
while (i < L) {
  a[i] = i;
  i++;
}
assert (a[1] == 1);

我正在嘗試將其編碼為SMT邏輯,如下所示:

(set-logic AUFNIRA)
(define-sort _array () (Array Int Int))
(declare-const ar _array)
(declare-fun set_a_i (_array Int Int) _array)
(assert (forall ((ar0 _array) (i Int) (j Int)) 
    (ite (< i j)   
                 (= (set_a_i ar0 i j) 
                    (set_a_i (store ar0 i i) (+ i 1) j))
                 (= (set_a_i ar0 i i) ar0) ))) 

(assert (= (select (set_a_i ar 0 3) 1) 1))
(check-sat)

Z3給出“未知”。

這可能是由於在指定set_a_i函數時使用了量化。 但是我看不到其他指定方法。

我知道以下陳述:

  • SMT求解器通常無法(或以不良方式完成)處理數組量化。
  • 如果我提供前后條件和循環不變性,那么WhyML能夠證明此類程序。
  • WhyML即使后端設置為Z3也能夠證明此類程序,因此SMT求解器本身不是問題。
  • WhyML可以生成z3 smt文件,但是要理解它是一個很大的麻煩,部分原因是whyML-> smt轉換的自動特性(例如,它不保留變量名)

我閱讀了幾乎所有提供的WhyML,Frama-C WP插件和Z3的資料。 我還閱讀了幾篇有關驗證C代碼的論文,但對C-> SMT轉換技術一無所獲。

我應該學習哪些材料以獲得這種理解? 您能否提供見解和/或鏈接到描述這種將命令性代碼轉換為多種一階邏輯的機制的論文的鏈接。

我將不勝感激。 謝謝!

祝你好運,葉夫根尼(Evgeniy)。

WP 0.8插件手冊和“ Why3:牧羊人證明 ”一文提供了高層次的概述,說明了如何將帶注釋的C代碼轉換為Why邏輯,以及如何將Why邏輯隨后轉換為定理證明者的輸入邏輯。

如WP插件手冊的1.3節所述,首先考慮Hoare的三元組:

{ P } stmt { Q }

讀為:只要先決條件P成立,然后在運行stmt后 ,后置條件Q成立。 WP插件將最弱的前提條件視為stmt的函數,並考慮了以下條件,使得以下Hoare三元組成立:

{ wpstmtQ )} stmt { Q }

從某種意義上說,最弱的先決條件是在stmt執行之前必須擁有的最簡單屬性,使得Qstmt執行之后擁有。

例如,考慮stmtx = x + 1且{ Q }為{x> 0}的情況。 根據Hoare演算的分配規則,我們知道{x + 1> 0} x = x + 1 {x> 0}成立。 實際上,{x + 1> 0}是x = x + 1和{x> 0}的最弱前提。

更一般而言,可以確定任何陳述和任何后置條件的最弱前提條件。

現在假設您有一個以前置條件P和后置條件Q注釋的函數f

{ P } f { Q }

定義W = wpfQ )。 根據wp的定義,我們知道以下Hoare三元組成立:

{ W } f { Q }

如果我們能夠證明將P⇒W(這是提交到定理證明),那么性能PQ對於f的有效性建立。

WP插件生成“為什么”邏輯。 如“ Why3:牧羊人證明”一文的第4節所述,Why3的操作被描述為處理證明任務,這些任務是一系列以目標結尾的聲明。 這就是為什么邏輯被轉換為特定定理證明者的輸入邏輯的方式。

舉一個具體的例子,本文概述了將“為什么”邏輯轉換為Z3。 輸入語言不僅有所不同(Z3使用SMT-LIB2語法),而且Why和Z3的邏輯也存在顯着差異。 本文給出了Z3不支持多態或歸納謂詞的示例。

為了將Why邏輯轉換為定理證明者的輸入邏輯,Why3使用了一系列轉換,這些轉換逐漸將Why邏輯轉換為目標輸入邏輯。 Why3使用稱為驅動程序的配置文件來定義所有轉換,使用漂亮的打印機輸出證明者的本機輸入格式,並使用正則表達式解釋證明者的輸出。

假設您已經運行了why3config ,則可以查看主目錄中自動生成的.why3.conf配置文件,以確定Why3為特定證明者使用的驅動程序。 例如,在我的系統上,當使用Z3時,Why3使用~/.opam/system/share/why3/drivers/z3_432.drv z3_432.drv導入smt-libv2.drv驅動程序作為SMT-LIB2兼容證明的基本驅動程序。

我知道您知道要檢查生成的SMT2,但是我認為我想對有興趣的人提到如何做到這一點。 如果將-wp-out DIR-wp-proof-trace選項傳遞給frama-c ,那么WP將保存在單個屬性上運行證明者的輸出。 然后,您可以找到感興趣的屬性的相應.err文件。 就我而言,它是main_assert_final_a_Why3_z3.err 在文本編輯器中打開該文件,您將看到類似以下內容:

Call_provers: command is: /Users/dtrebbien/.opam/system/lib/why3/why3-cpulimit
  10 1000 -s z3 -smt2 sat.random_seed=42 nlsat.randomize=false
  smt.random_seed=42
  /var/folders/1v/2nkqhkgx0qnfwd75h0p3fcsc0000gn/T/why_9f8a52_main_Why3_ide-T-WP.smt2

.smt2文件包含Why3生成的Z3的SMT-LIB2輸入。

您可以根據需要運行命令。 就我而言,我看到:

WARNING: pattern does contain any variable.
WARNING: pattern does contain any variable.
WARNING: pattern does contain any variable.
WARNING: pattern does contain any variable.
unsat
why3cpulimit time : 0.020000 s

盡管有點違反直覺,但unsat表示已確定該屬性的有效性。

暫無
暫無

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

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