Logika Hoare'a - Hoare logic

Logika Hoare'a (znana również jako logika Floyda-Hoare'a lub zasady Hoare'a ) to formalny system z zestawem logicznych reguł do rygorystycznego wnioskowania o poprawności programów komputerowych . Został zaproponowany w 1969 roku przez brytyjskiego informatyka i logika Tony'ego Hoare'a , a następnie udoskonalony przez Hoare'a i innych badaczy. Pierwotne pomysły zostały zasiane przez prace Roberta W. Floyda , który opublikował podobny system schematów blokowych .

Hoare potrójny

Centralną cechą logiki Hoare'a jest trójka Hoare'a . Trójka opisuje, w jaki sposób wykonanie fragmentu kodu zmienia stan obliczeń. Trójka Hoare'a ma formę

gdzie i są twierdzeniami i jest poleceniem . jest nazwany warunek i na postcondition : gdy warunek jest spełniony, wykonanie polecenia ustanawia postcondition. Asercje to formuły w logice predykatów .

Logika Hoare zapewnia aksjomaty i reguły wnioskowania dla wszystkich konstrukcji prostego imperatywnego języka programowania . Oprócz reguł dla prostego języka w oryginalnym artykule Hoare'a, Hoare i wielu innych badaczy opracowało od tego czasu reguły dla innych konstrukcji językowych. Istnieją reguły dotyczące współbieżności , procedur , skoków i wskaźników .

Poprawność częściowa i całkowita

Używając standardowej logiki Hoare'a, można udowodnić tylko częściową poprawność , podczas gdy zakończenie należy udowodnić osobno. Tak więc intuicyjne odczytanie trójki Hoare'a brzmi: Ilekroć utrzymuje się stan przed wykonaniem , wtedy będzie obowiązywał później lub nie kończy się. W tym drugim przypadku nie ma „po”, więc może być w ogóle dowolna wypowiedź. Rzeczywiście, można wybrać fałsz, aby wyrazić, że nie kończy się.

Całkowitą poprawność można również wykazać za pomocą rozszerzonej wersji reguły While.

W swoim artykule z 1969 r. Hoare użył węższego pojęcia zakończenia, które pociągało za sobą również brak jakichkolwiek błędów w czasie wykonywania: „Niepowodzenie zakończenia może być spowodowane nieskończoną pętlą; na przykład zakres operandów numerycznych, wielkość pamięci masowej lub limit czasu systemu operacyjnego."


Zasady

Pusty schemat aksjomatu instrukcji

Pusty oświadczenie zasada stwierdza, że Skip stwierdzenie nie zmienia stanu programu, co jest prawdziwe, co przed pominąć również odnosi się później.

Schemat aksjomatu przypisania

Aksjomat przypisania stwierdza, że ​​po przypisaniu każdy predykat, który wcześniej był prawdziwy dla prawej strony przypisania, jest teraz obowiązujący dla zmiennej. Formalnie niech P będzie stwierdzeniem, w którym zmienna x jest wolna . Następnie:

gdzie oznacza twierdzenie P , w którym każdy wolny występowanie od x został zastąpiony przez wyrażenie E .

Schemat aksjomatu przypisania oznacza, że ​​prawdziwość P jest równoważna prawdziwości P . Tak więc były prawdziwe przed przypisaniem, przez aksjomat przypisania, wtedy P byłoby prawdziwe po którym. Odwrotnie, były fałszywe (tj. prawdziwe) przed oświadczeniem przypisania, P musi następnie być fałszywe.

Przykłady prawidłowych trójek obejmują:

Wszystkie warunki wstępne, które nie są modyfikowane przez wyrażenie, mogą zostać przeniesione do warunku końcowego. W pierwszym przykładzie przypisanie nie zmienia faktu, że , więc obie instrukcje mogą pojawić się w warunku końcowym. Formalnie wynik ten uzyskuje się przez zastosowanie schematu aksjomatu z P będącym ( i ), który daje byt ( i ), który z kolei można uprościć do danego warunku wstępnego .

