230 likes | 409 Views
Specifikāciju valoda Z. Specifikāciju valodu pamati. Z: ievada piezīmes. Z - sistēma strukturētu matemātisku teoriju veidošanai, izmantojama programmatūras specifikācijā; Programmatūras specifikācija: abstrakto mašīnu modelis (stāvoklis, operācijas, ieejas un izejas parametri, invariants);
E N D
Specifikāciju valoda Z Specifikāciju valodu pamati
Z: ievada piezīmes • Z - sistēma strukturētu matemātisku teoriju veidošanai, izmantojama programmatūras specifikācijā; • Programmatūras specifikācija: abstrakto mašīnu modelis (stāvoklis, operācijas, ieejas un izejas parametri, invariants); • Z specifikācijas pamata struktūras bloks - shēma: • satur deklarācijas daļu kopā ar predikātu daļu; • izmantota gan programmas stāvokļa, gan arī stāvokļu maiņas aprakstam; • valoda Z piedāvā līdzekļus shēmu kombinācijai • Z notācija: attīstījusies ilgākā laika posmā, pirmās publikācijas ap 1980.gadu, ISO standarts 2002.gadā (dažādā literatūrā var būt pieejamas dažādas Z "variācijas") • Z: pieejams plašs resursu klāsts tīmeklī (t.sk. reference manual, arī mācību grāmatas).
Z specifikācijas struktūra: paragrāfi Z - sistēma strukturētu matemātisku teoriju veidošanai, izmantojama programmatūras specifikācijā. Specifikācija sastāv no paragrāfiem. Paragrāfi: • Pamata tipu deklarācijas: [ NAME, DATE ] . Tipus var tālāk lietot specifikācijā. • Aksiomātiskās definīcijas:| x NAME square: N N n N square(n) = n * n • Ierobežojumi: n < 13 • Shēmu definīcijas (sk. tālāk) • Saīsinājumu definīcijas:DATABASE ADDR PAGE Iespējamas arī “brīvo” tipu definīcijas: TREE ::= tip | fork N TREE TREE Definīcija ekvivalenta ar [TREE], kam seko: tip : TREEfork: N TREE TREE >--> TREE W: P TREE {tip} fork (| N W W |) W TREE W disjoint {tip}, ran fork …
AddBirthday AddBirthday BirthdayBook, BirthdayBook'- shēmas dekorācija, beigu stāvoklisname? : Name; date? : Date BirthdayBook - sākuma un beigu stāvokļi deklarēti šeitname? : Name; date? : Date name? known birthday'= birthday {name? date?} name? known birthday'= birthday {name? date?} Sākuma piemērs: Dzimšanas dienureģistrs BirthdayBook known: P Name - kopas apakškopu kopabirthday: Name -+-> Date - daļēji definēta funkcija [Name, Date] - dotās kopas, vienmēr arī Z - dotā kopa known = dom birthday BirthdayBook BirthdayBook BirthdayBook' - notācija
FindBirthday BirthdayBookname? : Name; date! : Date name? known date ! = birthday(name?) known' = known birthday' =birthday FindBirthday Remind BirthdayBookname? : Name; date! : Date BirthdayBooktoday? : Date; cards ! : P Name name? known date ! = birthday(name?) cards ! = {n: known | birthday(n) = today?} InitBirthdayBook BirthdayBook' known' = Dzimšanas dienureģistrs (2) BirthdayBook [BirthdayBook |known'=known; birthday' = birthday] Inicializācija:
AddBirthday BirthdayBook, BirthdayBook'name? : Name; date? : Date name? known birthday'= birthday {name? date?} Operāciju priekšnosacījumi pre S - nosacījums uz operāciju raksturojošas shēmas sākuma stāvokli (mainīgo bez dekorācijām vērtībām) un ieejas datiem (mainīgo ar dekorāciju ? vērtībām),kas spēkā tad un tikai tad, ja eksistē beigu stāvokļa mainīgo un izejas datu vērtības, ar kurām kopā dotās sākuma vērtības un ieejas dati apmierina shēmas predikātu. pre AddBirthday = [BirthdayBook ; name? : Name; date? : Date |name? known] pre FindBirthday = [BirthdayBook ; name? : Name; date? : Date |name? known] Sākuma nosacījums netiek izdalīts atsevišķi no kopējā operāciju raksturojošā predikāta. Sekas: iespējams pievienot izteiksmi, kas tieši attiecas tikai uz beigu mainīgajiem,bet kura būtiski maina priekšnosacījumu.
Success result! : Report result! = ok AlreadyKnown BirthdayBookname? : Name; result ! : Report name? known result ! = already_known Dzimšanas dienu reģistrs: specifikācijas papildinājums Report ::= ok| already_known | not_known - brīvā (induktīvā) tipa definējums RAddBirthday (AddBirthday Success) AlreadyKnown Valodā Z iespējamas loģiskās operācijas ar shēmām: konjunkcija, disjunkcija, negācija. Lai konjunkcija vai disjunkcija būtu definēta, nepieciešams, lai shēmudeklarācijas daļas būtu saskaņotas. Izpildot loģiskās operācijas, nepieciešams ņemt vērā, ka daļa no predikāta var būt implicīti ietverta jau deklarācijas daļā (sk. vēlākus piemērus).
NotKnown BirthdayBookname? : Name; result ! : Report name? known result ! = not_known Dzimšanas dienu reģ.: specifikācijas papildinājums (2) RFindBirthday (FindBirthday Success) NotKnown RRemind Remind Success
BirthdayBook1 names : N1 Namedates : N1 Date ; hwm : N i,j : 1 .. hwm i j names(i) names(j) AbsBB BirthdayBookBirthdayBook1 known = {i : 1 .. hwm names(i) } {names(i)|i1..hwm}i : 1 .. hwm birthday (names(i)) = dates(i) AddBirthday1 BirthdayBook1name? : Name; date? : Date i : 1 .. hwm name? names(i) hwm' = hwm + 1 names' = names {hwm' name?}dates' = dates {hwm' date?} Dzimšanas dienu reģistrs: "implementācija" Z: specifikācijas notācija, nevis specifikācijas metode (kā B). Z ļauj pierakstīt strukturētā veidā dažādus apgalvojumus, bet veids, kā šie apgalvojumi saistās kopā vienotā programmatūras izstrādes procesā, netiek a priori fiksēts.
Ieskats teorijā: Datu tipi • Dotās kopas (t.sk. veselo skaitļu kopa Z, kā arī kopas, kuru vārdi atklāti specificēti); [Names, Dates] • Kopas tipi: katrs viena tipa t objektu kopums ir objekts ar tipu P t ; {1,4,9,16,25} {p: Z | p < 100} • Korteži un Dekarta reizinājumi: ja x un y ir objekti ar tipiem attiecīgi t un u, tad pāris (x,y) ir objekts ar tipu t u; ir arī tipi t u v, utt. • Brīvie (konstruktīvie) tipi - Tree :== aa | ff N Tree Tree • Saistījumi (bindings) un shēmas tipi:Ja p un q ir dažādi identifikatori un x un y ir objekti ar tipiem attiecīgi u un v, tad p=>x, q=>y ir saistījums, kuram ir shēmas tips |p:u; q:v|Saistījumi definēti arī patvaļīgam dažādu selektoru skaitam n.Saistījums ar atbilstošajiem šķirkļiem atbilst shēmas instancei, ļauj to uzlūkot kā matemātisku objektu.Deklarācija x : BirthdayBook , x ir mainīgais ar shēmas BirthdayBook tipu, var rakstīt x.known, x.birthday(Kas notiek ar shēmas predikāta daļu šādās deklarācijās? x.known = dom x.birthday- Tā arī tiek ņemta vērā. Literatūrā var būt dažādi varianti).
(teta-) notācija, X konvencija BirthdayBook [ BirthdayBook |known'=known; birthday' = birthday] BirthdayBook [ BirthdayBook | BirthdayBook' = BirthdayBook] BirthdayBook = < known => BirthdayBook.known;birthday => BirthdayBook.birthday > BirthdayBook– objekts (saistījums) x ar šķirkļiem known, birthday, kam spēkāx.known = BirthdayBook.knownun x.birthday = BirthdayBook.birthday BirthdayBook' = < known => BirthdayBook'.known;birthday => BirthdayBook'.birthday > BirthdayBook - shēmas BirthdayBook raksturīgais saistījums (binding) konvencija – jaunā definīcija atbilst iepriekšējam priekšstatam. konvencija - valodā iebūvēta, var tikt pārdefinēta, ja vajadzīgs. Deklarācija x:S, x - saistījums, objekts ar shēmas S tipu Labāk rakstīt ekvivalento x : {S • S},atklāti pasaka nepieciešamību ņemt vērā shēmas īpašību. x:BirthdayBook gadījumā tā ir īpašībaknown = dom birthday
Studiju reģistratora palīgs [Student] - dota kopa size : N- deklarējam konstanti Response ::= success | notenrolled | nocert | cert | alreadyenrolled | alreadytested | noroom - uzskaitījuma veida datu tips Class [ enrolled, tested : P Student | #enrolled size tested enrolled ] - shēma, raksturo sistēmas stāvokli ClassInit [ Class’ | enrolled’ = ] - cita shēma, raksturo sākuma stāvokli Enrolok [ Class, s?: Student, r!: Response | - operāciju shēmas s? enrolled #enrolled < size enrolled’ = enrolled {s?} tested’ = tested r! = success ] Testok [ Class, s?: Student, r!: Response | s? enrolled s? tested enrolled’ = enrolled tested’ = tested {s?} r! = success ]
Studiju reģistratora palīgs (2) [Student] size : N Response ::= success | notenrolled | nocert | cert | alreadyenrolled | alreadytested | noroom Class [ enrolled, tested : P Student | #enrolled size tested enrolled ] - shēma, raksturo sistēmas stāvokli ClassInit [ Class’ | enrolled’ = ] - cita shēma, raksturo sākuma stāvokli … Leaveok [ Class, s?: Student, r!: Response | - tālākas operācijas s? enrolled enrolled’ = enrolled \ {s?} ((s? tested tested’ = tested \ {s?} r! = cert ) (s? tested tested’ = tested r! = nocert )) ] Enquire [ Class, s?: Student, r!: Response | ((s? enrolled r! = notenrolled) (s? (enrolled \ tested) r! = alreadyenrolled) (s? tested r! = alreadytested) ) ]
Studiju reģistratora palīgs – turpināts Class [ enrolled, tested : P Student | #enrolled size tested enrolled ] Kļūdu apstrāde – atsevišķas shēmas: AlreadyEnrolled [ Class, s?: Student, r!: Response | s? enrolled r! = alreadyenrolled ] NoRoom [ Class, r!: Response | #enrolled = size r! = noroom ] AlreadyTested [ Class, s?: Student, r!: Response | s? tested r! = alreadytested ] NotEnrolled [ Class, s?: Student, r!: Response | s? enrolled r! = notenrolled ] Robustas operācijas (ietver kļūdu apstrādi): Enrol Enrolok NoRoom AlreadyEnrolled Test Testok NotEnrolled AlreadyTested Leave Leaveok NotEnrolled Shēmu operācijas izmantotas specifikācijas strukturizācijai (vispirms bija iespējams specificēt normālo gadījumu, pēc tam kļūdu situācijas tika aprakstītas atsevišķi).
Studiju reģistratora palīgs : divas klases Class [ enrolled, tested : P Student | #enrolled size tested enrolled ] TwoClasses [ z_beginners : Class, z_advanced : Class ] ZbOperation [ TwoClasses, Class | z_advanced’ = z_advanced z_beginners = Class z_beginners’ = Class’ ] z_beginners = Class saīsina z_beginners.enrolled = enrolled z_beginners.tested = tested ZbOperation – līdzeklis elementāri definētas operācijas pielietošanai strukturētas sistēmas komponentei (elementāro operāciju “paaugstināšana”): ZbEnrolok ZbOperation Enrolok ZbAlreadyEnrolled ZbOperation AlreadyEnrolled ZbNoRoom ZbOperation NoRoom ZbEnrolBuilt ZbEnrolok ZbAlreadyEnrolled ZbNoRoom Komponenšu paslēpšana: eksistenciālā kvantifikācija ZbEnrol ZbEnrolBuilt \ (enrolled, enrolled’, tested, tested’) - paslēptās komponentes kļūst neredzamas Ekvivalenti: ZbEnrol Class ZbEnrolBuilt
Studiju reģistratora palīgs: klašu sistēma Class [ enrolled, tested : P Student | #enrolled size tested enrolled ] [ClassName] CSResponse ::= … … … | maxclasses : N ClassSystem [ classmap: ClassName -+-> Class | #classmap maxclasses] InitClassSystem [ ClassSystem’ | classmap’ = ] MakeClassok [ClassSystem, ClassInit, -- tukšas klases pievienošana cname? : ClassName, csr! : CSResponse | cname dom classmap classmap’ = classmap {cname? Class’} csr! = classadded ] DropClassok [ClassSystem, cname? : ClassName, csr! : CSResponse | cname? dom classmap (classmap cname?).enrolled = classmap’ = {cname?} <-| classmap csr! = classdeleted ]
Studiju reģistratora palīgs: klašu sistēma (2) Class [ enrolled, tested : P Student | #enrolled size tested enrolled ] [ClassName] CSResponse ::= … … … maxclasses : N ClassSystem [ classmap: ClassName -+-> Class | #classmap maxclasses] InitClassSystem [ ClassSystem’ | classmap’ = ] ClassToSystem [ClassSystem, Class, cname? : ClassName, csr! : CSResponse | cname? dom classmap classmap cname? = Class classmap’ = classmap {cname? Class’} csr! = classfound ] UClass [ClassSystem, cname? : ClassName, csr! : CSResponse | cname dom classmap csr! = unknownclass ] -- UnknownClass CSEnrol ((Enrol ClassToSystem) \ (enrolled, enrolled’, tested, tested’)) UClass CSTest ((Test ClassToSystem) \ (enrolled, enrolled’, tested, tested’)) UClass CSLeave ((Leave ClassToSystem) \ (enrolled, enrolled’, tested, tested’)) UClass CSEnquire ((EnquireClassToSystem)\(enrolled, enrolled’, tested, tested’)) UClass Operāciju “paaugstināšanas” (promotion) tehnika.
Shēmu “novadīšana” (schema piping) [PrinterName, GroupName, File] Printer == seq File Printers [ printers: GroupName -+-> P PrinterName, queue: PrinterName -+-> Printer | printers partitionsdom queue gn: dom printers printers gn ] SelectPrinter [ Printers, gn?: GroupName, pn!: PrinterName | gn? dom printers pn! printers gn? printers’ = printers ] QueueFile [ Printers, file? : File, pn? : PrinterName | pn dom queue queue’ = queue {pn? (queue pn?)^<file> } ] QueueByGroup SelectPrinter >> QueueFile Ideja: Abas shēmas “izpilda” vienlaicīgi; SelectPrinter izejas mainīgais pn! tiek savietots ar QueueFile ieejas mainīgo pn?, abi mainīgie pēc tam tiek no kopējās shēmas paslēpti.
Shēmas: kompozīcija, pārsaukšana [PrinterName, GroupName, File] Printer == seq File Printers [printers: GroupName -+-> P PrinterName, queue: PrinterName -+-> Printer | printers partitions dom queue gn: dom printers printers gn ] PrintersExt [ Printers, selected: PrinterName | selected dom queue queue ] SelectPrinterExt [ PrintersExt, Printers, gn?: GroupName | gn? dom printers selected’ printers gn? ] QueueFileExt [ PrintersExt, file? : File | printers’ = printers queue’ = queue {selected (queue selected)^<file> } ] QueueByGroupExt SelectPrinterExt ; QueueFileExt Ja X un Y ir shēmas ar kopēju stāvokli S, tad X ; Y definē kā S0 X [ _0 / _’ ] Y [ _0 / _ ] -- lietojam sistemātisko pārsaukšanu Shēmu pārsaukšana: NewNamesClass Class [ members/enrolled, passed/tested] ekvivalents ar NewNamesClass [ members, passed : P Student | passed members #members size ]
Entities esm: ESetNm -++-> (F Eid)-- funkcija ar galīgu grafikuem: Eid -++-> Value dom em = (ran esm) ADDES0 Entitieses? : ESetNm es? dom esm esm'= esm {es? {}} em=em' DELES0 Entitieses? : ESetNm es? dom esm esm(es?) = {} esm'= {es?} <-| esm em=em' Tālāks piemērs: Relāciju datu bāze. Entītes, to kopas [Eid, ESetNm,Value] Entities =^= Entities Entities' Entities =^= [ Entities | Entities = Entities' ]
ADDENT0 DELENT0 Entities ; memb? : F ESetNmval?: Value; eid! : Eid Entities eid? : Eid memb? dom esm eid ! dom em em'= em {eid ! val} esm'=esm {es: memb? • es esm(es) {eid !}} eid? dom em em'= {eid?} <-| em esm'= {es: dom esm • es esm(es) \ {eid?}} Relāciju datu bāze - entītes, to kopas (2) Tālāka attīstība: Understanding Differences between VDM and Z, piemērs raksta beigās.
Valodas Z konstrukcijas (pārskats) • Relāciju un funkciju notācija • Globālā mainīgo telpa, shēmai - redzamība no deklarācijas uz priekšu, specifikācija sastāvoša no paragrāfiem • Shēmu operācijas: • dekorācijas • loģiskās kombinācijas, projekcijas, kvantori D | P • S, D | P • S, projekcija - tipiski eksistenciāla kvantifikācija • Ģeneriskās konstrukcijas (shēmas, konstantes) • Izteiksmes: • (…), {…} - kortežs, kopa • P, - apakškopu kopa, Dekarta reizinājums • { | • } - kopas formācija • - funkcijas notācija • - definitīvā izteiksme ( Class | enrolled = - terms ar tipu Class ) • aplikācija • _._ - selektors • - saistījuma (binding) formēšana • atsauce uz shēmu (shēmas vārds + dekorācija).
Valoda Z: no specifikācijām uz implementācijām “Implementācijas” jēdziena vienkārša ilustrācija: jau BirthdayBook piemērā. Gan abstraktā, gan konkrētā mašīnas: aprakstītas, izmantojot shēmas. Konkrētās un abstraktās mašīnas atbilstība: abstrakcijas funkcija: arī aprakstāma, izmantojot shēmas;vispārīgāks gadījums: simulācijas attiecība abstrakcijas funkcijas vietā. Class [ enrolled, tested : P Student | #enrolled size tested enrolled ] DClass [ sarray: (1 .. size) Student , ectr: 0 .. size, tctr : 0 .. size | tctr ectr i, j : 1 .. ectr | i j sarray i sarray j ] DSim [ Class, DClass | enrolled = { i: 1 .. ectr sarray(i) } tested = { i: 1 .. tctr sarray(i) } ] -- “simulācijas” atbilstība Šajā gadījumā DSim ir funkcija (konkrētais stāvoklis viennozīmīgi nosaka abstrakto stāvoli), bet teorētiski var būt iespējamas situācijas, ka abstrakto un konkrēto stāvokļus saistošā attiecība nav funkcionāla. Operāciju korektības nosacījumi (piemērs): (pre Enrol) DSim |-- (pre DEnrol) (pre Enrol) DSim DEnrol |-- Class’ (Enrol DSim’) Iespējams formulēt arī algoritmu dizaina nosacījumus. Z: valoda, kurā iespējams pierakstīt specifikāciju, implementāciju, atbilstības faktu.