· A kódolás minél mechanikusabbá tétele.
· Csak a nyelv meghatározta dolgokra koncentrálás. Gondoljunk a ’Be:… [..]’ szerkezetre, amelyet egészen más hozzáállással kell kódolni pl. Turbo Pascal-ban, mint a Delphi-ben.
· „Csak” a felhasználóval való zavartalan kommunikáció megszervezése.
Megjegyzés: a programok
legtöbbjénél ez viszi el a kód 95%-át (bár nem biztos, hogy a kódolási idő
95%-át). Tehát nem arról van szó, hogy bagatellizálni kell e programozási
lépést, hanem csak azt, hogy a feladat lényegét nem a kódolás során kell
megoldani (hanem előbb).
·
A kódolási
szabályok az adott programozási nyelven nyugszanak, tehát egyediek.
[
Adatszerkezet Þ Alg.TipDef ]
Spec.Ef
Þ
Alg.Be Þ
Kód.Beolv
Spec.Uf
Þ
Alg.Végrehajt [Þ
Kód.Elj/Fv[1]] Þ
Kód.Végrehajt [Þ
Kód.Elj/Fv]
Spec.Def Þ Alg.Elj/Fv Þ
Kód.Elj/Fv
|
1. ábra. Specifikáció – Algoritmus – Kód. |
Specifikáció:
Be: NÎN, HallgatókÎ(Név´Szak´Évfolyam)*,
Név=S, Szak={Info, Mat, Fiz, …[2]}, Évfolyam=N
Ki: VaneÎL
Ef: Hossz(Hallgatók)=N
Ù
"iÎ[1..N]: Hallgatóki.Név¹’’ Ù Hallgatóki.ÉvfolyamÎ[1..5]
Uf: Vane = $iÎ[1..N]: Hallgatóki.Szak=Info Ù Hallgatóki.Évfolyam=1
Konstans MaxN:Egész(100)
Típus TNév=Szöveg
TSzak=(Info,
Mat, Fiz, …)
TÉvfolyam=Egész
THallgató:Rekord(
Név:TNév
Szak:TSzak
Évfolyam:TÉvfolyam)
THallgatók=Tömb(1..MaxN:THallgató)
Változó N:Egész
Hallgatók:THallgatók
Vane:Logikai
Spec.Ef Þ Alg.Be Þ Kód.Beolv
Be: N [0£N£MaxN] |
l. előbb |
Spec.Uf Þ Alg.Végrehajt Þ Kód.Végrehajt
… |
Figyeljük meg például a Kiválasztás tétel bizonyítását!
Specifikáció:
Be: NÎN
, XÎH*,
T:H®L
Ki: SorszÎN
Ef: Hossz(X)=N Ù $iÎ[1..N]: T(xi)
Uf: SorszÎ[1..N] Ù T(xSorsz)
Alg:
Konstans
MaxN:Egész(???)
Típus THk=Tömb(1..MaxN:TH)
Eljárás Kiválasztás(Konstans
N:Egész, X:THk
Változó Sorsz:Egész):
Változó
i:Egész
i:=1
Ciklus amíg nem T(X(i))
i:+1
Ciklus vége
Sorsz:=i
Eljárás vége.
A helyes program mint állapottér-transzformáció az Ef által behatárolt részállapotból indul ki, és utasításról utasításra haladva transzformálja az állapottér egyes komponenseit mindaddig, amíg az Uf által meghatározott végállapotba nem jut.
Kövessük tehát mi is utasításról utasításra az állapottér transzformált részállapot-halmazait! Vagyis adjuk meg a predikátumokat az egyes utasítások mögött kiindulva az Ef-ből. Ha eljutottunk az Uf-be, akkor a bizonyítás kész.
1. Egy feladat specifikációjában az Ef-t tetszőlegesen szűkíthetjük, a korábbi megoldás megoldás marad ezután is.
Például, Ef: … $iÎ[1..N
Div 2] : T(x2*i)
– azaz létezik páros indexű T-tulajdonságú
2. Az Ef-nek vajmi kevés közölni valója van a feladatról. Már csak azért is igaz ez a kijelentés, mert a tételek között soknak ugyanaz (pl. AZONOSAN IGAZ) az Ef-e.
A legtöbb támpontot a feladatról az Uf ad. Ebből kell tehát kiindulni, s követni visszafelé a „transzformáció-inverzének” a működését, amíg az Ef-hez el nem érünk.
A transzformáció utáni állapotból az utasítás előttire következtetni nem mindig könnyű, ezért segédállításokat (és rajtuk nyugvó következtetési szabályokat) kell találni.
Az elméleti részletek mellőzésével élvezzük a levezetés báját, lényegét.
Az algoritmus tevékenység részére kell figyelnünk csak. Megfelelő helyekre illesztünk be állításokat. Az állítások paraméterfüggését korlátozzuk a legjellegzetesebb adatra. Pl. az X tömbtől való függést, mint nyilvánvalót, nem jelöljük.
0. |
[f4] |
Uf(Sorsz): SorszÎ[1..N] Ù T(xSorsz) |
1. |
[f4] |
1.
állítás: ha Uf(Sorsz) igaz a ’Sorsz:=i’ után, akkor előtte
igaz kell legyen: Ui.: helyettesítsük
be i-t Uf-ben a Sorsz helyére! Mivel Uf(Sorsz) igaz, és a ’Sorsz:=i’
után épp i értékét örökli, így nyilvánvaló: Uf(i)=Igaz. Azaz helyes: |
2. |
[f4] |
f2(i): "jÎ[1..i-1]: ØT(xj) 2. állítás: ha f2
egyszer igaz, akkor a ciklus egyszeri végrehajtása után is igaz marad. Ui.: Kövessük a ciklus egyszeri
végrehajtását; hogy a ciklusmag végrehajtódjék, kell, hogy ØT(X(i))ºIgaz teljesüljön. Azaz f2(i)
ÙØT(xi)◄i:+1►f2(i-1) Ù ØT(xi-1)º 3.
állítás: f2(1) igaz,
azaz a 2. állítás feltétele tud teljesülni. Ui.: f2(1) º"jÎ[1..1-1]: ØT(xj)ºIgaz à 4.
állítás: Ef Ù f2(i) Ù Ø(ØT(xi)) Þ f1(i); itt a ’ØT(xi)’ a
ciklusfeltétel. Ui.: Ef Ù f2(i) Ù Ø(ØT(xi)) º Az
Ef-ből kihagytuk az ’N=Hossz(X)’ feltételrészt, ami a lényeget nem
befolyásolja. Következmény: f2 ún. invariáns állítás. (Ui.: 2.,3. és 4. állítás következménye.) |
3. |
[f4] |
f3(i): Ef Ù i=1 5.
állítás: ha Ef Ù i=1 Þ (f3(i)Þf2(i)). Ui.: Nyilvánvaló, hogy Ef Þ f3(1)ºIgaz |
4. |
[f4] |
f4: Ef 6. állítás: f4 választása helyes. Ui.: f4ºEf◄i:=1►Ef Ù i=1ºf3(i) à |
5. |
[Ef] |
|
Figyeljük meg, mi történik, ha az Ef nem teljesül a bemenő
adatra! Válasz: a ciklusból nincs (legális) „menekvés”! Vagyis, amit kaptunk
így fogalmazható meg: ha a program terminál (megáll,
eljut egy „legális” végállapotba), akkor az Uf-nek
megfelelő állapotban lesz.
Koncentráljunk mármost a legális megállásra! A megállásnak az a feltétele, hogy legyen olyan („absztrakt”) N-értékű függvény, amivel a még hátralévő ciklus lépések számát le tudjuk írni, s igaz rá, hogy a ciklus minden lépése során határozottan csökken.
[f4] |
Az f2-t, f3-at és f4-et nem részleteztük, cl a még hátralévő cikluslépések számát leíró függvény (F(N,N)). cl(i): K–i (ahol KÎN rögzített konstans) 7.
állítás: $jÎ[1..N]: T(xj) Þ Ui.: Legyen K: Ekkor "jÎ[1..K-1]: cl(j)>0 Ù cl(K)=0 à Tehát: f3(i): $jÎ[1..N]: T(xj) Ù i=1, röviden szólva: Ef Ù i=1 |
[f4] |
f4: $jÎ[1..N]:T(xj), azaz Ef Állítás: f4◄i:=1►f3(1) Ui.: nyilvánvaló. |
Be: NÎN , XÎH*,
T:H®L
Ki: DbÎN
Ef: Hossz(X)=N
Uf:
Def: :L®{0,1}
Alg:
Konstans MaxN:Egész(???)
Típus THk=Tömb(1..MaxN:TH)
Eljárás Megszamolás(Konstans
N:Egész, X:THk
Változó Db:Egész):
Változó
i:Egész
Db:=0
Ciklus i=1-től N-ig
Ha T(X(i)) akkor Db:+1
Ciklus vége
Eljárás vége.
Megjegyzések:
1. Az itt felvetődő „elemszámlálásos” ötlet és formalizmus sokszor felhasználandó! A továbbiakban nem definiáljuk a khi-függvényt.
2. Érdemes eltűnődni a tételnek és a sorozatszámítás tétel (S-s változatának) nagyfokú hasonlóságán.
Maximumkiválasztás(H*,F(HxH,L)):N [6] vagy Maximumkiválasztás(H*,F(HxH,L)):H[7]
Be: NÎN , XÎH*, £ÎF(HxH,L)
Ki: MaxiÎN
Ef: Hossz(X)=
Uf: MaxiÎ[1..N] Ù "iÎ[1..N] : xMaxi³xi
Alg:
Konstans MaxN:Egész(???)
Típus THk=Tömb(1..MaxN:TH)
Eljárás Maximumkiválasztás(Konstans
N:Egész, X:THk
Változó Maxi:Egész):
Változó
i:Egész
Maxi:=1
Ciklus i=2-től N-ig
Ha X(i)>X(Maxi) akkor
Maxi:=i
Ciklus vége
Eljárás vége.
Megjegyzések:
1. Az algoritmusbeli >-reláció a specifikációbeli £ „értelemszerű” algoritmikus párja.
2. Meggondolandó, milyen specifikációra „rimmelne” az az algoritmus, amelyben a > helyett ³-reláció szerepelne!
3. Specifikálja a maximumkiválasztás másik változatát is!
Kiválogatás(H*,F(H,L)):N* [8] vagy Kiválogatás (H*,H,F(H,L)):H*
[9]
Be: NÎN , XÎH*, T:H®L
Ki: DbÎN , YÎN*
Ef: Hossz(X)=N
Uf: Ù YÎ[1..N]Db Ù "iÎ[1..Db]: T(xyi) Ù HalmazFölsorolás(Y)
Alg:
Konstans MaxN:Egész(???)
Típus THk=Tömb(1..MaxN:TH)
TIndk=Tömb(1..MaxN:Egész)
Eljárás Kiválogatás(Konstans
N:Egész, X:THk
Változó Db:Egész, Y:TIndk):
Változó
i:Egész
Db:=0
Ciklus i:=1-től N-ig
Ha T(X(i)) akkor Db:+1;
Y(Db):=i
Ciklus vége
Eljárás vége.
ProgramozásMódszertan 3. előadás’2004 (vázlat)
1.2.
A Turbo Pascal kódolási szabályok
2. Specifikáció – Algoritmus – Kód
2.2.
Egy korábbi feladatpélda:
3. Mit jelent a tételbizonyítás
3.2.
Az „egyenes” bizonyítás lehetetlensége.
4. További egyszerűbb Programozási
tételek
[1] Ti. a finomítások eljárásai, függvényei.
[2] A „…” jelentése: itt egy felsorolás lenne, amit most nem folytatunk) formálisan persze kellene, mivel ki nem található)! Figyelem: így csak egy-szak rendelhető a hallgatóhoz! Nagy baj ez?
[3] A „p1◄u►p2” jelentése: „a p1–ből az u utasítás végrehajtása után igaz p2”.
[4] Általában is igaz, hogy „P(f(x))◄y:=f(x)►P(y)”. Ezt hívják Hoare rendszerében értékadási axiómának.
[5] Az ilyen függvényt nevezik variáns függvénynek.
[6] Maximális elem indexének kiválasztása.
[7] Maximális elem (értékének) kiválasztása.
[8] A T-tulajdonságúak indexeinek kiválogatása.
[9] A T-tulajdonságúak (értékeinek) kiválogatása. Uf: Db=… Ù YÎHN Ù "iÎ… Ù YÍX