Schemat aksjomatu przypisania jest równoważny powiedzeniu, że aby znaleźć warunek wstępny, najpierw weź warunek końcowy i zastąp wszystkie wystąpienia lewej strony przypisania prawą stroną przypisania. Uważaj, aby nie robić tego wstecz, kierując się tym niepoprawnym sposobem myślenia: ; ta zasada prowadzi do bezsensownych przykładów, takich jak:

Inną błędną zasadą, która na pierwszy rzut oka wydaje się kusząca, jest ; prowadzi do bezsensownych przykładów, takich jak:

Podczas gdy dany warunek końcowy P jednoznacznie określa warunek wstępny , odwrotność nie jest prawdziwa. Na przykład:

  • ,
  • ,
  • , oraz

są prawidłowymi instancjami schematu aksjomatu przypisania.

Aksjomat przypisania zaproponowany przez Hoare'a nie ma zastosowania, gdy więcej niż jedna nazwa może odnosić się do tej samej przechowywanej wartości. Na przykład,

jest błędne, jeśli x i y odnoszą się do tej samej zmiennej ( aliasing ), chociaż jest to właściwe wystąpienie schematu aksjomatu przypisania (z obiema i bytem ).

Zasada kompozycji

Reguła kompozycji Hoare'a dotyczy sekwencyjnie wykonywanych programów S i T , gdzie S wykonuje się przed T i jest zapisywane ( Q jest nazywane stanem pośrednim ):

Rozważmy na przykład następujące dwa przypadki aksjomatu przypisania:

oraz

Z reguły sekwencjonowania wnioskuje się:

Kolejny przykład pokazano w prawym polu.

Reguła warunkowa

Reguła warunkowa mówi, że warunek końcowy Q wspólny dla części then i else jest również warunkiem końcowym całości instrukcji if...endif . W części then i else , nienegowany i zanegowany warunek B można dodać do warunku wstępnego P , odpowiednio. Warunek B nie może mieć skutków ubocznych. Przykład podano w następnej sekcji .

Ta zasada nie była zawarta w oryginalnej publikacji Hoare'a. Jednak skoro oświadczenie

ma taki sam efekt jak konstrukcja z jednorazową pętlą

reguła warunkowa może być wyprowadzona z innych reguł Hoare. W podobny sposób reguły dla innych konstrukcji programów pochodnych, takich jak for loop, do...until loop, switch , break , continue mogą zostać zredukowane przez transformację programu do reguł z oryginalnego artykułu Hoare'a.

Reguła konsekwencji

Ta zasada pozwala wzmocnić warunek wstępny i/lub osłabić warunek końcowy . Służy np. do osiągnięcia dosłownie identycznych warunków końcowych dla części „ teraz” i „ inna” .

Na przykład dowód

musi zastosować regułę warunkową, co z kolei wymaga udowodnienia

lub uproszczony

dla ówczesnej części i

lub uproszczony

do innego części.

Jednak reguła przypisania dla części then wymaga wybrania P jako ; zastosowanie reguły daje zatem plony

, co jest logicznie równoważne
.

Reguła konsekwencji jest potrzebna do wzmocnienia warunku wstępnego uzyskanego z reguły przypisania do wymaganego dla reguły warunkowej.

Podobnie, w przypadku innego części, wydajność zasada przyporządkowanie

lub równoważnie
,

stąd reguła konsekwencji musi być zastosowana odpowiednio z i byciem i , aby ponownie wzmocnić warunek wstępny. Nieformalnie, efektem reguły konsekwencji jest „zapomnienie”, że jest to znane przy wejściu do części else , ponieważ reguła przypisania używana dla części else nie potrzebuje tych informacji.

Podczas gdy reguła

Tutaj P jest niezmiennikiem pętli , który ma być zachowany przez ciało pętli S . Po zakończeniu pętli ten niezmiennik P nadal obowiązuje, a ponadto musiał spowodować zakończenie pętli. Podobnie jak w regule warunkowej, B nie może mieć skutków ubocznych.

