2013-11-05 21 views
3

我有這樣的C代碼:如何證明時/在伊莎貝爾/ HOL

while(p->next) p = p->next; 

我想證明,無論列表有多長,當這個循環結束,p->next等於NULL,並EIP指的是這個循環之後的下一條指令。

但我不能。有沒有人知道如何證明在Isabelle/HOL

+1

我不知道有任何直接的方法來驗證Isabelle/HOL中C代碼的屬性。你能否提供你想要達到的更多細節以及你在哪裏使用(或期望使用)來做到這一點?也許http://afp.sourceforge.net/entries/Simpl.shtml是有趣的。順便說一句:什麼是「EIP」? – chris

+0

獨立於您想要使用的證明工具。你打算如何處理列表是循環的情況(即循環沒有終止)? – chris

+0

你好@chris。對不起,我不能告訴你太多的細節,這是一個團隊工作,並沒有發佈。我可以告訴你的是,我們正在模擬Isabelle中的X86 ISA指令,如mov,jmp。由gcc生成的彙編代碼被翻譯成Isabelle,並在Isabelle中運行。當沒有循環時,結果非常好。但是我們無法處理循環,這是非常困難的。我們想證明對於所有的n,這個while循環將以p-> next等於NULL結束,並且eip(pc)將指向循環下面的下一條指令。 – njuguoyi

回答

8

一套工具(免責聲明:我是後者的作者),允許您將C代碼導入Isabelle/HOL,以進一步推理Michael Norrish的C ParserAutoCorres。使用命令

struct node { 
    struct node *next; 
    int data; 
}; 

struct node * traverse_list(struct node *list) 
{ 
    while (list) 
     list = list->next; 
    return list; 
} 

到伊莎貝爾:

使用AutoCorres,我可以分析下面的C文件

theory List 
imports AutoCorres 
begin 

install_C_file "list.c" 
autocorres [ts_rules = nondet] "list.c" 

然後,我們可以證明,霍爾三重其中指出,對於任何輸入狀態,函數的返回值將爲NULL

lemma "⦃ λs. True ⦄ traverse_list' l ⦃ λrv s. rv = NULL ⦄" 
    (* Unfold the function definition. *) 
    apply (unfold traverse_list'_def) 

    (* Add an invariant to the while loop. *) 
    apply (subst whileLoop_add_inv [where I="λnext s. True"]) 

    (* Run a VCG, and solve the conditions using the simplified. *) 
    apply wp 
    apply simp 
    done 

T他是一個部分正確性定理,其中有點陳述你所要求的。 (特別是,它指出如果功能終止,而如果它沒有錯,那麼後置條件爲真)。

爲了更完整的證明,你將需要一些更多的東西添加到上面:

  1. 你需要知道的是,名單是有效的;例如,中間節點不指向無效地址(例如,未對齊的地址),並且該列表不構成循環(意味着while循環將永不終止)。

  2. 您還需要證明終止。這與上面的第二個條件有關,但您可能仍然需要爲什麼它是真實的進行爭論。 (一種典型的方法是說列表的長度總是減少,因此循環最終會終止)。

AutoCorres沒有指示指令指針的概念(通常這些概念只存在於彙編級別),但終止的證明是類似的。

AutoCorres在DataStructures.thy中提供了推理鏈接列表的一些基本庫,這將是一個很好的起點。