Логика разделения

Эта статья находится на начальном уровне проработки, в одной из её версий выборочно используется текст из источника, распространяемого под свободной лицензией
Материал из энциклопедии Руниверсалис
(перенаправлено с «Сепарационная логика»)

Логика разделения, сепарационная логика (англ. separation logic) — формальная система, подструктурная логика[англ.], применимая к верификации программ, содержащих изменяемые структуры данных и указатели, расширение логики Хоара. Разработана Джоном Рейнольдсом (англ. John C. Reynolds), Питером О’Хирном (англ. Peter O'Hearn), Самином Иштиаком (англ. Samin Ishtiaq) и Хонсёком Яном (англ. Hongseok Yang)[1][2][3][4] на основе работ Рода Бёрстола (англ. Rod Burstall)[5]. Язык утверждений логики разделения является специальным случаем логики пучковых импликаций (англ. logic of bunched implications)[6].

Развитием логики разделения для параллельных вычислений с общей памятью является параллельная логика разделения[⇨], разработанная О’Хирном и Стивеном Бруксом (фр. Stephen D. Brookes).

Технологии, основанные на логике разделения, позволяют разрабатывать системы для верификации крупных программных проектов[7].

Предпосылки создания

Логика Хоара имеет ряд ограничений, работая только с изменяемыми переменными и не поддерживая процедуры или код первого класса. Тем не менее, самое большое ограничение — это отсутствие поддержки указателей, что наиболее актуально для спецификации императивных программ. В случае использования указателей и кучи от изменяемых переменных можно отказаться, присваивая локальным переменным значение-указатель лишь один раз[8].

В 2000—2002 годах Джон Рейнольдс и Питер О’Хирн придумали расширение логики Хоара — логику разделения. Первоначальной идеей было упрощение рассуждений об императивных программах низкого уровня с общей изменяемой структурой данных[9]. Сам термин связан с основной идеей данной логики — описанием разделения хранилища (англ. storage) на непересекающиеся компоненты. Термин используется как в отношении исчисления предикатов, расширенного оператором разделения, так и для результата расширения хоаровской логики[1].

Описание

Ключевой особенностью логики разделения является возможность локальных рассуждений (local reasoning) благодаря наличию в утверждениях пространственных связок (англ. spatial connectives) между частями кучи[10].

Соответствует утверждению [math]\displaystyle{ x \mapsto 4 * 4 \mapsto y * y \mapsto 6 }[/math][11]

Логика позволяет работать с утверждениями вида [math]\displaystyle{ s, h \models P }[/math], где:

Для преодоления громоздких описаний запретов на использование одного и того же адреса разными объектами, введена новая логическая операция — разделяющая конъюнкция (disjoint conjunction), обозначаемая [math]\displaystyle{ P\ *\ Q }[/math] (или [math]\displaystyle{ P\ \land\!*\ Q }[/math][13]) и утверждающая, что каждое из условий [math]\displaystyle{ P }[/math] и [math]\displaystyle{ Q }[/math] выполняются в своей части кучи (адресуемого хранилища)[9][14]. То есть, [math]\displaystyle{ P\ *\ Q }[/math] истинна для кучи [math]\displaystyle{ h }[/math], если существуют две части этой кучи [math]\displaystyle{ h_1 }[/math] и [math]\displaystyle{ h_2 }[/math], для которых выполнено[15]:

  • Области [math]\displaystyle{ h_1 }[/math] и [math]\displaystyle{ h_2 }[/math] не пересекаются;
  • [math]\displaystyle{ h }[/math] является объединением [math]\displaystyle{ h_1 }[/math] и [math]\displaystyle{ h_2 }[/math];
  • [math]\displaystyle{ P }[/math] верно для всех адресов из [math]\displaystyle{ h_1 }[/math];
  • [math]\displaystyle{ Q }[/math] верно для всех адресов из [math]\displaystyle{ h_2 }[/math].

Выше под [math]\displaystyle{ h_1 }[/math] и [math]\displaystyle{ h_2 }[/math] понимаются частичные функции, дающие значения, соответствующие адресу в куче.

Для утверждения, что куча пуста, введён предикат [math]\displaystyle{ emp }[/math] (при этом очевидно выполняется [math]\displaystyle{ P \ *\ emp\ \Leftrightarrow\ P }[/math]), а для обозначения указателя — [math]\displaystyle{ e \mapsto x }[/math]. Например, в следующей, являющейся одной из аксиом, тройке Хоара

[math]\displaystyle{ \{E \mapsto -\}\ [E] := F \ \{E \mapsto F\} }[/math]

предусловием является неиспользованность ячейки памяти, которая в результате операции присваивания указывает на F, что и утверждается в постусловии[12].

Ключевым для локальных рассуждений является введённое О’Хирном правило фрейма (frame rule)[1]:

[math]\displaystyle{ \frac{\{P\}\ C\ \{Q\}}{\{P \ast R\}\ C\ \{Q \ast R\}}~\mathsf{mod}(C) \cap \mathsf{fv}(R) =\emptyset }[/math],

в котором никакая свободная переменная (англ. free variable) в [math]\displaystyle{ R }[/math] не изменяется (англ. modified) под влиянием команды [math]\displaystyle{ C }[/math]. Используя это правило, можно добавлять произвольные предикаты о переменных и частях кучи, которые не изменяются командой [math]\displaystyle{ C }[/math]. При этом О’Хирн назвал объём занимаемой кучи, затрагиваемой командой, термином англ. footprint («отпечаток»). Назначением правила фрейма является расширение рассуждения с более локального описания команды на более глобальное описание объемлющей команды — команды с бо́льшим отпечатком[1].

Установив, что логика разделения является примером логики пучковых импликаций, Ян и Иштиак ввёл разделяющую импликацию (англ. separating implication[1], англ. magic wand). Обозначение [math]\displaystyle{ P -\!\!\!\ast\, Q }[/math] говорит о том, если куча была расширена непересекающейся с ней кучей, для которой верно [math]\displaystyle{ P }[/math], то для получившейся в результате кучи будет верно [math]\displaystyle{ Q }[/math][7].

Семантика логических связок (разделяющей конъюнкции и разделяющей импликации) подразумевает моноидную структуру кучи[7].

Параллельная логика разделения (CSL)

Параллельная логика разделения (англ. Concurrent Separation Logic, CSL) — версия логики, применимая для верификации параллельных алгоритмов с общей памятью. Изначально предложена Питером О’Хирном. В ней используется следующее правило[16]

[math]\displaystyle{ \frac{\{P_1\} C_1 \{Q_1\} \quad \{P_2\} C_2 \{Q_2\}}{\{P_1 * P_2\}\; C_1 \parallel C_2 \;\{Q_1 * Q_2\}} }[/math],

которое позволяет строить выводы в присутствии независимых потоков выполнения, обращающихся к отдельному хранилищу. Правила доказательства О’Хирна адаптировали ранний подход Тони Хоара к параллелизму[17], заменив использование ограничений области видимости для обеспечения разделения рассуждениями в логике разделения. В дополнение к распространению подхода Хоара на указатели в куче, О’Хирн показал, что логика параллельного разделения может динамически отслеживать передачу владения областями кучи между процессами. Так, примеры в его статье включают буфер передачи указателя и менеджер памяти.

Локальные рассуждения можно понимать и в терминах передачи принадлежности (англ. ownership transfer). Легче всего рассмотреть передачу принадлежности на примере правил монитора Хоара (можно увидеть, что логика разделения подходит и для распределённых систем). Для входа процесса в критическую секцию применяется разделяющая конъюнкция с [math]\displaystyle{ I_r }[/math], где [math]\displaystyle{ I_r }[/math] — инвариант ресурса r. По выходу из критической секции логический вывод следует в обратном направлении[18]:

[math]\displaystyle{ \frac{\{P \ast I_r\}\ C\ \{Q \ast I_r\}}{\{P\}\ \mathsf{with}\ r\ \mathsf{do}\ C\ \{Q\}} }[/math],

По аналогии можно рассматривать и процесс обработки процессом сообщения, отправленного другим процессом с делегированными данному процессу ресурсами, определяемыми отпечатками[18].

Модель для параллельной логики разделения была впервые представлена Стивеном Бруксом (фр. Stephen D. Brookes) в сопроводительной статье к статье О’Хирна[19]. Корректность (англ. soundness) логики была сложной проблемой. В частности, контрпример Джона Рейнольдса показал несостоятельность более ранней, неопубликованной версии логики. Вопрос, поднятый примером Рейнольдса, кратко описан в статье О’Хирна и более подробно у Брукса.

О’Хирн и Брукс — со-обладатели премии Гёделя 2016 года за изобретение логики параллельного разделения[20].

Применение и реализации

Логика разделения нашла применение в автоматических и интерактивных верификаторах программного обеспечения, написанного в императивном и объектно-ориентированном стиле. Для этого были разработаны соответствующие дополнения к существующим инструментам верификации, например, таких как:

  • Ynot[21] — библиотека для верификации императивных программ для Coq.
  • Predator[22] — это анализатор программ на основе логики разделения для анализа программ, содержащих динамические списки[23].

Другие системы, использующие логику разделения: Smallfoot, Space Invader, THOR, SLAyer, HIP, jStar, Xisa, VeriFast, Infer, SeLoger, SLP. Тем не менее, по состоянию на 2014 год отсутствуют практичные доказатели теорем, реализующие полную логику разделения, то есть включающие разделяющую импликацию[7].

По характеру использования системы можно разделить следующим образом[24]:

  • Пользователь вручную пишет как спецификацию, так и доказательства, используя тактики: интерактивные системы доказательства теорем Coq, HOL4, Isabelle/HOL.
  • Пользователь пишет спецификацию и инварианты циклов: самостоятельные инструменты для верификации Smallfoot, HIP, Verifast, Jstar.
  • Пользователь пишет только спецификацию (или даже ничего не пишет): инструменты для анализа формы?! (англ. shape analysis) Space Invader, THOR, Xisa, SLAyer.

Примечания

  1. 1,0 1,1 1,2 1,3 1,4 1,5 Reynolds, 2002.
  2. Intuitionistic Reasoning about Shared Mutable Data Structure. John Reynolds. Millennial Perspectives in Computer Science, Proceedings of the 1999 Oxford-Microsoft Symposium in Honour of Sir Tony Hoare
  3. BI as an Assertion Language for Mutable Data Structures. Samin Ishtiaq, Peter O’Hearn. POPL 2001.
  4. Local Reasoning about Programs that Alter Data Structures. Архивная копия от 27 сентября 2013 на Wayback Machine Peter O’Hearn, John Reynolds, Hongseok Yang. CSL 2001
  5. Some techniques for proving programs which alter data structures. R.M. Burstall. Machine Intelligence 7, 1972.
  6. The Logic of Bunched Implications P.W. O’Hearn and D. J. Pym. Bulletin of Symbolic Logic , 5(2), June 1999, pp215-244
  7. 7,0 7,1 7,2 7,3 Lee, Park, 2014.
  8. Programs and Proofs, 2014.
  9. 9,0 9,1 Reynolds, 2008.
  10. Parkinson, Bierman, 2005.
  11. Chris Poskitt Software Verification (Fall 2013) Lecture 5: Separation Logic Parts I - II (недоступная ссылка)
  12. 12,0 12,1 A Primer on Separation Logic, 2012.
  13. Tjark Weber. Towards Mechanized Program Verification with Separation Logic // Computer Science Logic~-- 18th International Workshop, CSL 2004, 13th Annual Conference of the EACSL, Karpacz, Poland, September 2004, Proceedings (Lecture Notes in Computer Science). — Springer, 2004. — P. 250--264.
  14. Matthew J. Parkinson Local reasoning for Java Архивная копия от 23 сентября 2015 на Wayback Machine, 2005, UCAM-CL-TR-654, ISSN 1476—2986
  15. Lecture 24: Pointer and shape analysis Архивная копия от 29 ноября 2014 на Wayback Machine, LARA, EPFL
  16. (2007) «Resources, Concurrency and Local Reasoning». Theoretical Computer Science 375 (1–3): 271–307. doi:10.1016/j.tcs.2006.12.035.
  17. (1972) «Towards a theory of parallel programming». Operating System Techniques. Academic Press.
  18. 18,0 18,1 Étienne Lozes Information as Resource in Separation Logic (недоступная ссылка), ANR project, draft
  19. (2007) «A Semantics for Concurrent Separation Logic». Theoretical Computer Science 375 (1–3): 227–270. doi:10.1016/j.tcs.2006.12.034.
  20. European Association for Theoretical Computer Science 2016 Gödel Prize Архивная копия от 14 июля 2016 на Wayback Machine
  21. Ynot. Дата обращения: 19 ноября 2014. Архивировано 25 февраля 2009 года.
  22. Predator. Дата обращения: 19 ноября 2014. Архивировано 25 октября 2014 года.
  23. Мутилин В. С., Новиков Е. М., Хорошилов А. В. Обзор инструментов статической верификации Си программ в применении к драйверам устройств операционной системы Linux // Труды Института системного программирования РАН. — 2012. — Т. 22, № 3. — С. 293-326.
  24. Cliff Jones (from U. Newcastle), Viktor Vafeiadis (from MPI-SWS) Rely-guarantee thinking & separation logic Архивная копия от 29 ноября 2014 на Wayback Machine

Литература

Ссылки

  • Cliff Jones (Newcastle University), Viktor Vafeiadis (MPI-SWS) Rely-guarantee thinking & separation logic (англ.) — презентация, хорошо иллюстрирующая понятия логики разделения
  • Matthew Parkinson An Introduction to Separation Logic (англ.) — презентация, в которой иллюстрированы все основные аспекты логики разделения: аксиомы, примеры программ с соответствующими диаграммами, синтаксис