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))).
しかし、 Iの場合Search P_reachable
、次の 2 つの公理のみが生成されていることがわかります。
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