Dowód poprawności algorytmu jest rozumowaniem matematycznym prowadzącym do formalnego wykazania, że dany algorytm przy poprawnych danych wejściowych da nam wynik spełniający wymagania, np. że algorytm quicksort po podaniu mu niepustej tablicy elementów porównywalnych na wyjściu da nam tablicę zawierającą te same elementy, ale uporządkowane w kolejności od najmniejszego do największego.
Dowód poprawności algorytmu stale składa się z dwóch części:
- dowód, że jeśli algorytm się zakończy, to da poprawny wynik,
- dowód, że przy poprawnych danych wejściowych algorytm stale się zakończy.
Do dowodzenia poprawności algorytmów wykorzystywane są zwykle pewne formalizmy matematyczne wiążące ze sobą warunek wstępny, kod oraz warunek końcowy. Przeważajaca ilość tych formalizmów ma za podstawę o logikę Hoare'a.
W ogólnym przypadku pytanie, czy dany algorytm jest poprawny jest nierozstrzygalne, dla większości języków opisu algorytmów nierozstrzygalne są nawet pytania:
- czy dane dwa algorytmy dają taki sam wynik,
- czy dany algorytm dla poprawnych danych wejściowych się kończy (nawet przy założeniu, że stale jesteśmy w stanie zweryfikować poprawność danych wejściowych).
Są jednak takie języki w których np. da się udzielić odpowiedzi na drugie pytanie. Do takich języków należą np. pewne z odmian rachunku lambda takie jak System F.
Podejście formalne
Niech
oznacza wektor danych wejściowych algorytmu
, w niech będzie wektorem wynikowym
. Przebieg algorytmu
dla dowolnych (w granicy zakładanej poprawności) danych jest jednoznacznie wyznaczony przez ciąg przekształceń:

gdzie
są danymi przejściowymi.
W praktyce trzeba wykazać, że ciąg przekształceń jest stale skończony, oraz wektor w zawiera poprawne dane. Najczęściej stosowaną techniką jest Indukcja matematyczna, z zastosowaniem niezmienników pętli.
Przykład
Poprawność algorytmu Euklidesa da się dowieść, pokazując, że zdanie:

jest niezmiennikiem pętli algorytmu NWD.
Gdyż
wartość drugiego argumentu spada po każdej iteracji, więc algorytm stale zakończy działanie.
Z niezmiennika pętli wynika:


A więc, po ostatnim przebiegu pętli algorytm NWD zwróci wartość NWD(a,b).
Sprawdź też