Példa. Az ábrázolás szemléltetése. = ({stack, elem },{ create : stack; push : stack elem stack}), = ( {vector, nat, elem}, { create c : vector nat; push c : vector nat elem vector nat; pop c : vector nat vector nat elem }); Legyen a h = ' morfizmus egy ábrázolás: h s (stack) = vector nat; h s (elem) = elem; h OP (create : stack) = create c : vector nat; (h OP (create) = create c ); h OP (push : stack elem stack) = push c : vector nat elem vector nat; (h OP (push) = push c ); Reprezentáció. Reprezentációs függvény: rep: vector nat stack; s = rep(v,n); s stack, v vector, n nat; s = (v,n);
Paraméterátadás. Standard paraméterátadás: spec(spec 1 ) spec(spec 2 ) spec 1 formális, spec 2 aktuális paraméterek, (értékadással történő paraméterátadás). Ismételt paraméterátadás: spec(spec 1 (spec A )) spec(spec 2 (spec B ));
SPEC = (S,OP,E); SPEC = ( ,E); Szignatúra morfizmus: '; Szignatúra morfizmus. Adott: = (S,OP), ' =(S',OP'), mellett a h : ', leképezést Szignatúra morfizmusnak nevezzük, ha h = (h s : S S', h OP : OP OP'); úgy, hogy ( N: s 1... s n s OP)(h OP (N): h s (s 1 )... h s (s n ) h s (s) OP').
A h: ' szignatúra morfizmus kiterjesztése változókra: Legyenek X, X' rendre a , ' változói. h = h ; h(s) = h s ; h(N) = h OP (N); h X : ( X s ) ( X' s' ) s S s' S' ha x X s, s S, akkor h X (x) X' h(s) = s'; A h: ' szignatúra morfizmus kiterjesztése termekre: Legyenek T (X), T (X') rendre a , ' termeknek halmazai. Minden t T (X) -hez tartozó h T (t) T '(X') definíciója: ( x X)(h T (x) = h(x)); ( (N: s) OP)(h T (N: s) = (h(N): h(s))); ( N: s 1... s n s) OP)( h T (N(t 1,...,t n )) = h(N)(h(t 1 ),...,h(t n ))); '; = (null..., succ..., plusz...); '= (0..., _ +1...,_+_...;) h(plusz(succ(x),null) = (X+1) + 0
A h: ' szignatúra morfizmus kiterjesztése egyenletek formájában adott axiómákra. Legyen e = (X,L,R) E, akkor e helyettesítendő h (e) = (X , h (L), h (R)) egyenlettel E', ahol x X s S változó helyettesítendő x X h(s) = s' S' változóval, L, és R képzésénél pedig N: s 1... s n s OP, esetén N(t 1,...,t n ) T OP(X), helyettesítendő h(N)(h (t 1 ),...,h (t n )) operációval. Specifikáció morfizmus. Adva: SPEC = ( ,OP,E), SPEC' = ( ',OP', E'), h SPEC : SPEC SPEC'; h SPEC =(h , h E ); h : '; h E : E E'; E' = h E (E) = { h (e) ( e = (X,L,R) E)}.
data = sorts: data end data; nat = data + sorts: nat = data oprs: 0 nat succ: nat nat add: nat nat nat eqns : n,m nat; add(n,m)=add(m,n) add(n,0) = n add(n,succ(m))= succ(add(n,m)) end nat; p data string(data) h = h 1 nat string(nat) p'
Definíció: Adva paraméteres típusspecifikáció: PAR SPEC = (SPEC, SPEC 1 ): ahol SPEC = (S,OP,E),SPEC 1 = SPEC + (S 1,OP 1,E 1 ). Adva továbbá h : SPEC SPEC' specifikáció morfizmus, ahol SPEC' = (S', OP', E'). Paraméterátadó-morfizmus diagramja: p: tartalmazás SPEC SPEC 1 = SPEC + (S 1,OP 1,E 1 ) h : SPEC SPEC' h 1 : SPEC 1 SPEC 1 ' SPEC' SPEC 1 ' p': tartalmazás
A paraméterátadás jelentése: Ha p és p' tartalmazás az összes rész-specifikáció esetén: h 1 : ( s S + S 1 )(h 1 (s) = if s S 1 then s else h(s) fi); ( (N: s 1... s n ) OP+OP', n 0)(h 1 (N: s 1... s n ) = if (N: s 1... s n ) OP then N: h 1 (s 1 )... h1(s n ) h 1 (s) else h(N): h(s 1 )... h(s n ) h(s) fi; SPEC 1 ' = SPEC' + (S',OP',E 1 '), ahol S 1 ' = S 1, OP 1 '=h 1 (OP 1 ), E 1 ' = h 1 (E 1 ).
Adva h 1 : SPEC A SPEC B, h 2 : SPEC A SPEC C, h 3 : SPEC B SPEC D ; és h 4 : SPEC C SPEC D morfizmusok. Ha h 3 h 1 = h 2 h 4 ; akkor a morfizmus diagrammot kommutatívnak nevezzük. h 1 SPEC A SPEC B h 2 = h 3 SPEC C SPEC D h 4 = jelentése: h 3 h 1 = h 2 h 4 ;
Adattípus osztály specifikációja: e PAREXP i = eb IMPBOD ib PAR : formális paraméterek specifikációja; EXP = PAR+(S 1,OP 1, E 1 ) : export felület specifikációja; IMP = PAR' + (S 2, OP 2, E 2 ) : import felület specifikációja; BOD = IMP + eb(EXP) : megvalósítás specifikációja; Specifikáció: PAR, IMP; Kitüntetett sortú specifikáció: EXP = ( S EXP,OP EXP,E EXP ); BOD = (S BOD, OP BOD, E BOD ); Tartalmazás: e, ib; Tartalmazás, vagy tartalmazás és átnevezés i; eb: EXP BOD; kitüntetett sortú morfizmus, reprezentáció;
osztálynév( paraméterek , korlátozás ) is a class specification = parameters = sorts: oprs : eqns: exports = classsort: oprs : eqns: imports = sorts: oprs : eqns: body = oprs : rep: pt( bod ) pt( exp ); eqns :
A megoldás. set(data, n : nat ) is a class specification = parameters = bool + nat + sorts : data oprs : : data = : data data bool [infix] eqns: a, b, c data; a = b b = a a = b b = c a = c
exports = class sorts : set oprs : empty : set insert : set data set delete : set data set has : set data bool size : set nat eqns : s set; a, b data delete(empty, a) = empty has(empty, a) = "false" size(empty) = zerus delete(insert(s, a), b) = if a=b then delete(s, b) else insert(delete (s, b), a) has(insert(s, a), b) = if a=b then "true" else has(s, b) fi size(insert(s, a)) = if has(s, a) then size(s) else succ(size(s )) fi size(insert(s, a)) n insert(s,a) = "undefined"
imports = sorts : vector oprs : nil : vector put : vector nat data vector access : vector nat data eqns : v vector, i,j nat, a data access(nil, a) = access(put ( v, i, a), j) = if i=j then a else access(v,j) fi; body = oprs : rep : vector nat set eqns : v vector, m nat, a data empty = (nil, zerus) insert((v, m), a) = if ( /, 1 / m)(access(v, /) = a then (v, m) else (put(v, succ(m), a), succ(m)) fi; end set;