[英]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_reachable
或destruct P_reachable
。
我使用frama-c
版本Sodium-20150201的WP插件。
要重現,你可以運行frama-c -wp -wp-rte -wp-prover coqide file.c
,其中file.c
包含List
和reachable
定義和next_null_reachable
引理。
從您的目標形式來看,我假設您正在使用WP插件。 確實,它沒有提供一個引理,表明reachable
是驗證empty
和non_empty
empty
兩種情況的最小謂詞,這意味着您不能使用歸納法。
如果我沒有記錯,加入這樣一個公理會混淆一階定理證明(誰還會反復構造的情況下reachable
通過empty
或non_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.