Wasz aksjomat nie jest tak naprawdę aksjomatem, brakuje w nim hipotez. Proste prezentacje logiki Hoare manipulować formuły postaci w którym P i P ' są wyrażeniami logiczne i C jest polecenie. Musisz upewnić się, że C jest dobrze uformowany . W prostych językach, takich jak te często używane w pierwszym wprowadzeniu do logiki Hoare'a, dobrze uformowana jest składniowa: zazwyczaj chodzi o sprawdzenie, czy C{P}C{P′}PP′CCCjest zgodny z gramatyką bezkontekstową i możliwe, że wolne zmienne mieszczą się w dozwolonym zestawie. Jeśli język zawiera konstrukty o semantycznej poprawności, takie jak dostęp do elementów tablicy, musisz dodać hipotezy, aby wyrazić tę poprawność semantyczną.
Formalnie możesz dodawać osądy w celu wyrażenia korekty wyrażeń i poleceń. Jeśli wyrażenia nie wywołują skutków ubocznych, nie potrzebują warunków dodatkowych, a jedynie warunki wstępne. Na przykład możesz pisać dobrze sformułowane reguły, takie jak
i zezwalaj tylko na poprawnie sformułowane wyrażenia w poleceniach:
{P[x←E]}
{P}E wf{P∧0≤E<length(A)}A[E] wf{P}E1 wf{P}E2 wf{P}E1+E2 wf
{P[x←E]}E wf{P[x←E]}x:=E{P}
Inne podejście do leczenia wszystkie wyrażenia także uformowane, ale aby każdy ekspresję obejmujące źle ukształtowany obliczenia mają szczególną wartość . Języków z granice wykonywania kontroli czasu, e r r O r oznacza „program podniesione” fatalny wyjątek. Będziesz wtedy sprawdzać, czy program pomyłkowo przeszedł przez logiczny predykat E r r o r ; program jest ważny tylko wtedy, gdy możesz udowodnić, że jego uwarunkowanie implikuje ¬ E r r o r .
errorerrorError¬Error
{P[x←E]}x:=E{P∨Error}P[x←E]⟹E↛error{P[x←E]}x:=E{P}
Jeszcze innym podejściem jest rozważenie potrójnego zatrzymania Hoare'a tylko wtedy, gdy program zakończy się poprawnie. Jest to zwykle podejście stosowane w przypadku programów niekończących się: warunek ten obowiązuje po zakończeniu działania polecenia, co nie zawsze może się zdarzyć. Jeśli traktujesz błędy czasu wykonania jako brak zakończenia, omiatasz wszystkie problemy z poprawnością pod maską. Nadal będziesz musiał jakoś udowodnić poprawność programu, ale nie musi to być logika Hoare, jeśli wolisz inny formalizm do tego zadania.
Przy okazji, zauważ, że wyrażanie tego, co dzieje się, gdy zmienna złożona, taka jak tablica, jest modyfikowana, jest bardziej zaangażowane niż to, co napisałeś. Załóżmy, był, na przykład, : substytucja nie zmienia , a przydział może unieważnić . Nawet jeśli ograniczysz składnię predykatów tylko do mówienia o atomach, rozważ przypisanie pod warunkiem : nie można dokonać prostej zamiany w celu uzyskania prawidłowego warunku , należy ocenićPIsSorted(A)A[i]←EPA[i]←PPA[A[0]−1]:=A[0]A[0]=2∧A[1]=3A [ 0 ] A [ 0 ] A ← A [ i ← E ]A[0]=1∧A[1]=1A[0](co może być ogólnie trudne, ponieważ warunek wstępny może nie określać pojedynczej możliwej wartości dla ). Musisz wykonać podstawienie na samej tablicy: . Notatki z wykładu Mike'a Gordona mają dobrą prezentację Logika Hoare'a z tablicami (ale bez sprawdzania błędów).A[0]A←A[i←E]
length
doA
?length
został przemianowanyA_length
.) Po drugie, potrzebujemy aksjomatów „tworzenia” tablicy, takich jakint[] a = int[length] {a_length==length}
. Myślę, że to powinno wystarczyć.