Na przykład dowód

reguła while wymaga udowodnienia

lub uproszczony
,

co można łatwo uzyskać dzięki regule przypisania. Na koniec warunek końcowy można uprościć do .

Na przykład reguła while może być użyta do formalnej weryfikacji następującego dziwnego programu w celu obliczenia dokładnego pierwiastka kwadratowego x dowolnej liczby a — nawet jeśli x jest zmienną całkowitą, a a nie jest liczbą kwadratową:

Po zastosowaniu reguły while, w której P jest prawdziwe , pozostaje do udowodnienia

,

co wynika z reguły pomijania i reguły konsekwencji.

W rzeczywistości, dziwny program jest częściowo poprawna: jeśli to się stało, aby zakończyć, pewne jest, że x musi być zawarta (przez przypadek) wartość a „s pierwiastka kwadratowego. We wszystkich innych przypadkach nie wygaśnie; dlatego nie jest całkowicie poprawne.

Choć zasada całkowitej poprawności

W przypadku zastąpienia powyższej reguły zwykłego while następującą, rachunek Hoare'a może być również wykorzystany do wykazania poprawności całkowitej , tj. terminacji, jak również poprawności częściowej. Zwykle zamiast nawiasów klamrowych używa się nawiasów kwadratowych, aby wskazać inne pojęcie poprawności programu.

W tej regule, oprócz zachowania niezmiennika pętli, udowadnia się również zakończenie za pomocą wyrażenia t , zwanego wariantem pętli , którego wartość ściśle maleje ze względu na ugruntowaną relację < na pewnym zbiorze domen D podczas każdej iteracji. Ponieważ < jest dobrze ugruntowane, ściśle malejący łańcuch elementów D może mieć tylko skończoną długość, więc t nie może się zmniejszać w nieskończoność. (Na przykład, zwykły porządek < jest dobrze ufundowany na dodatnich liczbach całkowitych , ale ani na liczbach całkowitych, ani na dodatnich liczbach rzeczywistych ; wszystkie te zbiory są rozumiane w sensie matematycznym, a nie obliczeniowym, wszystkie są w szczególności nieskończone.)

Ze względu na niezmienny pętli P , warunek B musi oznaczać, że t nie jest minimalna elementu z D , inaczej ciało S nie może zmniejszyć ţ dalej, to założenie reguły byłoby błędne. (Jest to jeden z różnych zapisów zapewniających całkowitą poprawność.)

Wznowienie pierwszego przykładu z poprzedniej sekcji , dla dowodu całkowitej poprawności

regułę while dla całkowitej poprawności można zastosować, gdzie np. D jest nieujemnymi liczbami całkowitymi o zwykłej kolejności, a wyrażenie t jest , co z kolei wymaga udowodnienia

Mówiąc nieformalnie, musimy udowodnić, że odległość zmniejsza się w każdym cyklu pętli, podczas gdy zawsze pozostaje nieujemna; proces ten może trwać tylko przez skończoną liczbę cykli.

Poprzedni cel dowodowy można uprościć do:

,

co można udowodnić w następujący sposób:

jest uzyskiwany przez regułę przypisania, oraz
może być wzmocniony przez regułę konsekwencji.

W przypadku drugiego przykładu z poprzedniej sekcji oczywiście nie można znaleźć wyrażenia t, które jest zmniejszane przez pustą treść pętli, dlatego nie można udowodnić zakończenia.

Zobacz też

Uwagi

Bibliografia

Dalsza lektura

Linki zewnętrzne

  • KEY-Hoare jest półautomatyczny system weryfikacji zbudowany na szczycie klucz twierdzenie Prover. Zawiera rachunek Hoare'a dla prostego języka.
  • j-Algo-modul Hoare calculus — Wizualizacja rachunku Hoare'a w programie do wizualizacji algorytmów j-Algo