170 likes | 236 Views
Reprezentációs függvény. Adva egy adattípus absztrakt és konkrét specifikációja: d a = ( A, F, E a ); d c = ( C, G, E c ); A = {A 0 , ..., A n }; C = {C 0 , ... , C m }; F = {f 0 : A 0 , ... , f i : A j ...A k A / ,... };
E N D
Reprezentációs függvény. Adva egy adattípus absztrakt és konkrét specifikációja: da = ( A, F, Ea ); dc = ( C, G, Ec ); A = {A0, ..., An }; C = {C0, ... , Cm }; F = {f0:A0, ... , fi: Aj...Ak A/,... }; G = {g0: C0, ... , gi: Cj... Ck C/,... }; Az absztrakt és konkrét objektumok az egymáshoz való viszonya: : C A = (0 , ... ,n), ahol 0: C0 A0; 1: C1 A1; . . .; n: Cn An; Definíció. A C objektumhalmazt az A objektumhalmaz egy reprezentánsának nevezzük az adott mellett, ha minden aA objektumnak létezik legalább egy cC reprezentánsa, azaz a = (c).
Tétel (reprezentáció tétele). Adva da absztrakt és dc konkrét typusspecifikációk azonos szingatúrával. : C A morfizmus. Fc F a konstrukciós műveletek halmaza. Feltevés: fcFc konstrukciós műveletre fennáll aA fc(a)A cC gc(c)C a = (c), esetén: Állítás. Ha (cCfcFc)(fc((c)) = (gc(c))), akkor C objektumhalmaz az A egy reprezentációja. Bizonyítás. Strukturális indukcióval: Alapeset : a = f0. f0 A0, g0 C0, feltevésünk szerint f0 = (g0). (Tehát a = f0 esetén létezik olyan c C0 , hogy a = (c)). Indukció: a' = fc(a), ahol feltesszük, hogy a = (c) és c C0. Tehát a' = fc((c)) és művelettartásra vonatkozó feltevésünk alapján: a'= (gc(c)), és c' = gc(c) választás mellett a' = (c') és c' C0.
A reprezentációs függvény implicit definíciója: f0 = (g0); (fcFc)( fc( (c)) = (gc(c))); A reprezentációs függvény rekurzív (explicit) definíciója: Tegyük fel, hogy c = gc(gs( c)). Ennek alapján a reprezentációs függvény rekurzív definíciója: (c) = if c = g0then f0else fc(( gs(c) )). Jelölés az osztály morfizmus diagramjában. body = oprs: rep : C A eqns: c C; f0 : g0 fc(c): gc(c)
A vermet egy vektorban tároljuk és egy mutató a veremben lévő elemek számát mutatja. . . . body = oprs: rep: vector nat stack eqns: vvector, mnat, eelem; create = (nil,0); push(v,m,e) = (put(v,succ(m),e),succ(m)); end stack; (createc, pushc(v,u,m)) Explicit definíció: (v,m)= if m = 0 then (nil,0) else (insert((v,prec(m)),access(v,m)),m)
Néhány gyakorló példa származtatásra. or: bool bool bool; b1, b2bool; Axióma: b1 or b2 = ~(~b1 ~b2); Tétel: b1 or T = T; Bizonyítás: (b1 or b2 = ~(~b1 ~ b2)) (b1 or T = ~(~b1 ~T)) (b1 or T = ~(~b1 F)) (b1 or T = ~(F)) (b1 or T = T ). b2T ~b1 F F ~ F T
Tétel: (e s \{a}) = if a=e then "false" else e s fi; Egyenlőség axióma: b1= b2 (b1 = "true" b2 = "true") (b1 = "false" b2 = "false") Axióma: (e s {a}) = if a=e then "true" else e s fi; Bizonyítás. Alapeset. s = { }, bal oldal: e (s\{ }) = e s jobb oldal: e s ~ (e { }) = e s Indukció. s = s'{a} bal oldal: b(s\ (s'{a})) = b ((s\s')\ {a}) = if a=b then "false" else b (s\s') fi; jobb oldal: bs ~b(s'{a}) = if a = b then bs~"true" else bs ~bs' fi = if a =b then "false" else b (s\s') fi;
Példa. Bizonyítsuk be: add(k, add(n,m)) = add(add(k,n),m) tételt. alap eset : k = zerus ; add(k, add(n,m)) = add(add(k,n),m) (add(zerus, add(n,m)) = add(add(zerus,n),m) (add(n,m)) = add(add(zerus,n),m) add(n,m) = add(n,m) T. k zerus add(zerus, add(n,m)) add(n,m) add(zerus,n) n
Indukciós lépés: k= succ(k'); k'-re igaz. add(k, add(n,m)) = add(add(k,n),m) add(succ(k'), add(n,m)) = add(add(succ(k'),n),m) succ(add(k', add(n,m)) = add(succ(add(k',n)),m) succ(add(k', add(n,m)) = succ(add(add(k',n),m)) succ(add(add(k',n),m)) = succ(add(add(k',n),m)) T k succ(k') add(succ(a), b) succ(add(a, b)) add(succ(a), b) succ(add(a, b)) add(k',add(n,m)) add(add(k',n),m)
Kettős specifikáció: e par exp i = eb imp bod ib absztrakt specifikáció konkrét specifikáció
Reprezentációs függvény. Adva egy adattípus absztrakt és konkrét specifikációja: da = ( A, F, Ea ); dc = ( C, G, Ec ); A = {A0, ..., An }; C = {C0, ... , Cm }; F = {f0:A0, ... , fi: Aj...Ak A/,... }; G = {g0: C0, ... , gi: Cj... Ck C/,... }; Az absztrakt és konkrét objektumok az egymáshoz való viszonya: : C A = (0 , ... ,n), ahol 0: C0 A0; 1: C1 A1; . . .; n: Cn An; Definíció. A C objektumhalmazt az A objektumhalmaz egy reprezentánsának nevezzük az adott mellett, ha minden aA objektumnak létezik legalább egy cC reprezentánsa, azaz a = (c).
Tétel. Adva da absztrakt és dc konkrét típusspecifikációk azonos szingatúrával. : C A morfizmus. Fc F a konstrukciós műveletek halmaza. Feltevés: fcFc konstrukciós műveletre fennáll aA fc(a)A cC gc(c)C a = (c). Állítás. Ha (cCfcFc)(fc((c)) = (gc(c))), akkor C objektumhalmaz az A egy reprezentációja. Bizonyítás. Strukturális indukcióval: Alapeset : a = f0. f0 A0, g0 C0, feltevésünk szerint f0 = (g0). (Tehát a = f0 esetén létezik olyan c C0 , hogy a = (c)). Indukció: a' = fc(a), ahol feltesszük, hogy a = (c) és c C0. Tehát a' = fc((c)) és művelettartásra vonatkozó feltevésünk alapján: a'= (gc(c)), és c' = gc(c) választás mellett a' = (c') és c' C0.
A reprezentációs függvény implicit definíciója: f0 = (g0); (fcFc)( fc( (c)) = (gc(c))); A reprezentációs függvény rekurzív (explicit) definíciója: Tegyük fel, hogy c = gc(gs( c)). Ennek alapján a reprezentációs függvény rekurzív definíciója: (c) = if c = g0then f0else fc(( gs(c) )). Jelölés az osztály morfizmus diagramjában. body = oprs: rep : C A eqns: c C; f0 : g0 fc(c): gc(c)
A vermet egy vektorban tároljuk és egy mutató a veremben lévő elemek számát mutatja. . . . body = oprs: rep: vector nat stack eqns: vvector, mnat, eelem; create = (nil,0); push(v,m,e) = (put(v,succ(m),e),succ(m)); end stack; (createc, pushc(v,u,m)) Explicit definíció: (v,m)= if m = 0 then (nil,0) else (insert((v,prec(m)),access(v,m)),m)
Adva a halmaz következő informális specifikációja: Konstrukciós műveletek: { } : üres halmaz előállítása. {e} : egy e elemből álló halmaz előállítása. h h': két halmaz összes különböző elemének egy halmazban való egyesítése. Nem konstrukciós műveletek: h \ h': a h halmazból a h' halmaz elemeinek kitörléseként kapott halmaz előállítása. eh : ha e eleme a h halmaznak akkor "igaz", különben pedig "hamis" értéket ad. |h| : a h halmazban lévő elemek száma. A halmazban legfeljebb n 0 elem lehet. Legyen a halmaz neve set.
Legyen a halmaz ábrázolása: vector nat set, ahol a vector máveletei a szokásosak: nil; v[i]::= e; v[i]; shiftL(v); Adjuk meg a reprezentációs függvény két különböző rekurzív definícióját ( a vektorban az első illetve az utolsó elem felhasználásával) és bizonyítsuk be a két reprezentációs függvény egyenlőségét.
shiftL(v) művelet. shiftL : vector vector; shiftL(nil) = nil shiftL(v[i]::= d) = if i = succ(zerus) then shiftL(v) else shiftL(v)[prec(i)] ::= v[i] fi; shiftL(nil) = nil shiftL(put(v,i,d)) = if i = succ(zerus) then shiftL(v) else put(shiftL(v), prec(i), d) fi; b.) A reprezentációs függvény két rekurzív definíciója: m(v,m) = if m = 0 then {} else m(v,prec(m)) {v[m]} fi; 1(v,m) = if m = 0 then {} else 1(shiftL(v),prec(m)) {v[succ(zerus)]} fi;
b.) Feltevés: m m' 1 1(v,m') = m(v,m') = {v[1], . . ., v[m']} Legyen m' = prec(m). Ekkor (feltevésünk szerint): 1(shiftL(v),m') = m(shiftL(v),m'). 1(v,m) = 1(shiftL(v).prec(m)) {v[1]} = {v[2], . . ., v[succ(m')]}{v[1]} = {v[1], . . ., v[m]}. m(v,m) = m(v,prec(m)) {v[m]} = {v[1], . . ., v[prec(m)]} {v[m]} = {v[1], . . ., v[m]}. az egyenlőség az egyenlőségi axióma alapján teljesül.