Reguła rama , jak ten podany poniżej, oddaje ideę, że, biorąc pod uwagę program c
z warunkiem p
, że posiada zanim skończy i postcondition q
która posiada potem jakiś warunek rozłączne r
powinny utrzymać zarówno przed jak i po c
serii. ( *
Łącznik wymaga, aby jego argumenty były rozłączne.) Często warunki wstępne i końcowe są stanami stosu i c
jest 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ć r
część sterty i zajmować się tylko tą częścią, która faktycznie się zmienia. Ale innym sposobem na to jest to, że zmiana z p
naq
została zachowana, mimo że r
teraz 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 p
do q
rzeczy.
źródło
Odpowiedzi:
Ale ta
q
wł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
y
jest to liczba37
. Kiedy uruchomię komendę alokacji na całkowicie pustej stercie, możliwe jest, że skończę alokując adres37
, więcx = 37
. Ale jeśli zacznę od stosu zawierającego pojedynczą komórkę pod adresemy = 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.
źródło
q
można zmienić tylko na „q
a 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.)q
moż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, żex
iy
są odrębne, jest prawdziwy niezależnie od konkretnego adresu wybranegoy
. Przykład pokazuje świeżość alokacji, która jest niezmienna przy zmianie nazwy.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
Więc w regule ramki
(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:R P. Q
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.do h1 P. h2) Q h′ 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:
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.do1 do2)
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ń.
źródło
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.
źródło