Reguła ramki jako preserver zmian?


18

Reguła rama , jak ten podany poniżej, oddaje ideę, że, biorąc pod uwagę program cz warunkiem p, że posiada zanim skończy i postcondition qktóra posiada potem jakiś warunek rozłączne rpowinny utrzymać zarówno przed jak i po cserii. ( *Łącznik wymaga, aby jego argumenty były rozłączne.) Często warunki wstępne i końcowe są stanami stosu i cjest to skuteczny program, który w pewien sposób modyfikuje stos.

    {p} c {q}
----------------- (where no free variable in r is modified by c)
{p * r} c {q * r}

Dyskusje na temat reguły ramki, którą widziałem, zawsze koncentrują się na tym, jak zachowana jest rozłączna część stosu r. Umożliwia to „lokalne rozumowanie”: gdy zastanawiamy się nad efektem c, możemy zignorować rczęść sterty i zajmować się tylko tą częścią, która faktycznie się zmienia. Ale innym sposobem na to jest to, że zmiana z pnaq została zachowana, mimo że rteraz tam jest. Innymi słowy, ważne jest, abyśmy skończyli z warunkiem {q * r}, a nie {q' * r}z innymi q'.

Moje pytanie brzmi więc, czy istnieje jakikolwiek sposób traktowania reguły ramowej, który omawia lub wykorzystuje zachowanie zachowania zmiany od rzeczy pdo qrzeczy.


Jedna odpowiedź na moje pytanie znajduje się w tym dokumencie: software.imdea.org/~gotsman/papers/interproc-sas06.pdf , w zdaniu (moje podkreślenie) „Jeśli P zapewnia przydzielenie śladu C, to zgodnie z Frame, wykonując C w obecności dodatkowej pamięci R powoduje takie samo zachowanie , a C nie dotyka dodatkowej pamięci. ” Chodzi o to, że „skutkuje tym samym zachowaniem”, na które chciałem zwrócić uwagę, oprócz tego, że „C nie dotyka dodatkowej pamięci”. (Podziękowania dla @kaosjester za link.)
Lindsey Kuper,

1
Jeśli zapoznasz się z dowodami dźwiękowymi reguły ramki i innymi zasadami Logiki separacji, odkryjesz, że robią dokładnie to, czego szukasz, tzn. Mówią o tym, jak zachowana jest zmiana z na q . Zwróć uwagę na wspomnianą tam lokalizację i właściwości ramki. pq
Uday Reddy,

Odpowiedzi:


11

Ale ta qwłaściwość „ bez zmian na własność” tak naprawdę nie obowiązuje!

Zastanów się {emp} x := alloc(0) {x |-> 0}. Teraz, jeśli wrobię y |-> 3, dostanę

{y |-> 3} x := alloc(0) {x |-> 0 * y |-> 3}

ale zgodnie z regułą mógłbym zmienić warunek na

{y |-> 3} x := alloc(0) {(x |-> 0 /\ x != y) * y |-> 3}

Aby uczynić to bardziej konkretnym, załóżmy, że yjest to liczba 37. Kiedy uruchomię komendę alokacji na całkowicie pustej stercie, możliwe jest, że skończę alokując adres 37, więc x = 37. Ale jeśli zacznę od stosu zawierającego pojedynczą komórkę pod adresem y = 37, wynik ten nie będzie już możliwy! Dodanie ramki do warunku wstępnego przycięło część niedeterminizmu w późniejszym stanie.

Artykuł „Lokalna logika działania i abstrakcyjna separacja” (Calcagno, O'Hearn i Yang) dotyczy zrozumienia reguły ramowej z głębszej, semantycznej perspektywy. Kluczową definicją artykułu jest lokalizacja dla „akcji”, gdzie akcja jest (semantyczną reprezentacją) programu. Lokalność mówi, że po dodaniu stosu ramek jedynym sposobem na zmianę pierwotnego warunku końcowego jest przycięcie jakiegoś niedeterminizmu, jak wyżej. W rzeczywistości przycinanie powstaje tylko z powodu alokacji.


Dzięki za przykład i referencję! Twój przykład ma sens. Czy można jednak powiedzieć, że qmożna zmienić tylko na „ qa także…”? Co więcej, jeśli alokacja jest jedyną rzeczą, która może przycinać niedeterminizm w postcondition (co samo w sobie jest fajnym wynikiem), to jeśli jest jakaś część postcondition, która jest niezależna od lokalizacji, to ta część postcondition gwarantujesz, że pozostanie taki sam? Czy możemy powiedzieć, że warunek końcowy pozostaje taki sam, aż do zmiany nazwy lokalizacji alfa? (Mam na myśli przykład, ale może lepiej to wyjaśnić przez e-mail.)
Lindsey Kuper,

1
Tak, qmożna zmienić tylko na „ q, a także…” Innymi słowy, warunek dodatkowy może stać się silniejszy : implikuje warunek pierwotny. Jest to część definicji lokalizacji działań. Nie jest jednak prawdą, że zmiana warunku końcowego wiąże się tylko ze zmianą nazwy. W podanym przeze mnie przykładzie dodatkowy fakt, że xi ysą odrębne, jest prawdziwy niezależnie od konkretnego adresu wybranego y. Przykład pokazuje świeżość alokacji, która jest niezmienna przy zmianie nazwy.
Aaron Turon,

11

Po pierwsze, w twoim pytaniu jest małe nieporozumienie, do czego Aaron doszedł również w swojej odpowiedzi. Predykaty w logice separacji są zbiorami hałd (lub równoważnie predykatami na hałdach), a koniunkcję oddzielającą definiuje się jako:P.Q

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

Więc w regule ramki

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

(oraz P i Q ) nie mówią o konkretnych hałdach - sąwłaściwościamihałd (ponieważ podzbiory i predykaty są równoważne). Najlepszym sposobem na zrozumienie, co się dzieje, jest określenie, co oznacza trzymanie potrójnego Hoare:RP.Q

{P.}do{Q}h1P..hH.mizapśwh#h1.h2)Q.h1h;doh2)h;skjap

Ta definicja zasadniczo mówi, że (1) jeśli uruchomisz z dowolnym h 1 w P , to zakończysz w jakimś stanie końcowym h 2 w Q , i (2) jeśli dodasz jakąkolwiek dodatkową pamięć h , pamięć ta będzie pozostać niezmienionym na końcu cyklu. Ale uwaga, że specyficzny h 2 dostać mogą się różnić dla różnych wyborów h ' --- co jest zagwarantowane jest, że właściwości P i Q nadal będzie trzymać pod tym idzie, nie, że masz dokładnie taki sam wynik sterty.doh1P.h2)Qh h2)h P.Q

Nie jest to zbyt trudne, ale nadal warto poćwiczyć, aby zobaczyć, jak ta definicja potrójnego Hoarea sugeruje, że obowiązuje reguła ramki. Jak zauważasz, jest to rodzaj właściwości „zachowania zmian” i ma szczególnie żywe wyrażenie w stwierdzeniu reguły równoległego składu w logice separacji równoległej:

{P.1}do1{Q1}{P.2)}do2){Q2)}{P.1P.2)}do1||do2){Q1Q2)}

