210 likes | 385 Views
Valoda Z : Specifikācijas un implementācijas korektība. Specifikāciju valodas. AddBirthday. FindBirthday. Remind. BirthdayBook - sākuma un beigu stāvok ļi deklarēti šeit name? : Name; date? : Date. BirthdayBook name? : Name; date! : Date.
E N D
Valoda Z:Specifikācijas un implementācijas korektība. Specifikāciju valodas
AddBirthday FindBirthday Remind BirthdayBook - sākuma un beigu stāvokļi deklarēti šeitname? : Name; date? : Date BirthdayBookname? : Name; date! : Date BirthdayBooktoday? : Date; cards ! : P Name name? known birthday'= birthday {name? |date?} name? known date ! = birthday(name?) cards ! = {n: known | birthday(n) = today?} Piemērs: Dzimšanas dienu reģ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
Success result! : Report result! = ok AlreadyKnown NotKnown BirthdayBookname? : Name; result ! : Report BirthdayBookname? : Name; result ! : Report name? known result ! = already_known name? known result ! = not_known Inicializācija: Dzimšanas dienu reģistrs (turpināts) InitBirthdayBook == [ BirthdayBook’ | known' = ] Report ::= ok| already_known | not_known - brīvā (induktīvā) tipa definējums RAddBirthday (AddBirthday Success) AlreadyKnown RFindBirthday (FindBirthday Success) NotKnown RRemind Remind Success
Abstrakto datu tipu uzdošana un korektība Abstraktais datu tips: 1) stāvokļu kopa, 2) operācijas maina stāvokļus, ieejas un izejas dati, 3) netukša sākuma stāvokļu kopa. Stāvokļu kopa – uzdota ar stāvokļu shēmām, nelieto elementu dekorācijas. Shēmas stāvokļu kopa – visu shēmai atbilstošo saistījumu (bindings) kopa (saistījumi, kas atbilst shēmas signatūrai un apmierina shēmas īpašību). Operācijas – vienošanās par dekorācijām: tukšā dekorācija – sākuma stāvoklis, dekorācija ’ – beigu stāvoklis dekorācijas ? un ! – operācijas ieejas un izejas mainīgie Operācijas korektība: operācija pabeigs darbu un apstāsies beigu stāvoklī, kas ar operācijas shēmu OpS saistīts ar sākuma stāvokli,ja sākuma stāvoklis apmierina operācijas shēmas sākuma nosacījumu pre OpS(t.i., ja sākuma stāvoklim atbilstošais beigu stāvoklis eksistē). Sākuma stāvokļi: incializācija, svarīgi, lai sākotnējā stāvokļu kopa būtu netukša. Specifikācijas korektības prasības:1) netukša sākuma stāvokļu kopa 2) saturiskajai jēgai atbilstoši pre OpS.
Sākuma nosacījuma korektība Ja stāvokļa shēma ir S un inicializācijas shēma ir Init, tad korektības nosacījums ir: S’ Init BirthdayBook [ known: P Name, birthday: Name-+->Date | known=dom birthday ] InitBirthdayBook [ BirthdayBook’ | known' = ] Sākuma nosacījuma korektība: BirthdayBook’ InitBirthdayBook Pārrakstot: BirthdayBook’ [ BirthdayBook’ | known’ = ] BirthdayBook’ known’ = known’ : P Name birthday’: Name -+-> Date known’ = dom birthday’ known’ = P Name Name -+-> Date true Izmantotie likumi: Shēmas kvantifikācija (sk. nākamo slaidu) Viena punkta likums (one point rule): x: a p x = t t a p [t / x]
Shēmu kvantori: atkārtojums Shēmu kvantori: Ja D ir deklarācija, P – predikāts un S – shēma, kas ir savietojama ar D, tad D | P S un D | P S ir shēmas. Shēmu D | P S un D | P Ssignatūra:no S paslēpjam elementus, kas ietilpst D. Saistījums apmierina D | P Sīpašību, ja visi tā paplašinājumi uz S signatūru, kas apmierina predikātu P, apmierinās arī shēmas S īpašību. Saistījums apmierina D | P Sīpašību, ja eksistē tāds tā paplašinājums uz S signatūru, kas apmierina predikātu P, un apmierina arī shēmas S īpašību. Piemērs A = [ a: Z, b: Z | a + b = 10 ] b: Z | b < 13 A [ a: Z | b: Z b < 13 a + b = 10 ] Vingrinājums Class [ enrolled, tested : P Student | #enrolled size tested enrolled ] ClassInit [ Class’ | enrolled’ = ] Class’ ClassInit ???
Operāciju korektība pre Op- nosacījums uz operācijas shēmas Opsākuma stāvokli un ieejas datiem, 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. Ja S – stāvokļa shēma, Op – operācijas shēma, y!: Y – izejas mainīgais (vienīgais), tad pre Op S’ ; y!: Y Op Piemēri:pre AddBirthday = [BirthdayBook ; name? : Name; date? : Date |name? known] pre FindBirthday = [BirthdayBook ; name? : Name |name? known] Operācija Op pabeigs darbu un apstāsies beigu stāvoklī, kas ar tās shēmu saistīts ar sākuma stāvokli, ja sākuma stāvoklis (un ieejas mainīgie) apmierina operācijas shēmas sākuma nosacījumu pre Op.
Operāciju korektība: turpināts Ja S – stāvokļa shēma, Op – operācijas shēma, y!: Y – izejas mainīgais (vienīgais), tad pre Op S’ ; y!: Y Op Piemēri:pre AddBirthday = [BirthdayBook ; name? : Name; date? : Date |name? known] pre FindBirthday = [BirthdayBook ; name? : Name |name? known] Operācija Op pabeigs darbu un apstāsies beigu stāvoklī, kas ar tās shēmu saistīts ar sākuma stāvokli, ja sākuma stāvoklis (un ieejas mainīgie) apmierina operācijas shēmas sākuma nosacījumu pre Op. 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. Kā pārliecināties par operācijas korektību: izskaitļot tās sākuma nosacījumu, un pārliecināties, ka tas ietver visas situācijas, kurās operācija tiks lietota.
Specifikācijas un implementācijas (1) Valodā Z iespējams definēt arī operāciju specifikāciju precizējuma attiecību (valodā Z attiecību šajā kontekstā nelieto, bet principā tā varētu šeit būt). Vienkāršākais gadījums: abas operācijas ir definētas kā shēmas: Aop – abstraktā operācijaCop – konkrētā operācija, abas operācijas izmanto vienu stāvokļu telpu. Pieņemsim, ka Aop un Cop atbilstošā stāvokļa shēma ir S, ieejas dati ir x?: X, izejas dati y!: Y. Tad Cop irAop precizējums (Aop Cop), ja spēkā 2 nosacījumi: - S; x?: X pre Aop pre Cop(ja Aop garantēti apstājas, tad arī Cop noteikti apstāsies) - S; S’; x?: X ; y!: Y pre Aop Cop Aop(katrs Cop rezultāts situācijā, kad arī Aop bija iespējama, ir arī derīgs Aop rezultāts). Cop var būt definēts plašākai sākuma datu kopai. Attiecībā uz vieniem un tiem pašiem sākuma datiem Cop var piedāvāt lielāku determinitāti (mazāku iespējamā rezultāta variantu izvēli).
Specifikācijas un implementācijas (2) Sakrītoša datu telpa: Aop un Cop stāvokļa shēma ir S, ieejas x?: X, izejas y!: Y. Tad Cop ir Abs precizējums, ja spēkā 2 nosacījumi: S; x?: X pre Aop pre Cop S; S’; x?: X ; y!: Y pre Aop Cop Aop Dažādu stāvokļa telpu gadījums: vairāk matemātiskas datu struktūras var tikt aizstātas ar vieglāk programmistiski realizējamām, piemēram – virknes kopu vietā. Stāvokļu shēmas: AState, CState Abstrakcijas attiecība (shēma) Abs, saista abstraktās un konkrētās stāvokļu telpas, tās signatūra – tā pati, kas shēmai AState CState Tad Cop ir Aop precizējums (atbilstoši shēmai Abs), ja 1) AState; CState; x?: X pre Aop Abs pre Cop(ja Aop apstājas, tad arī atbilstošais Cop noteikti apstājas) 2) AState; CState; CState’; x?: X ; y!: Y pre Aop Abs Cop ( AState’ Abs’ Aop )(katram Cop rezultātam eksistē arī atbilstošs derīgs Aop rezultāts) Papildus nosacījums uz sākuma stāvokļiem: CState’ CInit ( AState’ Abs’ AInit )
Specifikācijas un implementācijas (3) Stāvokļu shēmas: AState, CState Abstrakcijas attiecība (shēma) Abs, saista abstraktās un konkrētās stāvokļu telpas. Tad Cop ir Aop precizējums (atbilstoši shēmai Abs), ja 1) AState; CState; x?: X pre Aop Abs pre Cop 2) AState; CState; CState’; x?: X ; y!: Y pre Aop Abs Cop ( AState’ Abs’ Aop ) Papildus nosacījums uz sākuma stāvokļiem:3) CState’ CInit ( AState’ Abs’ AInit ) Vispārīgajā gadījumā Abs definē patvaļīgu attiecību – vienam abstraktam stāvoklim var atbilst vairāki konkrēti stāvokļi (piemēram, kopai var atbilst dažādas virknes), un otrādi (ja abstraktā stāvoklī ir kāda informācija, kas nav pieejama operācijām). Bieži vien Abs ir visur definētafunkcija – vienam konkrētam stāvoklim atbilst tieši viens abstrakts stāvoklis. Tas ļauj vienkāršot nosacījumus: 2a) AState; CState; AState’; CState’; x?: X ; y!: Y pre Aop Abs Cop Abs’ Aop 3a) AState’ ; CState’ CInit Abs’ AInit
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) AddBirthday BirthdayBook ; name? : Name; date? : Date AddBirthday1 name? known birthday'= birthday {name? |date?} 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"
Dzimšanas dienu reģistrs: pierādījumi 1) AState; CState; x?: X pre Aop Abs pre Cop 2) AState; CState; AState’; CState’; x?: X ; y!: Y pre Aop Abs Cop Abs’ Aop 3) AState’ ; CState’ CInit Abs’ AInit Aplūkojam operāciju AddBirthday: 1) BirthdayBook; BirthdayBook1; name?: Name; date?: Date pre AddBirthday AbsBB pre AddBirthday1 2) BirthdayBook; BirthdayBook1; BirthdayBook’; BirthdayBook1’; name?: Name ; date?: Date pre AddBirthday AbsBB AddBirthday1 AbsBB’ AddBirthday 3) BirthdayBook’ ; BirthdayBook1’ InitBirthdayBook1 AbsBB’ InitBirthdayBook Diskusija: veikt šos pierādījumus, vismaz pārliecināties, ka šīs implikācijas patiesas.
Studiju reģistratora palīgs (atkārtots) [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: ieskats implementācijā 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āvokli)
Studiju reģistratora palīgs: ieskats implementācijā (2) 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āvokli) Operāciju korektības nosacījumi (piemērs): Class; DClass; s?: Student (pre Enrol) DSim (pre DEnrol) Class; DClass; DClass’; s?: Student ; r!: Response (pre Enrol) DSim DEnrol Class’ (Enrol DSim’) Vienkāršāks otrais nosacījums: Class; DClass; Class’; DClass’; s?: Student ; r!: Response (pre Enrol) DSim DEnrol DSim’ Enrol
No specifikācijām uz implementācijām Specifikācija (shēmas) | Detalizācija 1 Dizains (shēmas) | Translācija 1 Algoritms (abstrakta programma) | Detalizācija 2 Kods (aizsargātās komandas) | Translācija 2 Kods (programmēšanas valoda) Detalizācija 1 – tas, ko aplūkojām (specifikācijas un implementācijas attiecības) Abstraktās programmas: specifikācijas, kas satur norādi uz stāvokļu telpu, sākuma un beigu nosacījumu. Detalizācija 2 – pēc analoģijas ar ‘Programmēšana no specifikācijām’ (vai arī var uzprogrammēt atsevišķi un tad pierādīt programmu korektību, izmantojot Hoara loģiku).
Piezīmes par Z atbalsta rīkiem Windows vidē – grūti atrast viegli paņemamu un darbināmu. ZETAhttp://uebb.cs.tu-berlin.de/zeta/ (specifikāciju izspīde, tipu pārbaude, izpilde; konfigurācija ne visai ērta) JAZA – specifikāciju animācija Linux vidē: CZT (Community Z Tools) http://linux.softpedia.com/get/Programming/Code-Generators/Community-Z-Tools-4494.shtml CaDiZ (darbojas arī uz Windows ar Cygwin) http://www-users.cs.york.ac.uk/~ian/cadiz/home.html Piezīme: CaDiZ izmanto ISO 2002 Z standartu, ir atšķirības no “ZRM Z”. Z/EVES no ORA Canada: atbalsts un izplatīšana pārtraukta. Specifikācijas apraksts: izmantojot kādu notāciju speciālo simbolu un shēmu notācijas uzdošanai. Populārākais: teksta procesēšanas sistēmas LaTeX stila izmantošana Izmanto arī troff notāciju (CaDiZ).
Z specifikāciju notācijas (LaTeX), piemērs \begin{zed} [Name, Date] \end{zed} \begin{schema}{BirthdayBook} known : \power Name \\ birthday : Name \pfun Date \where known = \dom birthday \end{schema} \begin{schema}{AddBirthday} \Delta BirthdayBook \\ name?: Name; date!: Date \where name? \notin known \land birthday' = birthday \cup \{name? \mapsto date!\} \end{schema}
Z specifikāciju notācijas: troff (piemērs) .ZS [Name, Date] .ZE .ZS BirthdayBook known : ps Name birthday : Name pfx Date .ZM known = dom birthday .ZE .ZS AddBirthday Delta BirthdayBook name?: Name; date!: Date .ZM name? notmem known and birthday'=birthday sor {name? mlet date!} .ZE