Formális módszerek a programozásban Szlávi Péter ELTE Informatika Kar szlavip@elte.hu http://izzo.inf.elte.hu/~szlavi 2003 2003.
Formális módszerek a programozásban Tartalom 1. Stukturált programok 2. Programhelyesség 3. Típushelyesség 2018.12.31. Formális módszerek a programozásban 2003.
1. Strukturált programok Formális módszerek a programozásban 1. Strukturált programok Alapirodalom: Varga L. – Programok analízise és szintézise Strukturált programszerkezetek: blokk-szekvencia (begin f; g end = B(f,g)) elágazás (if p then f else g = ITE(p;f,g)) ciklus (while p do f = WD(p;f)) Program (vezérlő-) gráf: csomópontok függvény-csomópont predikátum-csomópont gyűjtő csomópont irányított élek f/g „üres” prog-ram is lehet vagy 2018.12.31. Formális módszerek a programozásban 2003.
1. Strukturált programok (folytatás) Formális módszerek a programozásban 1. Strukturált programok (folytatás) Valódi program, amely gráfja teljesíti: 1. Egy bemenő- és egy kimenő él 2. Csomópontjai: predikátum-/függvény-/gyűjtő csomópont 3. Minden csomóponton át vezet út a bemenő élből a kimenő élbe. Egy rossz példa: Továbbiakban program alatt valódi programot értünk. * a kékkel jelölteken át nem vezet út a kimenőélhez 2018.12.31. Formális módszerek a programozásban 2003.
1. Strukturált programok (folytatás) Formális módszerek a programozásban 1. Strukturált programok (folytatás) Elemi programgráfok (strukturált programszerkezetek gráfjai): f g f p * g p f 2018.12.31. Formális módszerek a programozásban 2003.
1. Strukturált programok (folytatás) Formális módszerek a programozásban 1. Strukturált programok (folytatás) A vezérlőgráf lebontása: a gráfban előforduló elemi programgráfok helyettesítése függvény-csomóponttal 2018.12.31. Formális módszerek a programozásban 2003.
1. Strukturált programok (folytatás) Formális módszerek a programozásban 1. Strukturált programok (folytatás) 2018.12.31. Formális módszerek a programozásban 2003.
1. Strukturált programok (folytatás) Formális módszerek a programozásban 1. Strukturált programok (folytatás) 2018.12.31. Formális módszerek a programozásban 2003.
1. Strukturált programok (folytatás) Formális módszerek a programozásban 1. Strukturált programok (folytatás) Strukturált program: az a program, amely gráfja lebontható egyetlen függvény-csomóponttá. Egy példa. 2018.12.31. Formális módszerek a programozásban 2003.
1. Strukturált programok Formális módszerek a programozásban 1. Strukturált programok Lemma: Ha egy (valódi) program gráfjának élei száma: e, pred./függv./gyűjtő csomópontjainak száma: //, akkor teljesülnek: e = 3++1, ill. = Biz.: megszámolni az egyes bemenő és kimenő éleket: be = ++2, ki = +2+. Nyilvánvaló: e = be+1 = ki+1. Ebből már következik az állítás. Jelölések: P programgráfhoz: e(P)/ (P)/(P)/ (P):=... 2018.12.31. Formális módszerek a programozásban 2003.
1. Strukturált programok (folytatás) Formális módszerek a programozásban 1. Strukturált programok (folytatás) Böhm-Jacopini tétele (a strukturált programozás alaptétele): Bármely valódi programhoz meg lehet konstruálni a vele ekvivalens strukturált programot. Biz.: f-hez megkonstruáljuk a vele ekvivalens strukturál-tat… … f-t esetleg ekvivalensen transzformálva felbontjuk valahány valódi (rész)programra: f B(g,h)/ITE(p;g,h)/WD(p;g) ahol g, h éleinek száma kevesebb f éleinek számánál. 2018.12.31. Formális módszerek a programozásban 2003.
1. Strukturált programok (folytatás) Formális módszerek a programozásban 1. Strukturált programok (folytatás) Tfh: e(f)>2 azaz legalább 2 csomópontja van (ahol e(x):= x programgráf éleinek száma) 1. eset: f=B(g,h) ekkor h valódi program és e(h)=e(f)-1. Vizsgálandó: h. 2. eset: f=ITE(g,h) ahol g, h valódi programok és (g)<(f), (g)(f) és a lemmából: e(g)=(g)+3(g)+1<(f)+3(f)+1=e(f) ... h-ra hasonlóan. Továbbvizsgálandó: h és g. g h p g p h 2018.12.31. Formális módszerek a programozásban 2003.
1. Strukturált programok (folytatás) Formális módszerek a programozásban 1. Strukturált programok (folytatás) 3. eset: Mivel 2 kimenő él jön ki az f’-ből, ezért biztosan van legalább egy predikátum csomópont az f’-ben. 3 al-eset a gyűjtőpontot követő csomópont fajtája szerint: 3a) 3b) 3c) f’ Cél a 3c) esethez eljutni Lehetséges az is, hogy a c) eset már egy strukturált alapforma, amelyben a p predikátum pont egyik ága már egy „üres” kimenő él. Ekkor más készen is vagyunk. p 2018.12.31. Formális módszerek a programozásban 2003.
1. Strukturált programok (folytatás) Formális módszerek a programozásban 1. Strukturált programok (folytatás) 3a) 3b) 3c) f” f” f” p g h Ki Az élszám csökkenésének belátáshoz lásd a következő példát! p f” 2018.12.31. Formális módszerek a programozásban 2003.
1. Strukturált programok (folytatás) Formális módszerek a programozásban 1. Strukturált programok (folytatás) Az világos, hogy az ITE(p;g,h) áthelyezésével és duplázásával szabályos szerkezetté alakítható: B(ITE(p;g,h);WD(Ki; ITE(p;g,h))) p g h Ki p g h Persze be kell látni, hogy a transzformációk során a to-vábbelemzendő struktúrák (g,h) „egyedi” élszáma (a so-rozatos transzformáció után) kisebb. Ki p g h 2018.12.31. Formális módszerek a programozásban 2003.
1. Strukturált programok (folytatás) Formális módszerek a programozásban 1. Strukturált programok (folytatás) Egy érdekes eset: (f)=1, (f)=3, (f)=3 e=1+3*3+1=11 f p r q g (f’)=6, (f’)=4, (f’)=4 f’ g h (g)=3, (g)=1, (g)=1 e=3+3*1+1=7 (h)=3, (h)=1, (h)=1 p q g Ki:= Ki r Ki:= 2018.12.31. Formális módszerek a programozásban 2003.
1. Strukturált programok (folytatás) Formális módszerek a programozásban 1. Strukturált programok (folytatás) Példa a strukturálttá alakításra: Ez nem strukturált. 2018.12.31. Formális módszerek a programozásban 2003.
1. Strukturált programok (folytatás) Formális módszerek a programozásban 1. Strukturált programok (folytatás) Bontsuk le! 2018.12.31. Formális módszerek a programozásban 2003.
1. Strukturált programok (folytatás) Formális módszerek a programozásban 1. Strukturált programok (folytatás) 2018.12.31. Formális módszerek a programozásban 2003.
1. Strukturált programok (folytatás) Formális módszerek a programozásban 1. Strukturált programok (folytatás) A lebontás nem folytatható! 2018.12.31. Formális módszerek a programozásban 2003.
1. Strukturált programok (folytatás) Formális módszerek a programozásban 1. Strukturált programok (folytatás) 3c) eset: ? 2018.12.31. Formális módszerek a programozásban 2003.
1. Strukturált programok (folytatás) Formális módszerek a programozásban 1. Strukturált programok (folytatás) ? 2018.12.31. Formális módszerek a programozásban 2003.
1. Strukturált programok (folytatás) Formális módszerek a programozásban 1. Strukturált programok (folytatás) ? 2018.12.31. Formális módszerek a programozásban 2003.
1. Strukturált programok (folytatás) Formális módszerek a programozásban 1. Strukturált programok (folytatás) ? Ki:= Ki:= Ki:= 2018.12.31. Formális módszerek a programozásban 2003.
1. Strukturált programok (folytatás) Formális módszerek a programozásban 1. Strukturált programok (folytatás) ? Ki:= Ki ? Ki:= Ki:= A -rész lebontható, a ?-rész transzformálandó. 2018.12.31. Formális módszerek a programozásban 2003.
1. Strukturált programok (folytatás) Formális módszerek a programozásban 1. Strukturált programok (folytatás) A ?-rész transzformálandó: 2. eset: Ki:= Ki ? Ki:= Ki:= 2018.12.31. Formális módszerek a programozásban 2003.
1. Strukturált programok (folytatás) Formális módszerek a programozásban 1. Strukturált programok (folytatás) Ki:= Ki Ki:= Ki:= Ki:= 2018.12.31. Formális módszerek a programozásban 2003.
1. Strukturált programok (folytatás) Formális módszerek a programozásban 1. Strukturált programok (folytatás) Ki:= Ki Ki:= Ki:= Ki:= 2018.12.31. Formális módszerek a programozásban 2003.
Formális módszerek a programozásban 2. Helyességbizonyítás Alapirodalom: Varga L. – Programok analízise és szintézise Kozma, Varga – Adattípusok osztálya (Feladat- és program-) specifikáció: Bemeneti adatok – halmazok Előfeltétel – predikátum Kimeneti adatok – halmazok Utófeltétel – predikátum P/P-specifikáció (-: EfUf-specifikáció :-) 2018.12.31. Formális módszerek a programozásban 2003.
2. Helyességbizonyítás (folytatás) Formális módszerek a programozásban 2. Helyességbizonyítás (folytatás) Helyességbizonyítás Hoare deduktív módszerével: A P program parciálisan helyes, ha bizonyítható (le-vezethető) az Állítás: {p(x)} P {q(x,y)} x a P input-, y output-paraméterei azaz levezetni: ha p igaz P előtt, akkor q igaz P után, feltéve, hogy a P terminál („legálisan” megáll). Nem foglalkozunk típus-sértési hibákkal (típushalmazok véges-ségével). Csak a program logikáját vizsgáljuk. 2018.12.31. Formális módszerek a programozásban 2003.
2. Helyességbizonyítás (folytatás) Formális módszerek a programozásban 2. Helyességbizonyítás (folytatás) A bizonyításhoz egy axiómát és bizonyos levezetési szabályokat lehet fölhasználni. Értékadás-axióma: {p(x,g(x,y))} y:=g(x,y) {p(x,y)} Levezetési szabályok alakja: 1,…,N ———— olvasd: „az 1,…, N-ből levezethető” (i – feltétel, – következmény) 2018.12.31. Formális módszerek a programozásban 2003.
2. Helyességbizonyítás (folytatás) Formális módszerek a programozásban 2. Helyességbizonyítás (folytatás) Feltételes szabály: {pt} P1 {q} , {pt} P2 {q} ————————————— {p} if t then P1 else P2 {q} Ciklus-szabály: {pt} P {p} —————————— {p} while t do P {pt} 2018.12.31. Formális módszerek a programozásban 2003.
2. Helyességbizonyítás (folytatás) Formális módszerek a programozásban 2. Helyességbizonyítás (folytatás) Kompozíciós szabály: {p} P1 {q} , {q} P2 {r} —————————— {p} P1; P2 {r} Következmény-szabályok: {p} {q} , {q} P {r} {p} P {q} , {q} {r} ————————— ————————— {p} P {r} {p} P {r} Az értékadás-szabály az első következmény-szabály és az értékadási axióma alkalmazásával nyerhető. Értékadás-szabály: {p(x,y)} {q(x, g(x,y) )} ——————————— {p(x,y)} y:=g(x,y) {q(x,y)} 2018.12.31. Formális módszerek a programozásban 2003.
2. Helyességbizonyítás (folytatás) Formális módszerek a programozásban 2. Helyességbizonyítás (folytatás) Példa az ‘Eldöntés-tétel’ parciális helyességének bizonyítása Hoare módszerével: {(X,N)} 1 i:=1 2 Ciklus amíg iN és nem T(X(i)) 3 i:+1 4 Ciklus vége 5 Van:=iN {(X,N,Van)} Ef: Igaz Uf: Van º $jÎ[1,N] : T(xj) 2018.12.31. Formális módszerek a programozásban 2003.
2. Helyességbizonyítás (folytatás) Formális módszerek a programozásban 2. Helyességbizonyítás (folytatás) 1 i:=1 Legyen R(X,N,i) : iÎ[1,N+1] jÎ[1,i) : T(xj) 1. lemma: (X,N) R(X,N,1) Biz.: R(X,N,1)=1Î[1,N+1] jÎ[1,1): T(xj)Igaz Igaz Igaz Értékadás-szabály 1-re és 1. lemma {(X,N)} i:=1 {R(X,N,i)} 2018.12.31. Formális módszerek a programozásban 2003.
2. Helyességbizonyítás (folytatás) Formális módszerek a programozásban 2. Helyességbizonyítás (folytatás) 3 i:+1 Ciklusfeltétel 2. lemma: R(X,N,i) iN T(xi) R(X,N,i+1) Biz.: (iÎ[1,N+1] jÎ[1,i) : T(xj)) iN T(xi) (iÎ[1,N+1] jÎ[1,i+1) : T(xj)) iN R(X,N,i+1) Értékadás-szabály 3-ra és 2. lemma i+1N+1 {R(X,N,i) iN T(xi)} i:+1 {R(X,N,i)} (azaz R ciklusinvariáns) 2018.12.31. Formális módszerek a programozásban 2003.
2. Helyességbizonyítás (folytatás) Formális módszerek a programozásban 2. Helyességbizonyítás (folytatás) 2 Ciklus … 3 i:+1 4 Ciklus vége Ciklus-szabály 2..4-re {R(X,N,i)} Ciklus amíg iN és nem T(X(i)) i:+1 Ciklus vége {R(X,N,i) ((iN) T(xi))} Kihagytam, mert feleslegesnek tűnik: i 1-től egyesével növekszik, ezért q:=(iN) r:=(i=N+1), így a 2. következmény-szabály miatt az {R(X,N,i) ((iN) T(xi))} helyett írható {R(X,N,i) (i=N+1 T(xi))} 2018.12.31. Formális módszerek a programozásban 2003.
2. Helyességbizonyítás (folytatás) Formális módszerek a programozásban 2. Helyességbizonyítás (folytatás) 1 i:=1 2 Ciklus … 3 i:+1 4 Ciklus vége Kompozíciós szabály 1+2..4-re {(X,N)} i:=1 Ciklus amíg iN és nem T(X(i)) i:+1 Ciklus vége {R(X,N,i) (i>N T(xi))} 2018.12.31. Formális módszerek a programozásban 2003.
2. Helyességbizonyítás (folytatás) Formális módszerek a programozásban 2. Helyességbizonyítás (folytatás) 5 Van:=… 3. lemma: R(X,N,i) (i>N T(xi)) ($jÎ[1,N] : T(xj)) iN Biz.: Jelöljük * A-val az R(X,N,i) (i>N T(xi)) * B-vel a j[1,N] : T(xj) * C-vel az i≤N Bizonyítandó: A (BC) Bizonyítani kell 1. A (BC) 2. A (CB) R(X,N,i) (i>N T(xi)) (-kommutivitássorrendcsere és disztributivitás) (R(X,N,i) T(xj)) (R(X,N,i) i>N) (R-kifejtése) (iÎ[1,N+1] jÎ[1,i) : T(xj) T(xi)) (iÎ[1,N+1] jÎ[1,i) : T(xj) i>N) (a 2. tag átrendezése) 2018.12.31. Formális módszerek a programozásban 2003.
2. Helyességbizonyítás (folytatás) Formális módszerek a programozásban 2. Helyességbizonyítás (folytatás) A (BC) A: (R(X,N,i) i>N) (R(X,N,i) T(xi)) B C B C 2. A (CB) A: (R(X,N,i) i>N) (R(X,N,i) T(xi)) C B C B Az 1. első sorában alkalmaztuk a disztributivitást. Az 1. második sorában R definíciójára, valamint arra a tényre építünk, hogy ha a sorozat i. eleme valamilyen, akkor az a sorozat létező (tehát legfeljebb N.) eleme. Az 1. harmadik sora az implikáció másik alakját használtuk. Ui. B C (BC)B (BB)(CB) CB BC -------------- A 2. első sora ugyanúgy mint 1.-nél. A 2. második sorában nyilvánvaló implikációkat alkalmazunk: XY Y. A 2. harmadik sora az 1. harmadik soránál alkalmazottal azonos gondolatmenettel készült. 2018.12.31. Formális módszerek a programozásban 2003.
2. Helyességbizonyítás (folytatás) Formális módszerek a programozásban 2. Helyességbizonyítás (folytatás) 5 Van:=… Értékadás-szabály 5-re és 3. lemma {R(X,N,i) (i>N T(xi))} Van:=iN {($jÎ[1,N] : T(xj)) Van} 2018.12.31. Formális módszerek a programozásban 2003.
2. Helyességbizonyítás (folytatás) Formális módszerek a programozásban 2. Helyességbizonyítás (folytatás) 1 i:=1 2 Ciklus … 3 i:+1 4 Ciklus vége 5 Van:=… Kompozíciós szabály 1..4+5-re {(X,N)} i:=1 Ciklus amíg iN és nem T(X(i)) i:+1 Ciklus vége Van:=iN {($jÎ[1,N] : T(xj)) Van} º {(X,N,Van)} (az ekvivalencia szimmetriája) 2018.12.31. Formális módszerek a programozásban 2003.
2. Helyességbizonyítás (folytatás) Formális módszerek a programozásban 2. Helyességbizonyítás (folytatás) A teljes helyességről: A P program totálisan helyes, ha parciálisan helyes és bizonyítható, hogy terminál. A terminálás bizonyításáról: Csak az iterációkban kell. „Technika”: egy E(x,y)[0,M] (M>0) függvény defi-niálása, ahol x az input-, y az output-adatok; bizonyítani kell, hogy cI(x,y) E(x,y)[0,M] {cI(x,y) cF(x,y) E(x,y)=e0} CM {e0>E(x,y)}. cI: ciklusinvariáns; cF: ciklusfeltétel; CM: ciklusmag Szokás szerint a PCM utáni E-beli y a kilépéskori y-érték. 2018.12.31. Formális módszerek a programozásban 2003.
2. Helyességbizonyítás (folytatás) Formális módszerek a programozásban 2. Helyességbizonyítás (folytatás) Példa az ‘Eldöntés-tétel’ totális helyességének bi-zonyítása Hoare módszerére és az előbbi-ekre építve: {R(X,N,1)} 2 Ciklus amíg iN és nem T(X(i)) 3 i:+1 4 Ciklus vége R(X,N,i) – a konkrét ciklusinvariáns i[1,N+1] j[1,i) : T(xj) E:NN[0,N], E(N,i):= N–i+1 2018.12.31. Formális módszerek a programozásban 2003.
2. Helyességbizonyítás (folytatás) Formális módszerek a programozásban 2. Helyességbizonyítás (folytatás) cI(x,y) E(x,y)[0,M] azaz konkrétan: R(X,N,i) E(N,i)[0,N] Biz.: R(X,N,i)= i[1,N+1] j[1,i) : T(xj) E(N,i)=N–i+1[0,N] 2018.12.31. Formális módszerek a programozásban 2003.
2. Helyességbizonyítás (folytatás) Formális módszerek a programozásban 2. Helyességbizonyítás (folytatás) 2. {cI(x,y) cF(x,y) E(x,y)=e0} CM {e0>E(x,y)} azaz konkrétan: {R(X,N,i) iN T(xi) E(N,i)=e0} i:+1 {e0>E(N,i)} 2018.12.31. Formális módszerek a programozásban 2003.
2. Helyességbizonyítás (folytatás) Formális módszerek a programozásban 2. Helyességbizonyítás (folytatás) 2. állítás bizonyításához segítségül egy Lemma: R(X,N,i) iN T(xi) E(N,i)=e0 e0>E(N,i+1) Biz.: (a) E(N,i)=e0 (b) E-def E(N,i+1)=E(N,i)–1 (a&b) E(N,i+1)=e0–1 2018.12.31. Formális módszerek a programozásban 2003.
2. Helyességbizonyítás (folytatás) Formális módszerek a programozásban 2. Helyességbizonyítás (folytatás) 2. állítás bizonyítása: Értékadás-szabály és a lemma {R(X,N,i) iN T(xi) E(N,i)=e0} i:+1 {e0>E(N,i)} 2018.12.31. Formális módszerek a programozásban 2003.
Formális módszerek a programozásban 3. Típushelyesség Alapirodalom: Kozma, Varga – Adattípusok osztálya Szlávi – Gondolatok a típus-specifikációk kompa-tibilitásának vizsgálatáról (lógia Szilánkok 11) Típus: Értékhalmaz Operációk Típusspecifikációk: Algebrai P/P 2018.12.31. Formális módszerek a programozásban 2003.
3. Típushelyesség (folytatás) Formális módszerek a programozásban 3. Típushelyesség (folytatás) Cél: belássuk a kétféle specifikáció nem mond ellent egymásnak. Feltételezések: Ugyanarra a típusra vonatkoznak. Az algebrai leírás helyes (teljes, ellentmon-dásmentes). A P/P-rendszer teljes. Módszer: egyetlen logikai rendszerbe egyesí-teni, majd az ellentmondásmentességet bizo-nyítani. A P/P-rendszer algoritmikus helyessége az előzőekben tárgyalt módon vizsgálható. Ezért nem foglalkozunk itt vele. 2018.12.31. Formális módszerek a programozásban 2003.
3. Típushelyesség (folytatás) Formális módszerek a programozásban 3. Típushelyesség (folytatás) Az egyesített rendszerről: Minden állítás az alábbi alakú – állításNév(paraméterminta) ha paraméterPredikátum. Értelmezés: ha a predikátum teljesül a benne szereplő pa-raméterek beillesztése után, akkor a paramé-terminta ‘állításNév’ nevű relációja teljesül. 2018.12.31. Formális módszerek a programozásban 2003.
3. Típushelyesség (folytatás) Formális módszerek a programozásban 3. Típushelyesség (folytatás) 1. példa: kocka(idom(a,b,c)) ha a=b b=c. 2. példa: prím(n) ha n=2 n=3 (n Mod 2)<>0 oszthatóIg(n,n Div 2). oszthatóIg(n,ig) ha (n Mod ig)=0 oszthatóIg(n,ig-1). 2018.12.31. Formális módszerek a programozásban 2003.
3. Típushelyesség (folytatás) Formális módszerek a programozásban 3. Típushelyesség (folytatás) Az algebrai specifikáció axiómái is ilyen állítá-sokká átírahatók. 3. példa: axióma: állítás: Veremből – axióma: Veremből(Verembe(v,e))=(v,e) … VerembőlAxióma(v,igaz) ha Verembe(v,e,újv) Veremből(újv,e,v) … . … Bemeneti verem Kimeneti verem Bemeneti verem Kimeneti verem 2018.12.31. Formális módszerek a programozásban 2003.
3. Típushelyesség (folytatás) Formális módszerek a programozásban 3. Típushelyesség (folytatás) A P/P-specifikációknak is ilyen állítások felel-nek meg: 4. példa: P/P: állítás: Példamagyarázat: 1. A verem az elemsorozat és a definiáltság kettőse. 2. A P/P-beli „hiba-állapotot” a definiáltsággal jelöl- jük. (v.hiba verem(v,def)) 3. „[e|v]”=a sorozat első eleme az e, „farka” a v. Ef: v.hiba Uf: v.sorozat=(v1,...,vn) v'.sorozat=(v1,...,vn,e) verembe(verem(v,def),e,verem([e|v],def)). 2018.12.31. Formális módszerek a programozásban 2003.
3. Típushelyesség (folytatás) Formális módszerek a programozásban 3. Típushelyesség (folytatás) A teljesség ígérete nélkül néhány átírási sza-bály: Axióma: Ax(TSk,IVN) ha … az axióma „kódja” … . Az axióma nem teljesülése esetére (Prolog alapú ellenőrzés esetén): Ax(_,hamis). A „típusú” struktúra. Logikai érték: az axióma teljesül-e? Egy logikai programozási nyelv… Tetszőleges egyéb para-méterre: az axióma hamis. 2018.12.31. Formális módszerek a programozásban 2003.
3. Típushelyesség (folytatás) Formális módszerek a programozásban 3. Típushelyesség (folytatás) P/P-függvény: Op(struktura(ST,def),…,…). P/P-eljárás: Op(struktura(STi,def),…, struktura(STo,def),…). A „típusú” input struktúra, definiált állapotban. Egyéb input paraméter. A függvény értéke: output paraméter Output struktúra, „legá-lis” működés esetén. Egyéb output paraméter. 2018.12.31. Formális módszerek a programozásban 2003.
3. Típushelyesség (folytatás) Formális módszerek a programozásban 3. Típushelyesség (folytatás) Egy „komplettebb” példa: Eljárás Üres(Vált. v:Verem) Ef: Igaz Uf: v=((),Hamis) Függvény Üres?(Kons. v:Verem):Logikai Ef: v.hiba Uf: Üres?(v)=(v.sorozat=()) Függvény Tető(Vált. v:Verem):TElem Ef: v.hiba Uf: v.sorozat=(v1,...,vn) Tető(v)=vn v.sorozat=() v'.hiba=Igaz üres(verem([],def)). üresE(verem(_,nemDef),_). /*ImpErrAx*/ üresE(verem([],def),igaz). üresE(verem([_],def),hamis). tető(verem(V,nemDef),_, verem(V,nemDef)). /*ImpErrAx*/ tető(verem([E|V],def),E, verem([E|V],def)). tető(verem([],def),_, verem([],nemDef)). /*PP:Err*/ 2018.12.31. Formális módszerek a programozásban 2003.
3. Típushelyesség (folytatás) Formális módszerek a programozásban 3. Típushelyesség (folytatás) (folytatás:) Eljárás Verembe(Vált. v:Verem, Kons. e:TElem) Ef: v.hiba Uf: v.sorozat=(v1,...,vn) v'.sorozat=(v1,...,vn,e) Eljárás Veremből(Vált. v:Verem, e:TElem) Ef: v.hiba Uf: v.sorozat=(v1,...,vn) v'.sorozat=(v1,...,vn-1) e=vn v=() v'.hiba=Igaz verembe(verem(V,nemDef),_, verem(V,nemDef)). /*ImpErrAx*/ verembe(verem(V,def),E, verem([E|V],def)). veremből(verem(V,nemDef),_, verem(V,nemDef)). /*ImpErrAx*/ veremből(verem([E|V],def), E,verem(V,def)). veremből(verem([],def),_, verem(_,nemDef)). /*PP:Err*/ 2018.12.31. Formális módszerek a programozásban 2003.
3. Típushelyesség (folytatás) Formális módszerek a programozásban 3. Típushelyesség (folytatás) (folytatás:) 1o Üres – axióma v=Üres Üres?(v) 2o Üres? – axióma Üres?(Verembe(v,e)) 3o Tető–Verembe – axióma Tető(Verembe(v,e))=e 3’o Tető – hiba-axióma Üres?(v) Tető(v)=NemDef axioma1(V,igaz) ha ures(V) uresE(V,igaz) ures(V) uresE(V,igaz). axioma2(V,igaz) ha verembe(V,_,verem(W,def)) üresE(verem(W,def),hamis). axioma2(_,hamis). axioma3(V,igaz)ha verembe(V,E,W) tető(W,E,W). axioma3(_,hamis). axioma3H(verem(_,def),igaz) ha üresE(verem(_,def),igaz) tető(verem(_,def),_, verem(_,nemDef) üresE(_,hamis). axioma3H(_,hamis). 2018.12.31. Formális módszerek a programozásban 2003.
3. Típushelyesség (folytatás) Formális módszerek a programozásban 3. Típushelyesség (folytatás) (folytatás:) 4o Veremből – axióma Veremből(Verembe(v,e))=(v,e) Üres?(v) Verembe(Veremből(v))=v 4’o Veremből – hiba-axióma Üres?(v) Veremből(v)=NemDef axioma4(V,igaz) ha verembe(V,E,W) veremből(W,E,V) uresE(V,hamis) veremből(V,E,W) verembe(W,E,V) uresE(V,igaz). axioma4(_,hamis). axioma4H(verem(_,def),igaz) ha üresE(verem(_,def),igaz) veremből(verem(_,def),_, verem(_,nemDef) üresE(_,hamis). axioma4H(_,hamis). 2018.12.31. Formális módszerek a programozásban 2003.
3. Típushelyesség (folytatás) Formális módszerek a programozásban 3. Típushelyesség (folytatás) (folytatás:) Végezetül a logikai rendszer ellentmondás mentességét be kell látni üres és nem üres veremre úgy, hogy minden axióma teljesülését ellenőrizzük rájuk: Állítás: A rendszer ellentmondásmentes, akkor JoE01 , JoE1 … értékek igaz értékűek. Állítás: Az előbbi állítás nem megfordítható. /*(üres,def)-re igaz-e:*/ V01=verem([],def) axioma1(V01,JoE01) /*(nem üres,def)-re igaz-e:*/ V1=verem([_],def) axioma1(V1,JoE1) … 2018.12.31. Formális módszerek a programozásban 2003.