Правило рамки , как приведенному ниже, отражает идею , что, учитывая программу c
с предварительным условием , p
что имеет место , прежде чем он работает и постусловии q
что держит позже, некоторые непересекающиеся условие r
следует держать как до , так и после того, как c
работает. ( *
Соединение требует, чтобы его аргументы были непересекающимися.) Часто предварительные и постусловия являются состояниями кучи и c
представляют собой эффективную программу, которая каким-то образом модифицирует кучу.
{p} c {q}
----------------- (where no free variable in r is modified by c)
{p * r} c {q * r}
Обсуждение правила фрейма, которое я видел, всегда фокусируется на том r
, как сохраняется непересекающаяся часть кучи . Это позволяет «локально рассуждать»: рассуждая о влиянии, c
которое мы имеем, мы можем игнорировать r
часть кучи и заботиться только о той части, которая действительно изменяется. Но другой способ взглянуть на это состоит в том, что изменение с p
наq
сохраняется, даже если r
сейчас там сидят. Другими словами, важно, чтобы мы в конечном итоге получили постусловие {q * r}
, а не {q' * r}
какое-то другое q'
.
Итак, мой вопрос , есть ли какое - либо лечение правила кадра, обсуждаемые или используют сохранение его изменения-from- p
-До- q
вещи.
источник
Ответы:
Но это без изменений в
q
собственности на самом деле не имеет места!Посмотрим
{emp} x := alloc(0) {x |-> 0}
. Теперь, если я в кадреy |-> 3
, я получаю{y |-> 3} x := alloc(0) {x |-> 0 * y |-> 3}
но по правилу следствия я мог изменить постусловие на
{y |-> 3} x := alloc(0) {(x |-> 0 /\ x != y) * y |-> 3}
Чтобы сделать это более конкретным, предположим, что
y
это число37
. Когда я запускаю команду выделения в совершенно пустой куче, возможно, что я в конечном итоге выделю адрес37
, так чтоx = 37
. Но если я вместо этого начну с кучи, содержащей одну ячейку по адресуy = 37
, этот результат больше невозможен! Добавление рамки к предварительному условию исключило некоторые недетерминированности в постусловии.Статья «Локальное действие и абстрактная логика разделения» (Calcagno, O'Hearn и Yang) посвящена пониманию правила фрейма с более глубокой, семантической точки зрения. Ключевым определением статьи является локальность для «действий», где действие - это (семантическое представление) программы. Локальность говорит, что когда вы добавляете кучу кадров, единственный способ изменить исходное постусловие - это обрезать некоторый недетерминизм, как описано выше. И, на самом деле, обрезка возникает только из-за выделения.
источник
q
может измениться только на "q
, а также ..."? И, кроме того, если распределение - это единственное, что может обрезать недетерминизм в постусловии (что само по себе является крутым результатом), то, если есть некоторая часть постусловия, которая не зависит от местоположения, то эта часть постусловия гарантированно останется прежним? Можно ли сказать, что постусловие остается неизменным вплоть до альфа-переименования местоположений? (Я имею в виду пример, но, возможно, это лучше объяснить по электронной почте.)q
может измениться только на "q
, а также ..." Другими словами, постусловие может только стать сильнее : оно будет означать исходное постусловие. Это часть определения местности для действий. Однако неверно, что изменение постусловия связано только с переименованием. В приведенном мною примере тот факт, чтоx
иy
являются различными, является истинным независимо от выбранного адресаy
. В этом примере фиксируется свежесть распределения, которая инвариантна при переименовании.Во-первых, в формулировке вашего вопроса есть небольшое заблуждение, на которое Аарон также понял в своем ответе. Предикаты в логике разделения - это наборы куч (или, что то же самое, предикаты в кучах), и разделяющее соединение определяется как:P∗Q
Так в правиле кадра
(и P и Q ) не говорят о конкретных кучах - они являютсясвойствамикуч (поскольку подмножества и предикаты эквивалентны). Лучший способ понять, что происходит - взглянуть на определение значения тройки Хоара:р п Q
Это определение в основном говорит, что (1) если вы запустите с любым h 1 в P , то вы закончите в каком-то конечном состоянии h 2с час1 п час2 в , и (2) если вы добавите в любую дополнительную память h ′ , эта память будет быть неизменным в конце пробега. Но обратите внимание, что конкретное значение h 2, которое вы получаете, может различаться для разных вариантов выбора h ′ --- что гарантировано, так это то, что свойства P и Q будут продолжать сохраняться при расширении, а не то, что вы получите точно такую же кучу результатов.Q час' час2 час' п Q
Это не слишком сложно, но все же стоит потрудиться, чтобы увидеть, как это определение тройки Хоара подразумевает, что правило фрейма выполнено. Как вы заметили, это своего рода свойство «сохранения изменений», и оно особенно ярко выражено в формулировке правила параллельной композиции в логике параллельного разделения:
Если и c 2 действуют на непересекающиеся области памяти, то каждый из них не будет мешать свойствам выполнения другого, когда они выполняются параллельно.с1 с2
Об этом говорится в статье Хоара и др. « О локальности и законе обмена для параллельных процессов» , где они показывают, как дать объединенную алгебру программ и утверждений.
источник
Хотя это не связано на 100%, это имеет вид идемпотентности контракта.
Если мы будем думать о {p} как о предварительном условии на c и {q} как о постусловии на c, эта идея правила фрейма обеспечит выполнение предварительных и постусловий в любом контексте вычисления, а не простой случай, когда ничего не существует.
Тем не менее, я не могу сказать, что я видел такое рамочное правило, представленное в любом из десятков контрактных документов, которые я прочитал. Это, безусловно, отличная идея, и требование такого изменения может многое сделать для выработки разумного, осязаемого понимания идемпотентных контрактов.
источник