簡體   English   中英

關於ACSL歸納謂詞的Coq歸納推理?

[英]Coq inductive reasoning about ACSL inductive predicates?

是否可以對ACSL中定義的歸納謂詞使用歸納法?

考慮一下ACSL手冊中的以下示例:

struct List {
    int value;
    struct List* next;
};
/*@ inductive reachable{L}(struct List* root, struct List* to) {
  @   case empty{L}: \forall struct List* l; reachable(l, l);
  @   case non_empty{L}: \forall struct List *l1,*l2;
  @     \valid(l1) && reachable(l1->next, l2) ==> reachable(l1, l2);
  @ }
*/

我試圖證明以下引理:

/*@ lemma next_null_reachable: \forall struct List* l;
  @   \valid(l) && reachable(l, \null) ==> reachable(l->next, \null);
*/

Alt-Ergo在這里失敗,因此我求助於手動Coq推理:

Goal
  forall (t : array Z),
  forall (t_1 : farray addr addr),
  forall (a : addr),
  ((valid_rw t a 2%Z)) ->
  ((P_reachable t t_1 a (null))) ->
  ((P_reachable t t_1 (t_1.[ (shiftfield_F_List_next a) ]) (null))).

但是當我Search P_reachable ,我發現僅生成了兩個公理:

Q_non_empty:
  forall (t : array int) (t_1 : farray addr addr) (a_1 a : addr),
  valid_rw t a_1 2 ->
  P_reachable t t_1 (t_1 .[ shiftfield_F_List_next a_1]) a ->
  P_reachable t t_1 a_1 a
Q_empty:
  forall (t : array int) (t_1 : farray addr addr) (a : addr),
  P_reachable t t_1 a a    

並且沒有歸納原理。 所以我不能應用induction P_reachabledestruct P_reachable

我使用frama-c版本Sodium-20150201的WP插件。

要重現,你可以運行frama-c -wp -wp-rte -wp-prover coqide file.c ,其中file.c包含Listreachable定義和next_null_reachable引理。

從您的目標形式來看,我假設您正在使用WP插件。 確實,它沒有提供一個引理,表明reachable是驗證emptynon_empty empty兩種情況的最小謂詞,這意味着您不能使用歸納法。

如果我沒有記錯,加入這樣一個公理會混淆一階定理證明(誰還會反復構造的情況下reachable通過emptynon_empty並與感應原理破壞它們)。 但是,WP的Coq輸出可以很好地提供完整的翻譯。

一種解決方法是提供一組適當的專用引理(無法通過WP證明),而不是歸納原理。 請參binary_search_proved.c 存檔中的例如binary_search_proved.c

我從未使用過Alt-Ergo,但似乎它們並沒有創造出真正的歸納命題,而是公理化了它們。 因此,您不能進行induction但可以使用它們提供的基本塊( Q_empty是您的默認構造函數, Q_non_empty是您的歸納構造函數)執行證明。

我缺少一些基本的定義來重播您的問題,但是我只需要應用一次Q_non_empty ,它應該要求我證明一個valid_rw語句和一個P_reachable子語句。 兩者都應使用您的上下文證明。

暫無
暫無

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

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