Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Содержание
Введение
В информатике логика разделения является расширением логики Хоара, способом рассуждения о программах. Она была разработана Джоном К. Рейнольдсом, Питером О’Харном, Самином Иштиаком и Хонсеком Яном, опираясь на ранние работы Рода Берсталла. Язык утверждений логики разделения является частным случаем логики связующих импликаций (BI). Обзорная статья в журнале CACM, написанная О’Харном, описывает развитие этой области до начала 2019 года.
In computer science, separation logic is an extension of Hoare logic, a way of reasoning about programs. It was developed by John C. Reynolds, Peter O'Hearn, Samin Ishtiaq and Hongseok Yang, drawing upon early work by Rod Burstall. The assertion language of separation logic is a special case of the logic of bunched implications (BI). A CACM review article by O'Hearn charts developments in the subject to early 2019.
Утверждения: операторы и семантика
Логические утверждения разделения описывают "состояния", состоящие из хранилища и кучи, примерно соответствующие состоянию локальных (или выделенных в стеке) переменных и динамически выделенных объектов в общих языках программирования, таких как C и Java. Хранилище – это функция, отображающая переменные в значения. Куча – это частичная функция, отображающая адреса памяти в значения. Две кучи и являются раздельными (обозначаются как ⊓) если их области определения не пересекаются (т.е. для каждого адреса памяти , по крайней мере, одна из и не определена). Логика позволяет доказывать суждения вида , где – хранилище, – куча, а – утверждение относительно данного хранилища и кучи. Утверждения логики разделения (обозначаемые как , , ) содержат стандартные булевы связки и, кроме того, , , и , где и – выражения. Константа утверждает, что куча пуста, т.е. не определена для всех адресов. Бинарный оператор принимает адрес и значение и утверждает, что куча определена ровно в одной точке, отображая данный адрес в данное значение. Т.е. когда (где обозначает значение выражения , вычисленное в хранилище ) и в противном случае не определена. Бинарный оператор (произносится как "звезда" или разделяющая конъюнкция) утверждает, что кучу можно разделить на две раздельные части, в которых выполняются, соответственно, его два аргумента. Т.е. когда существует такая , что и и и . Бинарный оператор (произносится как "волшебная палочка" или разделяющее следствие) утверждает, что расширение кучи раздельной частью, удовлетворяющей его первому аргументу, приводит к куче, удовлетворяющей его второму аргументу. Т.е. когда для каждой кучи , такой что , также выполняется . Операторы и имеют некоторые свойства, общие с классическими операторами конъюнкции и импликации. Их можно комбинировать с помощью правила вывода, аналогичного modus ponens, и они образуют сопряжение, т.е. если и только если для ; точнее, сопряженные операторы – это и .
Separation logic assertions describe "states" consisting of a store and a heap, roughly corresponding to the state of local (or stack allocated) variables and dynamically allocated objects in common programming languages such as C and Java. A store is a function mapping variables to values. A heap is a partial function mapping memory addresses to values. Two heaps and are disjoint (denoted ) if their domains do not overlap (i. e., for every memory address , at least one of and is undefined). The logic allows to prove judgements of the form , where is a store, is a heap, and is an assertion over the given store and heap. Separation logic assertions (denoted as , , ) contain the standard boolean connectives and, in addition, , , , and , where and are expressions. The constant asserts that the heap is empty, i. e., when is undefined for all addresses. The binary operator takes an address and a value and asserts that the heap is defined at exactly one location, mapping the given address to the given value. I. e., when (where denotes the value of expression evaluated in store ) and is otherwise undefined. The binary operator (pronounced star or separating conjunction) asserts that the heap can be split into two disjoint parts where its two arguments hold, respectively. I. e., when there exist such that and and and The binary operator (pronounced magic wand or separating implication) asserts that extending the heap with a disjoint part that satisfies its first argument results in a heap that satisfies its second argument. I. e,. when for every heap such that , also holds. The operators and share some properties with the classical conjunction and implication operators. They can be combined using an inference rule similar to modus ponens
and they form an adjunction, i. e., if and only if for ; more precisely, the adjoint operators are and .
Решимость и сложность
Проблема выполнимости для фрагмента логики разделения, не содержащего кванторов, многосортного и параметризованного по сортам местоположений и данных, может быть доказана PSPACE-полной. Алгоритм решения этого фрагмента, основанный на DPLL(T), был интегрирован в cvc5. Расширяя этот результат, выполнимость для аналога класса Бернейса — Шёнфинкеля для логики разделения с неинтерпретированными ячейками памяти также может быть доказана PSPACE-полной, в то время как проблема становится неразрешимой при использовании интерпретированных ячеек памяти (например, целых чисел) или дополнительных чередованиях кванторов.
The satisfiability problem for a quantifier free, multi sorted fragment of separation logic parameterized over the sorts of locations and data can be shown to be PSPACE complete. An algorithm for solving this fragment in DPLL(T) based SMT solvers has been integrated into cvc5. Extending this result, satisfiability for an analog of the Bernays–Schönfinkel class for separation logic with uninterpreted memory locations can also be shown to be PSPACE complete, whereas the problem is undecidable with interpreted memory locations (e. g., integers) or further quantifier alternations