Post on 19-Jan-2016
description
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: NN NN
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 TREEDefinīcija ekvivalenta ar [TREE], kam seko:tip : TREEfork: N TREE TREE >--> TREE
disjoint {tip}, ran fork …
W: P P TREE {tip} fork (| N W W |) W
TREE W
Sākuma piemērs: Dzimšanas dienu reģistrs
[Name, Date] - dotās kopas, vienmēr arī ZZ - dotā kopa
BirthdayBookknown: PP Name - kopas apakškopu kopabirthday: Name -+-> Date - daļēji definēta funkcija
known = dom birthday
BirthdayBook BirthdayBook BirthdayBook' - notācija
BirthdayBook, BirthdayBook' - shēmas dekorācija, beigu stāvoklis name? : Name; date? : Date
AddBirthday
name? known birthday'= birthday {name? date?}
BirthdayBook - sākuma un beigu stāvokļi deklarēti šeitname? : Name; date? : Date
AddBirthday
name? known birthday'= birthday {name? date?}
Dzimšanas dienu reģistrs (2)
BirthdayBook [BirthdayBook | known'= known; birthday' = birthday]
FindBirthday BirthdayBook
name? : Name; date! : Date
name? known date ! = birthday (name?)
FindBirthday BirthdayBook
name? : Name; date! : Date
name? known date ! = birthday (name?) known' = known birthday' =birthday
InitBirthdayBookBirthdayBook'
known' =
Inicializācija:
Remind BirthdayBook
today? : Date; cards ! : PP Name
cards ! = { n: known | birthday (n) = today? }
Operāciju priekšnosacījumipre 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.
BirthdayBook, BirthdayBook'name? : Name; date? : Date
AddBirthday
name? known birthday'= birthday {name? date?}
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).
Successresult! : Report
result! = ok
AlreadyKnown BirthdayBook
name? : Name; result ! : Report
name? known result ! = already_known
Dzimšanas dienu reģ.: specifikācijas papildinājums (2)
RFindBirthday (FindBirthday Success) NotKnown
RRemind Remind Success
NotKnown BirthdayBook
name? : Name; result ! : Report
name? known result ! = not_known
Dzimšanas dienu reģistrs: "implementācija"BirthdayBook1names : NN1 Namedates : NN1 Date ; hwm : NN
i,j : 1 .. hwm i j names (i) names (j)
AbsBBBirthdayBookBirthdayBook1
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?}
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 ZZ, kā arī kopas, kuru vārdi atklāti
specificēti); [Names, Dates]
• Kopas tipi: katrs viena tipa t objektu kopums ir objekts ar tipu PP 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 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, 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.known un 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šība known = dom birthday
Studiju reģistratora palīgs[Student] - dota kopa
size : NN - 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 : NN
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ātsClass [ 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 AlreadyEnrolledTest Testok NotEnrolled AlreadyTestedLeave 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ēmaClass [ enrolled, tested : P Student | #enrolled size tested enrolled ]
[ClassName]
CSResponse ::= … … …
| maxclasses : NN
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 : NN
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 partitions dom queue gn: dom printers printers gn ]
SelectPrinter [ Printers, gn?: GroupName, pn!: PrinterName |gn? dom printerspn! 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 ]
Tālāks piemērs: Relāciju datu bāze. Entītes, to
kopas [Eid, ESetNm,Value]
Entitiesesm: ESetNm -++-> (FF Eid) -- funkcija ar galīgu grafikuem: Eid -++-> Value
dom em = (ran esm)
Entities =^= Entities Entities' Entities =^= [ Entities | Entities = Entities' ]
ADDES0 Entities
es? : ESetNm
es? dom esm esm'= esm {es? {}} em=em'
DELES0 Entities
es? : ESetNm
es? dom esm esm(es?) = {} esm'= {es?} <-| esm em=em'
Relāciju datu bāze - entītes, to kopas (2)
ADDENT0 Entities ; memb? : FF ESetNmval?: Value; eid! : Eid
memb? dom esm eid ! dom em em'= em {eid ! val} esm'=esm {es: memb? • es esm(es) {eid !}}
DELENT0 Entities eid? : Eid
eid? dom em em'= {eid?} <-| em esm'= {es: dom esm • es esm(es) \ {eid?}}
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
– PP, - 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.