valoda z : specifikācijas un implementācijas korektība
DESCRIPTION
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. - PowerPoint PPT PresentationTRANSCRIPT
Valoda Z:Specifikācijas un
implementācijas korektība.
Specifikāciju valodas
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 - sākuma un beigu stāvokļi deklarēti šeitname? : Name; date? : Date
AddBirthday
name? known birthday'= birthday {name? | date?}
FindBirthday BirthdayBook
name? : Name; date! : Date
name? known date ! = birthday (name?)
Remind BirthdayBook
today? : Date; cards ! : PP Name
cards ! = { n: known | birthday (n) = today? }
Dzimšanas dienu reģistrs (turpināts)
Report ::= ok| already_known | not_known - brīvā (induktīvā) tipa definējums
Successresult! : Report
result! = ok
AlreadyKnown BirthdayBook
name? : Name; result ! : Report
name? known result ! = already_known
NotKnown BirthdayBook
name? : Name; result ! : Report
name? known result ! = not_known
RAddBirthday (AddBirthday Success) AlreadyKnownRFindBirthday (FindBirthday Success) NotKnownRRemind Remind Success
InitBirthdayBook == [ BirthdayBook’ | known' = ] Inicializācija:
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: PP 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’ : PP Name birthday’: Name -+-> Date known’ = dom birthday’ known’ =
PP 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ārtojumsShē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 S signatū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: ZZ, b: ZZ | a + b = 10 ]
b: ZZ | b < 13 A [ a: ZZ | b: ZZ 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 Op sā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ātsJa 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 ir Aop 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ēta funkcija – 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
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?}
BirthdayBook ; name? : Name; date? : Date AddBirthday
name? known birthday'= birthday {name? | date?}
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 : 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: 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āmSpecifikā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īkiemWindows vidē – grūti atrast viegli paņemamu un darbināmu.
ZETA http://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\whereknown = \dom birthday\end{schema}
\begin{schema}{AddBirthday}\Delta BirthdayBook \\name?: Name; date!: Date\wherename? \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