Dokažimo sada da pomenuti uslovi zaista jesu korisne invarijante petlji. Ono što treba da dokažemo je da nakon svakog prolaska kroz odgovarajuću petlju važi dati uslov, kao i da nas ovi uslovi vode ka ostvarivanju željenog pauslova.
Dokaz invarijante unutrašnje petlje
Dokažimo najpre da je uslov
{X[i] ≤ {X[i+1],X[i+2],...,X[j]}} (*)
invarijanta unutrašnje for petlje za proizvoljnu vrednost i, 0 ≤ i ≤ n-2, pri čemu je i brojač u spoljašnjoj for petlji a j brojač u unutrašnjoj for petlji.
Za j = i + 1, pošto je 0 ≤ i ≤ n-2 ispunjen je uslov ulaska u petlju tj. važi j ≤ n-1. Ako nije X[i] > X[j], onda važi X[i] ≤ X[j], a ako je X[i] > X[j] tada će biti izvršena razmena vrednosti i-tog i j-tog elementa niza. Dakle, nakon prvog prolaska kroz petlju važi da je
{X[i] ≤ {X[j]}}Pretpostavimo da uslov (*) važi za proizvoljnu vrednost j i dokažimo da važi i za j'=j+1, tj. da važi:
{X[i] ≤ {X[i+1],X[i+2],...,X[j+1]}}
Ukoliko je ispunjen uslov ulaska u petlju j' ≤ n-1 onda se ispituje da li važi X[i] > X[j'].
Ovim smo dokazali da za proizvoljnu vrednost i, 0 ≤ i ≤ n-2, nakon svakog prolaska kroz unutrašnju petlju važi uslov (*) tj. da je on invarijanta unutrašnje petlje.
Dokaz invarijante spoljašnje petlje
Dokažimo sada da je uslov
{X[0] ≤ X[1] ≤ ... ≤ X[i], {X[0],X[1],...,X[i]}≤{X[i+1],X[i+2],...,X[n-1]}}
invarijanta spoljašnje for petlje.Dokažimo ujedno i parcijalnu korektnost programa.
Dokaz se sastoji iz tri koraka:
1. Uspostavljanje invarijante: Iz preduslova važi da je n ≥ 0. U slučaju da je n = 0 ili n = 1, to znači da je u pitanju prazan niz ili niz od jednog elementa pa je takav niz već sortiran i pauslov je ispunjen. U slučaju da je n ≥ 2, odnosno da se niz sastoji od bar dva elementa, važi:
Nakon prvog prolaska kroz spoljašnju petlju, za i = 0, kako nakon svakog prolaska kroz unutrašnju petlju važi prethodno dokazana invarijanta unutrašnje petlje
{X[i] ≤ {X[i+1],X[i+2],...,X[j]}}
to ona važi i nakon posledjeg prolaska kroz unutrašnju petlju kada je j = n - 1
{X[0] ≤ {X[1],X[2],...,X[n-1]}},odakle sledi da važi i
{X[0] ≤ X[1] ≤ ... ≤ X[i], {X[0],X[1],...,X[i]}≤{X[i+1],X[i+2],...,X[n-1]}}
nakon prvog prolaska kroz spoljašnju petlju tj. za i = 0.
2. Održavanje invarijante: Pretpostavimo da navedena relacija važi za proizvoljnu vrednost i, 0 ≤ i ≤ n-2 i dokažimo da važi za i' pri čemu je i' = i + 1.
Za i' ≤ n-2, nakon poslednjeg prolaska kroz unutrašnju petlju važiće njena invarijanta za j = n-1, tj. važiće uslov:
{X[i'] ≤ {X[i'+1],X[i'+2],...,X[n-1]}}Kako važi
{X[i] ≤ {X[i+1],X[i+2],...,X[n-1]}}
to jest
{X[i] ≤ {X[i'],X[i'+1],...,X[n-1]}}
i kako je
{X[0],X[1],...,X[i]}≤{X[i+1],X[i+2],...,X[n-1]}sledi
{X[0],X[1],...,X[i],X[i']}≤{X[i'+1],X[i'+2],...,X[n-1]}}.
Takođe, kako je
X[0] ≤ X[1] ≤ ... ≤ X[i]
i
{X[i] ≤ {X[i'],X[i'+1],...,X[n-1]}} odakle sledi X[i] ≤ X[i']važi
X[0] ≤ X[1] ≤ ... ≤ X[i] ≤ X[i']to jest
{X[0] ≤ X[1] ≤ ... ≤ X[i'], {X[0],X[1],...,X[i']}≤{X[i'+1],X[i'+2],...,X[n-1]}}čime je dokazano da je to invarijanta spoljašnje for petlje.
3. Ostvarivanje željenog pauslova: Nakon izlaska iz spoljašnje for petlje za i = n - 2, izlazi se iz programa i važi
{X[0] ≤ X[1] ≤ ... ≤ X[n-2], {X[0],X[1],...,X[n-2]}≤{X[n-1]}}to jest
{X[0] ≤ X[1] ≤ ... ≤ X[n-2] ≤ X[n-1]}
što je pauslov programa, čime smo dokazali parcijalnu korektnost programa.
Naredna: Dokaz zaustavljanja programa Gore: Selection sort Prethodna: Invarijanta petlje Sadržaj