Как описать двойную связь, используя логику разделения в инструменте VST

Например, в проекте 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)"?

1 ответ

Во-первых, я бы предложил использовать "verify_reverse2.v" вместо "verify_reverse.v". Если у вас нет последней версии VST, получите VST 2.0 (или получите основную ветку репозитория github) и посмотрите на verify_reverse2.v, а также посмотрите описание этого примера в doc/VC.pdf.

Тем не менее, это для односвязных списков.

Поиск в Google "логики разделения двусвязных списков" дает полезную ссылку:

http://www.eecs.qmul.ac.uk/~gretay/papers/SepLogicIntro.ppt(см. слайд 17)

Используя технику Fixpoint, показанную в verify_reverse2.v, вы сможете адаптировать это решение.

Другие вопросы по тегам