Правило фрейму як збереження змін?


18

Правило рамки , як наведеному нижче, відображає ідею , що, з огляду на програму 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речі.


Одна відповідь на моє власне запитання - у цій статті: software.imdea.org/~gotsman/papers/interproc-sas06.pdf , у реченні (міна акценту) "Якщо P гарантує виділення сліду C, то відповідно до Frame, виконуючи C за наявності додаткової пам'яті R призводить до такої ж поведінки , а C не торкається зайвої пам'яті ". Це те, що "призводить до тієї самої поведінки", на яку я шукав когось, на додачу просто "C не торкається зайвої пам'яті". (Дякуємо @kaosjester за посилання.)
Ліндсі Купер

1
Якщо ви прочитаєте докази здоровості правила кадру та інших правил логіки розділення, ви виявите, що вони роблять саме те, що ви після, тобто говорять про те, як зберігається зміна від на q . Зверніть увагу на місцевості та властивості кадру, згадані там. pq
Удай Редді

Відповіді:


11

Але ця 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, такий результат вже неможливий! Додавання кадру до передумови прирізало частину недетермінізму в постумові.

У статті "Локальна дія та абстрактна логіка розділення" (Кальканьо, О'Герн та Ян) йдеться про розуміння правила кадру з глибшої, семантичної точки зору. Ключовим визначенням статті є локальність для "дій", де дія (смислове представлення) програми. Місцевість говорить про те, що при додаванні в якусь купу фреймів єдиний спосіб зміни оригінальної умови передумови - це обрізання певного недетермінізму, як зазначено вище. І насправді обрізка виникає лише через виділення.


Дякую за приклад та за довідку! Ваш приклад має сенс. Чи справедливо сказати, що це qможе змінитися лише на " q, а також ..."? І, крім того, якщо виділення - це єдине, що може підрізати недетермінізм у посткондиціоні (що є крутим результатом саме по собі), то, якщо є якась частина умови, що не залежить від місця розташування, то це та частина постумови гарантовано залишитися таким же? Чи можна сказати, що післязастереження залишається однаковим до альфа-перейменування місць? (Я маю на увазі приклад, але, можливо, це краще пояснити електронною поштою.)
Ліндсі Купер,

1
Так, qможе змінитися лише на " q, а також ..." Іншими словами, постумова може тільки посилитися : це матиме на увазі початкову постічну умову. Це частина визначення місцевості для дій. Неправда, однак, що зміна післяумови пов'язана лише з перейменуванням. У прикладі, який я наводив, додатковий факт, який відрізняється xі yвідрізняється, є істинним незалежно від обраної адреси y. Приклад фіксує свіжість виділення, яка є інваріантною при перейменуванні.
Аарон Турон

11

По-перше, у висловленні вашого запитання є невелике неправильне уявлення, саме про це Аарон також отримував у своїй відповіді. Предикати в логіці розділення - це сукупності купи (або, що еквівалентно, предикати на купи), і розділовий сполучник визначається як:PQ

PR{h1h2|h1Ph2Rdom(h1)dom(h2)=}

Так у кадрі правило

{P}c{Q}{PR}c{QR}

P і Q ) не говорять про конкретні купи --- вони євластивостямикупи (оскільки підмножини та предикати є рівнозначними). Найкращий спосіб зрозуміти, що відбувається, переглянувши визначення того, що означає тримати Хоара:RPQ

{P}c{Q}h1P.hHeaps.t.h#h1.h2Q.h1h;ch2h;skip

Це визначення в основному говорить про те, що (1) якщо ви запускаєте з будь-яким h 1 в P , тоді ви закінчите в деякому кінцевому стані h 2 в Q , і (2), якщо ви додасте додаткову пам'ять h ' , ця пам'ять буде бути незмінним в кінці пробігу. Але зауважте, що конкретний h 2, який ви отримуєте, може відрізнятися для різних варіантів h ' ---, що гарантується, що властивості P і Qch1Ph2Qh h2h PQ будуть продовжувати триматися в розширенні, а не, що ви отримаєте абсолютно однаковий набір результатів.

Не надто важко, але все ж варто попрацювати, щоб побачити, як це визначення трійки Хоара означає, що рамкове правило дотримується. Як ви зазначаєте, це своєрідне властивість "збереження змін", і воно має особливо яскравий вираз у викладі правила паралельного складу в паралельній логіці розділення:

{P1}c1{Q1}{P2}c2{Q2}{P1P2}c1||c2{Q1Q2}

c1c2

Про це йдеться у статті Хоара та ін, Про місцевість та Закон про обмін на паралельні процеси , де вони демонструють, як дати об'єднану алгебру програм та тверджень.


Визначення трійки Хоара виглядає неправильним: слід сказати, що виконання не є помилковим, воно повинно допускати неприпинення, воно, мабуть, не повинно виключати моделей, що не мають одноманітності безпеки. (Але так, я погоджуюся, що цілком розумно говорити про "збереження змін" з причин, які ви пояснюєте.)
Radu GRIGо

3
(1) Я дав семантику для повної коректності потрійності, і тому він стверджує, що команда виконується безпечно - я вважаю, що повна правильність полегшує роз’яснення тексту / існуючого характеру до і після умов. (2) Ця семантика трійки була фактично винайдена (IIRC Біркедалем та Ян) для обробки мов, які не мають монотонності безпеки в мовній семантиці, шляхом її побудови в значенні трійки. В результаті у вас можуть бути монотонні конструкції (наприклад, запити про те, наскільки велика купа) в мові, зберігаючи рамкове правило для логіки Хоара.
Ніл Крішнасвамі

c

1
Дякую, Ніл! Ви маєте рацію, я плутав властивості P і Q з певними кучами. Отже, підсумовуючи ваш коментар: Q зберігається, але конкретна купа, яку ви отримаєте в кінці, може бути різною групою, що задовольняє Q, ніж ви отримували раніше. Так?
Ліндсі Купер

1
@RaduGRIG: Так, я припускав, що мова є детермінованою, і це припущення не вдасться, коли ми додамо паралельність. Приємний улов!
Ніл Крішнасвамі

2

Хоча це не на 100% пов'язане, це має аромат імовірності контракту.

Якщо ми розглядаємо {p} як попередню умову c, а {q} - як умову на c, це уявлення про рамкове правило гарантувало б, що до- і післяумови мають місце у кожному контексті обчислення, а не простий випадок, коли нічого іншого не існує.

З цього приводу я не можу сказати, що я бачив таке рамкове правило, представлене в одній з десятків прочитаних контрактних паперів. Це, звичайно, чудова ідея, і вимагаючи такої зміни може зробити багато для розвитку розумного, відчутного розуміння ідентичних контрактів.


Дякуємо за коментар Гм, цікаво - мені цікаво, чи хтось, хто читає це, знає про контрактні папери, які містять властивості кадру.
Ліндсі Купер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.