Coq 如何在VST工具中使用分离逻辑描述双链路
作为VST项目中的一个示例,reverse.c文件具有如下链接列表:Coq 如何在VST工具中使用分离逻辑描述双链路,coq,verifiable-c,Coq,Verifiable C,作为VST项目中的一个示例,reverse.c文件具有如下链接列表: struct list {unsigned head; struct list *tail;}; unsigned sumlist (struct list *p) { unsigned s = 0; struct list *t = p; unsigned h; while (t) { h = t->head; t = t->tail; s = s + h; }
struct list {unsigned head; struct list *tail;};
unsigned sumlist (struct list *p) {
unsigned s = 0;
struct list *t = p;
unsigned h;
while (t) {
h = t->head;
t = t->tail;
s = s + h;
}
return s;
}
它的分离逻辑写为:
SEP (lseg LS sh (map Vint contents) p nullval)
其中LS定义为:
Instance LS: listspec _list _tail (fun _ _ => emp).
Proof. eapply mk_listspec; reflexivity. Defined.
我的问题是,如果我有一个双链表,如何编写其相应的分离逻辑。
例如:如下所示的双链接列表:
struct list {unsigned head; struct list *prev;struct list *tail;};
那么,“SEP(lseg LS??sh(map Vint contents)p nullval)”应该是什么?首先,我建议使用“verif_reverse2.v”而不是“verif_reverse.v”。如果您没有最新版本的VST,请获取VST2.0(或获取github repo的主分支),然后查看verif_reverse2.v,并查看doc/VC.pdf中的本案例研究说明 不过,这是针对单链接列表的 谷歌搜索“双链表分离逻辑”提供了以下有用的参考: (见幻灯片17)
使用verif_reverse2.v中显示的定点技术,您应该能够适应该解决方案。首先,我建议使用“verif_reverse2.v”而不是“verif_reverse.v”。如果您没有最新版本的VST,请获取VST2.0(或获取github repo的主分支),然后查看verif_reverse2.v,并查看doc/VC.pdf中的本案例研究说明 不过,这是针对单链接列表的 谷歌搜索“双链表分离逻辑”提供了以下有用的参考: (见幻灯片17) 使用verif_reverse2.v中显示的定点技术,您应该能够适应该解决方案