Nem determinisztikusság és párhuzamosság. A nem determinisztikusság a párhuzamosságban gyökeredzik. Példa: S par parbegin x:=0 x:=1 x:=2 parend; Tetszőleges sorrendet eredményezhet a végrehajtás. S ndet if true x:=0 true x:=1 true x:=2 fi; A legnagyobb közös osztó megtalálása: GCD: while x y do if x y then x:= x-y else y:= y-x fi od; GCD': do x y x:= x-y y x y:= y-x od; Olvasmányosabb megoldás.
Nem determinisztikus program. Szintaxis. 1.) Szekvenciális nem determinisztikus program: S::= skip u t S 1 ;S 2 if 1 S 1... 1 S n fi do 1 S 1... n S n od; Speciális esetek: if then S 1 else S 2 fi : if S 1 ~ S n fi ; when do S od : do S od ; 2.) Szekvenciális nem determinisztikus program exit iterációval: S::= skip u t S 1 ;S 2 if S 1... S n fi do S B S E exit od; S B : 1 S 1... n S n ;
A nem determinisztikus ciklus szintakszisának induktív definíciója: Jelölje azt a nem determinisztikus programot, amelyre: ( )(M[ ]( )= ); (do 1 S 1... 1 S n od) 0 = ; (do 1 S 1... 1 S n od) k+1= if do 1 S 1... 1 S n od; (do 1 S 1... 1 S n od) k (~ 1 ... ~ n ) skip fi;
3.) párhuzamos nem determinisztikus program: S::= skip u t S 1 ;S 2 if 1 S 1... 1 S n fi do 1 S 1... n S n od parbegin S 1 S 2 parend; Atomic program: S ; A nem determinisztikus kiválasztás if 1 S 1... 1 S n fi utasítás esetén: Az i S i őrfeltétetles utasítás kiválasztása végrehajtásra: Ha valamelyik i értékre igaz, akkor a kiértékelés után S i végrehajtódik és az if...fi utasítás végrehajtása befejeződik. Ha több i értéke is igaz, akkor véletlenszerű kiválasztásra kerül sor. Ha minden i {1,..., n} esetén i értéke hamis, akkor az utasítás végrehajtása hibajelzést eredményez, abortál.
Nem determinisztikus iteráció: do 1 S 1... n S n od utasítás esetén: Az i S i őrfeltételes utasítás kiválasztása végrehajtásra: Ha valamelyik i értékre igaz, akkor a kiértékelés után S i végrehajtódik. Ha több i értékre is igaz, akkor véletlenszerű kiválasztásra kerül sor. A fenti eljárás mind addig ismétlődik, amíg van olyan i, amelynek értéke igaz. Ha minden i {1,..., n} esetén i értéke hamis, akkor a do... od utasítás végrehajtása befejeződik.
Szemantika. Szemantika definiálása állapot átmenetek axiómáival: i = "true" if 1 S 1... n S n fi, S i, ; (i=1,...,n). ( i {1,...,n})( i = "false") if 1 S 1... n S n fi, E,fail ; ( E,fail hiba konfiguráció és nincs rákövetkezője!) i = "true" do 1 S 1... 1 S n od, S i ; do 1 S 1... 1 S n od, ; (i=1,...,n). ( i {1,...,n})( i = "false") do 1 S 1... 1 S n od, E, ;
Definíció. Adott S nem determinisztikus program és . Az S nem determinisztikus program kezdeti állapotból elindítva hibás, ha létezik olyan kiszámítása, amely (S',fail) hiba konfigurációban végződik. Definíció. Adott S nem determinisztikus program és . Az S nem determinisztikus program parciális helyességi szemantikája: M[S]( ) ={ S, E, }; Az S nem determinisztikus program teljes helyességi szemantikája: M tot [S]( ) = M[S]( ) { S divergál kezdeti értékből indítva {fail S hibás kezdeti értékből indítva ;
Adott S nem determinisztikus program és esetén: M tot [S]( ) vagy véges, vagy tartalmazza virtuális állapotot. Indoklás a König lemma alapján. M tot [if then S 1 else S 2 fi] = M tot [if S 1 ~ S 2 fi]; M tot [while do S od] = M tot [do S od]; if then S 1 else S 2 fi if S 1 ~ S 2 fi; while do S od do S od; M tot [ if then S fi ] M tot [ if S fi ]; nincs failvan fail
Transzformáljuk át a párhuzamos programot nem determinisztikus programmá. Módszer: Adva S parbegin S 1 ... S n parend; Vezessünk be egy pc i integer változót minden S i komponenshez. Ez a változó modellezi a programszámlálóját az S i végrehajtása során. Ez a számláló mindenkor az S i komponensen belül végrehajtandó következő atomi utasításra mutat. A pozíciók az S i komponensen belül 0,1,...; Az S i befejezési pontját azonosítsa termi. S i komponensben az atomi akciók "címeinek" halmaza: POS i
Példa: Pozitív értékű elem gyors keresése az a[1:N] tömbben. Specifikáció: (1 k N+1 (i, 0 i k)((a[i] 0 k N) a[k] 0); FINDPOS i:=1 ; j:=2; oddtop:=N+1; eventop:=N+1; parbegin S 1 S 2 parend; S 1 while i min(oddtop,eventop) do if a(i) 0 then oddtop:= i else i:= i+2 fi; od; S 2 while j min(oddtop,eventop) do if a(j) 0 then oddtop:= j else j:= j+2 fi; od; Owicki and Gries [1976]
Példa. S parbegin S 1 S 2 ; S 1 while i min(oddtop,eventop) do 0 if a(i) 0 then oddtop:= i else i:= i+2 fi 1 23 od; 4 S 2 while j min(oddtop,eventop) do 0 if a(j) 0 then oddtop:= j else j:= j+2 fi 1 23 od; 4 term 1 =4; term 2 = 4; POS1 = POS2 = {0,1,2,3,4};
S 1 while i min(oddtop,eventop) do 0 if a(i) 0 then oddtop:= i else i:= i+2 fi 1 23 od; 4 T 1 : do pc 1 := 0 i min(oddtop,eventop) pc 1 := 1; pc 1 := 0 ~(i min(oddtop,eventop)) pc 1 := 4; pc 1 := 1 a[i] 0 pc 1 := 2; pc 1 := 1 ~(a[i] 0 ) pc 1 := 3; pc 1 := 2 oddtop:= i; pc 1 := 0; pc 1 := 3 i:= i+2; pc 1 := 0;
S 2 while j min(oddtop,eventop) do 0 if a(j) 0 then oddtop:= j else j:= j+2 fi 1 23 od; 4 do pc 2 := 0 j min(oddtop,eventop) pc 2 := 1; pc 1 := 0 ~(j min(oddtop,eventop)) pc 2 := 4; pc 1 := 1 a[j] 0 pc 2 := 2; pc 1 := 1 ~(a[j] 0 ) pc 2 := 3; pc 1 := 2 oddtop:= j; pc 2 := 0; pc 1 := 3 j:= j+2; pc 2 := 0; term 1 = 4; term 2 = 4;
A nem determinisztikus program: T 1 pc 1 := 0; pc 2 := 0; do pc 1 := 0 i min(oddtop,eventop) pc 1 := 1; pc 1 := 0 ~(i min(oddtop,eventop)) pc 1 := 4; pc 1 := 1 a[i] 0 pc 1 := 2; pc 1 := 1 ~(a[i] 0 ) pc 1 := 3; pc 1 := 2 oddtop:= i; pc 1 := 0; pc 1 := 3 i:= i+2; pc 1 := 0; pc 2 := 0 j min(oddtop,eventop) pc 2 := 1; pc 2 := 0 ~(j min(oddtop,eventop)) pc 2 := 4; pc 2 := 1 a[j] 0 pc 2 := 2; pc 2 := 1 ~(a[j] 0 ) pc 2 := 3; pc 2 := 2 oddtop:= j; pc 2 := 0; pc 2 := 3 j:= j+2; pc 2 := 0; od;
M, M tot ; N. N[S] monoton: (X Y ) N[S](X) N[S](Y); N[S 1 ; S 2 ](X) = N[S 2 ](N[S 1 ](X)); N[(S 1 ; S 2 ); S 3 ](X) = N[(S 1 ; (S 2 ; S 3 )](X); M[(if 1 S 1... n S n fi)](X) = M[(S 1 )](X [ 1 ]) ... M[(S n )](X [ n ]); (X ([ 1 ]) ... [ n ])) M tot [(if 1 S 1... n S n fi)](X) = M tot [(S 1 )](X [ 1 ]) ... M tot [(S n )](X [ n ]); M[(do 1 S 1... n S n od)] = M [do 1 S 1... n S n ) 1 ] ... M [do 1 S 1... n S n ) ];
A segély kiosztásának nem determinisztikus programja. Adva három csoport: a, b, c, akik között ki kell osztani N darab segélyt. A szeretetszolgálat osztja ki az ajándékot. Véletlenszerű az, hogy a soron következő segélyt melyik csoport kapja, de egymás után közvetlenül kétszer ugyan az a csoport nem kaphat segélyt. A csoportok által megkapott segélyek száma legyen mindenkor xa = count(a,ex); xb = count(b,ex); xc = count(c,ex); Ezek kezdőértéke: xa = xb = xc = 0. A kiosztható segélyek száma mindenkor: r = N - (xa + xb + xc ). Így r kezdőértéke: r = N.
A mindenkor utoljára megajándékozott azonosítóját jelölje f {a,b,c}. f kezdőértéke: f = a. A követelmények alapján: Az a csoport kaphat mindenkor segélyt, amelyik nem a legutoljára megajándékozott volt és van még segély: (f a) r 0; Készítsük el a kiosztás szimulálásának a nem determinisztikus programját.
kiosztás= (xa 0; xb 0; xc 0; f a; r N; átad; átad = do r 0 if f a (xa,r) (xa+1, r-1) ; f a f b (xb,r) (xb+1, r-1) ; f b f c (xc,r) (xc+1, r-1) ; f c fi od;
A szemantika definiálásának másik módja a program-stuktúrák tranzakciós diagramjának megadása. S: u e; ST: ({s,t},{(s, "true" (u e), t)}, s, t); "true" (u e) st S: S 1 ;S 2 ; S 1 T: (L 1,T 1, s, r); S 2 T: (L 2,T 2, r, t); Ha L 1 L 2 = {r}, akkor ST = S 1 T; S 2 T = (L 1 L 2, T 1 T 2, s, t); S1TS1T S2TS2T srt
S: if then S 1 else S 2 fi; ({s, t},{(s, (u f S 1 ), t), (s, ~ (u f S 2 ), t)},s,t); f S 1 ~ f S 2 s t S: if S 1 ~ S 2 fi; S 1 T: (L 1,T 1,s,t); ~ S 2 T: (L 2,T 2,s,t); Ha L 1 L 2 = {s,t}, Akkor ST = (L 1 L 2, T 1 T 2, s,t). ST 1 ST 2 st
S = while do S B od; ({s, t},{(s, (u f S B ), s), (s, ~ skip, t)}, s, t ); ~ skip f S B st S = while do S B od; S = do S B ~ S E ; exit od; S B T = (L B, T B, s, t); S E T: (L E,T E,s,t); L B L E = {s}; ST: (L B L E, T B T E, s, t); S E = skip. S B T ~ S E T st