Determinisztikus programok
Szintaxis: X : Pvalt program változók E : Kifkifejezések B : Lkiflogikai kifejezések C : Utsutasítások
Az Uts halmazt alkotó C utasítások absztrakt szintaxisa és elnevezései: skipüres utasítás X:=E(determinisztikus) értékadás (C 1 ;C 2 )kompozíció (B C 1 C 2 )feltételes utasítás (B C)ciklus utasítás
Ugyanez a szintaxis megadható B-N-formában is: utasítás ::= skip | program változó := kifejezés | utasítás ; utasítás | if logikai kif then utasítás else utasítás fi | while logikai kif do utasítás od
Operációs szemantika: X : Valt Pvalt változók d : D adatok s : S = Valt D állapotok (változótartalmak) : = (S Uts) S konfigurációk op : Uts P( ) operációs átmeneti reláció
Kifejezések interpretálása (szemantikája): I : Kif (S D) kifejezések szemantikája E = I(E) I : LKif P(S) logikai kifejezések szemantikája B = I(B)
A konfiguráció egyrészt megadja, hogy a változók milyen értékeket tartalmaznak, másrészt hol tart a végrehajtás, azaz milyen utasítást kell még végrehajtani. Az utasítások operációs szemantikája (op) az utasítás végrehajtása során megtehető (atomi) lépéseket definiálja: milyen konfigurációból milyen konfigurációkba juthatunk egyetlen lépés megtételével.
op(skip) = { s,skip , s : s S } op(X:=E) = { s, X:=E , s( X:=E(s) ) : s S } op(C 1 ;C 2 ) = { s´, (C´;C 2 ) , s´´, (C´´;C 2 ) : s´, C´ , s´´, C´´ op( C 1 ) } { s´, (C´;C 2 ) , s´´, C 2 : s´, C´ , s ´´ op( C 1 ) } op( C 2 )
op(B C 1 C 2 ) = { s, (B C 1 C 2 ) , s, C 1 : s B } { s, (B C 1 C 2 ) , s, C 2 : s ¬B } op( C 1 ) op( C 2 ) op(B C) = { s, (B C) , s,( C;(B C)) : s B } { s, (B C) ,s : s ¬B } { s´,( C ´; (B C)) , s´´,( C ´´ ;(B C)) : s´, C ´ , s´´, C ´´ op( C ) } { s´,( C ´; (B C)) , s´´, (B C) : s´, C ´ ,s´´ op( C ) }
Denotációs szemantika
Utasítások (denotációs) szemantikája egy ún. hatásreláció, amely azt adja meg, hogy az utasítás (végrehajtása) az egyes állapotokból (a változók végrehajtás előtti tartalma = bemenet) milyen állapotokat (a változók végrehajtás utáni tartalma = kimenet) állíthat elő. I : Uts P(S S)utasítások szemantikája I(C) = C = { s´,s´´ : s´,C ,s´´ op(C)* }
Tételek : skip = { s,s : s S } X:=E = { s,s(X:=E(s)) : s S } (C 1 ;C 2 ) = C 1 ° C 2 (B C 1 C 2 ) = ((B S) C 1 ) ((( ¬ B) S) C 2 ) (B C) = ((B S) C)* (S ( ¬ B)) = lkfp[ X.(( ¬ B) ( ¬ B)) (((B S) C)°X)]
Parciális helyesség
feltételek : p,q : Felt = P(S) feladatok : p,q : Fdt = Felt Felt parciális helyesség (függvény) : { p}C { q} : Felt Uts Felt {igaz, hamis} { p}C { q} = ((p S) C) (S q)
Floyd-Naur A parciális helyesség lépésenkénti bizonyítása
Lemma Ha p, p', q P(E) ( azaz E feletti unér relációk ), és r P(E E) ( azaz E feletti binér reláció ), akkor az alábbi állítások ekvivalensek: ((p p') r * ) (E q) i P(E). (p i) (((i E) r) (E i)) ((i p') q)
Átfogalmazás p, p', q P(E) tulajdonságok, r P(E E) E-n végrehajtható atomi műveletek halmaza, ((p p') r * ) (E q) átfogalmazása: Ha egy p tulajdonságú elemből véges sok (esetleg 0) atomi művelet alkalmazásával eljuthatok egy p' tulajdonságú elemhez, akkor ez az elem q tulajdonságú is lesz.
i P(E). (p i) (((i E) r) (E i)) ((i p') q) átfogalmazása: Létezik olyan i tulajdonság, amelyre teljesülnek a következők: minden p tulajdonságú elem i tulajdonságú. az i tulajdonság invariáns az r-beli műveletekkel szemben az i tulajdonságú elemek közül a p' tulajdonságúak q tulajdonságúak is.
C = { s´,s´´ : s´,C ,s´´ op(C)*} { p}C { q} = ((p S) C) (S q) A lemma alkalmazása a parciális helyesség esetére: E = p = p,C p' = S r = op(C) q = q { p}C { q} = ((p p') r * ) (E q) = = (( p,C S) op(C) * ) ( q)
{p}C{q} = i P( ).( p,C i) (((i ) op(C)) ( i)) ((i S) q), azaz {p}C{q} pontosan akkor igaz, ha a konfigurációk- nak létezik egy olyan i (globális invariáns) tulaj- donsága, amelyre igazak a következők: minden p tulajdonságú s állapot esetén s,C i tulajdonságú. az i tulajdonság invariáns az op(C)-beli atomi műveletekkel szemben az i tulajdonságú konfigurációk közül az S- beliek q tulajdonságúak.
Egy -n definiált i globális invariánsból az utasítások rögzítésével S-en értelmezett lokális invariánsok definiálhatók, és fordítva. A Floyd-Naur-módszer: definiáljuk a lokális invariánsokat állítsuk elő belőlük az i globális invariánst bizonyítsuk az i-re vonatkozó tulajdonságokat.
Hoare-logika : {p} skip {p} = igaz {{s S : s(X:=E(s)) q}} X:=E {q} = igaz {p} (C 1 ;C 2 ) {q} = = r Felt.({p} C 1 {r} {r} C 2 {q}) {p} (B C 1 C 2 ) {q} = = {p B} C 1 {q} {p ¬ B} C 2 {q} {p B} C {p} {p} (B C) {p ¬ B}{p}C{q} = ( p' Felt. q' Felt. (p p') {p'}C{q'} (q' q)) {p}(B*C){q} = i Felt. (p i) {i B}C{i} ((i B) q)
Hoare-féle kalkulus a parciális helyesség bizonyításához Induktív kifejezések : {P} C {Q}, ahol P, Q formulák, C utasítás. Axióma sémák : {P} skip {P}skip axióma {Q(X E)} X:=E {Q}értékadás axiómája
Levezetési szabályok : {P} C 1 {R}, {R} C 2 {Q}kompozíciós {P} (C 1 ;C 2 ) {Q}szabály {P B} C 1 {Q}, {P ¬B} C 2 {Q}feltételes {P} (B C 1 C 2 ) {Q}szabály {P B} C {P} ciklus (while) {P} (B C) {P ¬B}szabály P P´, {P´}C{Q´}, Q´ Q következmény {P} C {Q}szabály A while-szabályban a P-t ciklusinvariánsnak nevezzük.
Tétel : A Hoare-féle kalkulus helyes: Ha a {P} C {Q} induktív kifejezés levezet- hető, akkor {P} C {Q} = igaz. Tétel : A Hoare-féle kalkulus szemantikailag teljes: Ha {P} C {Q} = igaz, akkor léteznek a levezetéshez szükséges feltételek (de nem biztos, hogy formalizálhatóak).
Példa : Induktív kifejezés és levezetése
D = Z {x>0} y:=x; z:=1; while y>1 do z:=z*y; y:=y-1 od; {z=x!} {x>0} {x!=x!} y:=x; {y!=x!} {1*y!=x!} z:=1; {z*y!=x!} while y>1 do {z*y!=x! y>1} {z*y*(y-1)!=x!} z:=z*y; {z*(y-1)!=x!} y:=y-1 {z*y!=x!} od; {z*y!=x! y 1} {z=x!}
Rekurzív, paraméter nélküli programok
Szintaxis: Pn : Proc eljárás nevek Pg : Progprogramok C : Utsutasítások
A Prog halmazt alkotó Pg program absztrakt szintaxisa: Pneljáráshívás Az Uts halmazt alkotó C utasítások újabb eleme: Pn::C 1 :C 2
Relációs szemantika
A program (denotációs) szemantikája az utasítások relációs szemantikája segítségével definiálható. Ebben az utasítás szemantikája függ az eljárás hatásrelációjától, az r relációtól. I : Uts (P(S S) P(S S)) Jelölés: I(C) = C(r)
Definíció: skip(r) = { s,s : s S } X:=E(r) = { s,s(X:=E(s)) : s S } (C 1 ;C 2 )(r) = C 1 (r)° C 2 (r) (B C 1 C 2 )(r)=(((B S) C 1 (r)) (( ¬ B) S) C 2 (r))) (B C)(r) = ((B S) C(r))* (S ( ¬ B)) Pn(r) = r Pn::C 1 :C 2 = C 2 (lkfp(C 1 ))
A rekurzió szabálya: {P} Pn {Q} {P} C 1 {Q} {P} Pn {Q}