Coq 如何在VST工具中使用分离逻辑描述双链路

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; }

作为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;
  }
  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中显示的定点技术,您应该能够适应该解决方案