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 /,... }; G = {g 0 : C 0,..., g i : C j... C k C /,... }; Az absztrakt és konkrét objektumok az egymáshoz való viszonya: : C A = ( 0,..., n ), ahol 0 : C 0 A 0 ; 1 : C 1 A 1 ;...; n : C n A n ; Definíció. A C objektumhalmazt az A objektumhalmaz egy reprezentánsának nevezzük az adott mellett, ha minden a A objektumnak létezik legalább egy c C reprezentánsa, azaz a = (c).
Tétel (reprezentáció tétele). Adva d a absztrakt és d c konkrét typusspecifikációk azonos szingatúrával. : C A morfizmus. F c F a konstrukciós műveletek halmaza. Feltevés: f c F c konstrukciós műveletre fennáll a A f c (a) A c C g c (c) C a = (c), esetén: Állítás. Ha ( c C f c F c )(f c ( (c)) = (g c (c))), akkor C objektumhalmaz az A egy reprezentációja. Bizonyítás. Strukturális indukcióval: Alapeset : a = f 0. f 0 A 0, g 0 C 0, feltevésünk szerint f 0 = (g0). (Tehát a = f 0 esetén létezik olyan c C 0, hogy a = (c)). Indukció: a' = f c (a), ahol feltesszük, hogy a = (c) és c C 0. Tehát a' = f c ( (c)) és művelettartásra vonatkozó feltevésünk alapján: a'= (g c (c)), és c' = g c (c) választás mellett a' = (c') és c' C 0.
A reprezentációs függvény implicit definíciója: f 0 = (g 0 ); ( f c F c )( f c ( (c)) = (g c (c))); A reprezentációs függvény rekurzív (explicit) definíciója: Tegyük fel, hogy c = g c (g s ( c)). Ennek alapján a reprezentációs függvény rekurzív definíciója: (c) = if c = g 0 then f 0 else f c ( ( g s (c) )). Jelölés az osztály morfizmus diagramjában. body = oprs: rep : C A eqns: c C; f 0 : g 0 f c (c): g c (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: v vector, m nat, e elem; create = (nil,0); push(v,m,e) = (put(v,succ(m),e),succ(m)); end stack; (create c, push c (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; b 1, b 2 bool; Axióma:b 1 or b 2 = ~(~b 1 ~b 2 ); Tétel: b 1 or T = T; Bizonyítás: (b 1 or b 2 = ~(~b 1 ~ b 2 )) (b 1 or T = ~(~b 1 ~T)) (b 1 or T = ~(~b 1 F)) (b 1 or T = ~(F)) (b 1 or T = T ). b2 Tb2 T ~ F T~b 1 F F
Tétel:(e s \{a}) = if a=e then "false" else e s fi; Egyenlőség axióma: b 1 = b 2 (b 1 = "true" b 2 = "true") (b 1 = "false" b 2 = "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: b s ~b (s' {a}) = if a = b then b s ~"true" else b s ~b s' 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(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: 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 /,... }; G = {g 0 : C 0,..., g i : C j... C k C /,... }; Az absztrakt és konkrét objektumok az egymáshoz való viszonya: : C A = ( 0,..., n ), ahol 0 : C 0 A 0 ; 1 : C 1 A 1 ;...; n : C n A n ; Definíció. A C objektumhalmazt az A objektumhalmaz egy reprezentánsának nevezzük az adott mellett, ha minden a A objektumnak létezik legalább egy c C reprezentánsa, azaz a = (c).
Tétel. Adva d a absztrakt és d c konkrét típusspecifikációk azonos szingatúrával. : C A morfizmus. F c F a konstrukciós műveletek halmaza. Feltevés: f c F c konstrukciós műveletre fennáll a A f c (a) A c C g c (c) C a = (c). Állítás. Ha ( c C f c F c )(f c ( (c)) = (g c (c))), akkor C objektumhalmaz az A egy reprezentációja. Bizonyítás. Strukturális indukcióval: Alapeset : a = f 0. f 0 A 0, g 0 C 0, feltevésünk szerint f 0 = (g0). (Tehát a = f 0 esetén létezik olyan c C 0, hogy a = (c)). Indukció: a' = f c (a), ahol feltesszük, hogy a = (c) és c C 0. Tehát a' = f c ( (c)) és művelettartásra vonatkozó feltevésünk alapján: a'= (g c (c)), és c' = g c (c) választás mellett a' = (c') és c' C 0.
A reprezentációs függvény implicit definíciója: f 0 = (g 0 ); ( f c F c )( f c ( (c)) = (g c (c))); A reprezentációs függvény rekurzív (explicit) definíciója: Tegyük fel, hogy c = g c (g s ( c)). Ennek alapján a reprezentációs függvény rekurzív definíciója: (c) = if c = g 0 then f 0 else f c ( ( g s (c) )). Jelölés az osztály morfizmus diagramjában. body = oprs: rep : C A eqns: c C; f 0 : g 0 f c (c): g c (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: v vector, m nat, e elem; create = (nil,0); push(v,m,e) = (put(v,succ(m),e),succ(m)); end stack; (create c, push c (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. e h : 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]; shift L (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.
shift L (v) művelet. shift L : vector vector; shift L (nil) = nil shift L (v[i]::= d) = if i = succ(zerus) then shift L (v) else shift L (v)[prec(i)] ::= v[i] fi; shift L (nil) = nil shift L (put(v,i,d)) = if i = succ(zerus) then shift L (v) else put(shift L (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 (shift L (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 (shift L (v),m') = m (shift L (v),m'). 1 (v,m) = 1 (shift L (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.