Jeśli i c 2 działają na rozłączne regiony pamięci, to każdy z nich nie będzie zakłócał właściwości wykonywania drugiego, gdy są one uruchamiane równolegle.do1do2)

Dyskusja na ten temat znajduje się w artykule Hoare i in., On Locality and the Exchange Law for Concurrent Processes , gdzie pokazują, jak dać połączoną algebrę programów i stwierdzeń.


Definicja trójek Hoare'a wygląda źle: powinna powiedzieć, że wykonanie nie jest błędne, powinno pozwolić na nieterminowe zakończenie, prawdopodobnie nie powinno wykluczać modeli, które nie mają monotoniczności bezpieczeństwa. (Ale tak, zgadzam się, że rozsądnie jest mówić o „zachowaniu zmian” z powodów, które wyjaśnisz.)
Radu GRIGore,

3
(1) Podałem semantykę dla potrójnych całkowitych poprawności, a więc zapewnia, że ​​polecenie kończy się bezpiecznie - uważam, że całkowita poprawność ułatwia wyjaśnienie całkowitego / istniejącego charakteru warunków wstępnych i końcowych. (2) Ta semantyka potrójnych została faktycznie wynaleziona (IIRC przez Birkedala i Yang) do obsługi języków, które nie mają monotoniczności bezpieczeństwa w semantyce językowej, poprzez wbudowanie jej w znaczenie potrójnych. W rezultacie możesz mieć konstrukcje niemonotoniczne (np. Zapytania o wielkość stosu) w języku, przy jednoczesnym zachowaniu reguły ramek dla logiki Hoare.
Neel Krishnaswami,

(1) OK, ale te potrójne napisane są inaczej. (2) Nie wiedziałem tego. Aby ponownie sformułować to, co powiedziałeś: bez monotoniczności możesz stracić zasadę klatki i nadal używać potrójnych Hoare jak zwykle, o co mi chodziło w pierwszym komentarzu, ale możesz również wzmocnić definicję potrójnego, aby odzyskać reguła ramowa. (3) Nie rozumiem, dlaczego wyklucza błędy. Czy zakładasz, że jest deterministyczne? do
Radu GRIGore,

1
Dzięki, Neel! Masz rację, łączyłem właściwości P i Q z konkretnymi stertami. Podsumowując swój komentarz: Q jest zachowane, ale konkretna sterta, którą otrzymujesz na końcu, może być inną stertą spełniającą wymagania Q niż była wcześniej. Tak?
Lindsey Kuper,

1
@RaduGRIGore: tak, zakładałem, że język był deterministyczny i założenie to nie powiedzie się, gdy dodamy współbieżność. Dobry chwyt!
Neel Krishnaswami,

2

Chociaż nie jest w 100% spokrewniony, ma smak idempotencji kontraktowej.

Jeśli myślimy o {p} jako warunku wstępnym na c, a {q} jako warunku dodatkowym na c, to idea reguły ramowej zapewniłaby, że warunki wstępne i końcowe będą obowiązywać w każdym kontekście obliczeniowym, a nie prosty przypadek, w którym nic innego nie istnieje.

To powiedziawszy, nie mogę powiedzieć, że widziałem taką regułę ramową przedstawioną w kilkudziesięciu dokumentach kontraktowych, które przeczytałem. Jest to z pewnością świetny pomysł, a wymaganie takiej zmiany może wiele zrobić w kierunku wypracowania rozsądnego, namacalnego zrozumienia idempotentnych umów.


Dziękuję za komentarz. Hm, ciekawe - zastanawiam się, czy ktoś inny, kto to czyta, zna dokumenty kontraktowe określające właściwości ramki.
Lindsey Kuper,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.