23
Specifikāciju valoda Z Specifikāciju valodu pamati

Specifikāciju valoda Z

  • Upload
    rance

  • View
    30

  • Download
    0

Embed Size (px)

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); - PowerPoint PPT Presentation

Citation preview

Page 1: Specifikāciju valoda  Z

Specifikāciju valoda Z

Specifikāciju valodu pamati

Page 2: Specifikāciju valoda  Z

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).

Page 3: Specifikāciju valoda  Z

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

Page 4: Specifikāciju valoda  Z

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?}

Page 5: Specifikāciju valoda  Z

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? }

Page 6: Specifikāciju valoda  Z

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?}

Page 7: Specifikāciju valoda  Z

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

Page 8: Specifikāciju valoda  Z

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

Page 9: Specifikāciju valoda  Z

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.

Page 10: Specifikāciju valoda  Z

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).

Page 11: Specifikāciju valoda  Z

(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

Page 12: Specifikāciju valoda  Z

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 ]

Page 13: Specifikāciju valoda  Z

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) ) ]

Page 14: Specifikāciju valoda  Z

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).

Page 15: Specifikāciju valoda  Z

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

Page 16: Specifikāciju valoda  Z

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 ]

Page 17: Specifikāciju valoda  Z

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.

Page 18: Specifikāciju valoda  Z

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.

Page 19: Specifikāciju valoda  Z

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 ]

Page 20: Specifikāciju valoda  Z

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'

Page 21: Specifikāciju valoda  Z

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.

Page 22: Specifikāciju valoda  Z

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).

Page 23: Specifikāciju valoda  Z

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.