340 likes | 426 Views
Determinisztikus programok. Szintaxis:. X : Pvalt program változók E : Kif kifejezések B : Lkif logikai kifejezések C : Uts utasí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
E N D
Szintaxis: • X :Pvalt program változók • E: Kif kifejezések • B: Lkif logikai kifejezések • C: Uts utasí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 (C1;C2) kompozíció (BC1C2) feltételes utasítás (BC) 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ásfi | whilelogikai kif do utasítás od
Operációs szemantika: • X :Valt Pvalt változók • d: Dadatok • s: S = ValtDá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 : sS} op(X:=E) = { s,X:=E , s(X:=E(s)) : sS} op(C1;C2) = { s´,(C´;C2) , s´´,(C´´;C2) : s´,C´ , s´´,C´´ op(C1)} { s´,(C´;C2) , s´´,C2 : s´,C´ , s´´ op(C1)} op(C2)
op(BC1C2) = {s,(BC1C2),s,C1 : sB} {s,(BC1C2),s,C2 : s¬B} op(C1) op(C2) op(BC) = {s,(BC),s,(C;(BC)) : sB} {s,(BC),s : s¬B} {s´,(C´; (BC)),s´´,(C´´;(BC)) : s´,C´,s´´,C´´op(C)} {s´,(C´; (BC)),s´´,(BC) : s´,C´,s´´op(C)}
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(SS) utasítások szemantikája I(C) = C = {s´,s´´ : s´,C,s´´op(C)*}
Tételek : skip= {s,s : sS} X:=E= {s,s(X:=E(s)) : sS} (C1;C2)= C1°C2 (BC1C2) = ((BS) C1) (((¬B)S) C2) (BC) = ((BS) C)* (S(¬B)) = lkfp[X.((¬B)(¬B)) (((BS) C)°X)]
feltételek : p,q : Felt = P(S) • feladatok : p,q : Fdt = FeltFelt • parciális helyesség (függvény) : {p}C{q} : FeltUtsFelt {igaz, hamis} • {p}C{q} = ((pS) C) (Sq)
Floyd-Naur A parciális helyesség lépésenkénti bizonyítása
Lemma • Ha p, p', qP(E) (azaz E feletti unér relációk), és rP(EE) (azaz E feletti binér reláció), akkor az alábbi állítások ekvivalensek: • ((pp') r*) (Eq) • iP(E). (p i) (((iE) r) (Ei)) ((ip') q)
Átfogalmazás p, p', qP(E) tulajdonságok,rP(EE) E-n végrehajtható atomi műveletek halmaza, ((pp') r*) (Eq) á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.
iP(E). (p i) (((iE) r) (Ei)) ((ip') 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} = ((pS) C) (Sq) 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} =((pp') r*) (Eq) = = ((p,CS) op(C)*) (q)
{p}C{q} = iP(). (p,C i) (((i) op(C)) (i)) ((iS) 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 itulajdonsá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 {{sS : s(X:=E(s))q}} X:=E {q} = igaz {p} (C1;C2) {q} = = rFelt.({p} C1 {r} {r} C2 {q}) {p} (BC1C2) {q} = = {p B} C1 {q} {p ¬B} C2 {q} {p B} C {p} {p} (BC) {p ¬B} {p}C{q} = (p'Felt. q'Felt. (pp') {p'}C{q'} (q'q)) {p}(B*C){q} = iFelt. (pi) {iB}C{i} ((iB)q)
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(XE)} X:=E {Q} értékadás axiómája Hoare-féle kalkulus a parciális helyesség bizonyításához
Levezetési szabályok: {P} C1 {R}, {R} C2 {Q}kompozíciós {P} (C1;C2) {Q} szabály {PB} C1 {Q}, {P¬B} C2 {Q} feltételes {P} (BC1C2) {Q} szabály {PB} C {P} ciklus (while) {P} (BC) {P ¬B} szabály PP´, {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).
{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!} • {z*y!=x!} • while y>1 do • {z*y!=x! y>1} • {z*y*(y-1)!=x!} • z:=z*y; • {z*(y-1)!=x!} • {z*(y-1)!=x!} • y:=y-1 • {z*y!=x!} • {z*y!=x!} • od; • {z*y!=x! y1} • {z=x!} D = Z
Szintaxis: • Pn :Proc eljárás nevek • Pg: Prog programok • C: Uts utasítások
Az Uts halmazt alkotó C utasítások újabb eleme: Pn eljáráshívás A Prog halmazt alkotó Pg program absztrakt szintaxisa: Pn::C1:C2
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(SS)P(SS)) Jelölés: I(C) = C(r)
Definíció: skip(r)= {s,s : sS} X:=E(r)= {s,s(X:=E(s)) : sS} (C1;C2)(r)= C1(r)°C2(r) (BC1C2)(r)=(((BS) C1(r)) ((¬B)S) C2(r))) (BC)(r) = ((BS) C(r))* (S(¬B)) Pn(r) = r Pn::C1:C2 = C2(lkfp(C1))
A rekurzió szabálya: {P} Pn {Q} {P} C1 {Q} {P} Pn {Q}