Dette er en hovedoppgave i databehandling til graden cand. scient. ved Institutt for infor- matikk, Universitetet i Oslo.
Det er mange som fortjener en takk i forbindelse med denne oppgaven. Frst og fremst vil jeg takke min veileder Olaf Owe for mange gode forslag til oppgaven og en rekke interessante diskusjoner. Oppgaven bygger pa hans arbeid, og uten dette fundamentet ville det ikke vrt noen oppgave.
Oppgaven har blitt stttet konomisk av NAVF (na NFR), noe jeg selvsagt er takknemlig for.
Takk gar ogsa til Ole-Johan Dahl som pa tross av stort arbeidspress tok seg tid til a lese gjennom oppgaven og komme med nyttige kommentarer.
Videre vil jeg takke Olav Asheim som har prvd a lre meg logikk et uavgjrbart antall ganger. Han har ogsasett pa en tidlig versjon av oppgaven og foreslatt noen forbedringer.
Sigbjrn Nss fortjener en takk for sine forslag til spraklige forbedringer av oppgaven og for sitt bidrag til det sosiale miljet pa I.
Det siste er det ogsamange andre som burde takkes for. Takk til mine sosiale medstudenter.
Dere vet hvem dere er.
Takk til min mor som har oppmuntret meg til a ta utdannelse, og en takk for at hun har passet Siri i innspurten med oppgaven.
Aller mest vil jeg takke Dag som har oppmuntret meg til a arbeide med oppgaven og som har gjort dette mulig ved a passe barn og hjem. Jeg vil ogsa takke ham for at han har kommet med mange konstruktive kommentarer under arbeidet, og for at han har lest oppgaven og kommet med forslag til forbedringer.
Oslo, mai 1994 Kari Asheim
Innhold
1 Innledning 1
2 Bakgrunn 3
2.1 Programmeringsspraket
: : : : : : : : : : : : : : : : : : : : : : : : : : : : :
3 2.2 Hoare-logikk: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :
4 2.3 Egenskaper ved bevissystemer: : : : : : : : : : : : : : : : : : : : : : : : : :
6 2.3.1 Partiell korrekthet, total korrekthet og vranglas: : : : : : : : : : : :
7 2.3.2 Sunnhet: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :
7 2.3.3 Kompletthet: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :
8 2.3.4 Relativ kompletthet: : : : : : : : : : : : : : : : : : : : : : : : : : :
8 2.3.5 Hierarkisk oppbygging av bevis: : : : : : : : : : : : : : : : : : : : :
9 2.3.6 Mytiske variable: : : : : : : : : : : : : : : : : : : : : : : : : : : : :
10 2.4 Historiesekvenser brukt i System 1, 2 og 3: : : : : : : : : : : : : : : : : : :
10 2.4.1 Sekvenser: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :
10 2.4.2 Lokale historiesekvenser: : : : : : : : : : : : : : : : : : : : : : : : :
11 2.4.3 Globale historiesekvenser: : : : : : : : : : : : : : : : : : : : : : : :
12 2.4.4 Oppsplittede historiesekvenser: : : : : : : : : : : : : : : : : : : : :
14 2.5 System 1: Bevissystem uten global invariant: : : : : : : : : : : : : : : : : :
16 2.5.1 Regler: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :
16 2.6 System 2: Bevissystem med global invariant: : : : : : : : : : : : : : : : : :
17 2.6.1 Regler: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :
19 2.7 Andre arbeider: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :
20 2.7.1 Felles variable: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :
20 2.7.2 Kommunikasjon via kanaler: : : : : : : : : : : : : : : : : : : : : : :
22 2.7.3 Vranglas: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :
233.1 Notasjon
: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :
25 3.2 Modell: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :
26 3.3 Regler: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :
27 3.4 Eksempler: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :
28 3.4.1 Et enkelt eksempel med kritisk region: : : : : : : : : : : : : : : : :
28 3.4.2 Produsent- og konsument-prosess: : : : : : : : : : : : : : : : : : : :
30 3.5 Sunnhet: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :
34 3.6 Relativ kompletthet: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :
34 3.7 Diskusjon: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :
444 Vranglas 45
4.1 Modellen for kritisk region
: : : : : : : : : : : : : : : : : : : : : : : : : : : :
45 4.2 Eksempel: Dining Philosophers: : : : : : : : : : : : : : : : : : : : : : : : :
47 4.2.1 Med vranglas: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :
48 4.2.2 Uten vranglas: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :
49 4.3 Prosesser med ere await-setninger: : : : : : : : : : : : : : : : : : : : : : :
49 4.3.1 Eksempel: Alternativ mate a programmere Dining Philosophers: : :
50 4.3.2 Eksempel: Bevis av Dining Philosophers med vranglas: : : : : : : :
52 4.4 Oppsummering: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :
535 Konklusjon 55
Referanser 57
Innledning
Nar vi lager programmer er det viktig at vi kan forsikre oss om at de fungerer som nsket.
A teste programmer vil kunne luke ut en del feil, men for at vi skal kunne vre helt overbevist om at et program oppfyller en spesikasjon, kan det vre nyttig a bruke mer formelle resonnementer.
Spesielt gjelder dette for parallelle programmer. Da har vi ere prosesser som kan utfre sine instruksjoner samtidig. Vi kan som regel ikke vite hvor fort disse prosessene kjrer i forhold til hverandre, og dermed kan vi ikke vite i hvilken rekkeflge operasjonene i programmet utfres. Dette kan ogsavre forskjellig for to eksekveringer av et program og dermed har vi ikke-determinisme.
Dette gjr at antall tilstander for et parallelt program vil vre av samme orden som pro- duktet av antall tilstander i hver prosess. Det blir altsasamange muligheter at vi i praksis ikke klarerateste alle. Dermed er det ikke tilstrekkeliga bare teste programmet, men ogsa ndvendig a kunne resonnere formelt om det. Til dette formalet er det foreslatt en rekke bevissystemer.
For at est mulig korrekt spesiserte programmer skal kunne bevises i et bevissystem, ma systemet vre relativt komplett1. Et bevissystem for parallelle programmer ma ha med mytiske variable for at det skal vre relativt komplett. I [Owe92] er det gitt et bevissystem der det brukes historiesekvenser som mytiske variable. I disse tar vi vare pa informasjon om hva hver enkelt prosess har gjort med felles variable. Dette bevissystemet er relativt komplett.
Det er interessantase hvor lite informasjon som kan tas vare pa i mytiske variable uten at vi mister kompletthet. I [Owe92] foreslas det a fjerne en del informasjon om rekkeflge av operasjoner. For hver variabel skal det tas vare pa en sekvens av tilordnete verdier og en sekvens av leste verdier. Det argumenteres for at det er mulig a lage et slikt bevissystem som er relativt komplett.
I denne oppgaven vil jeg gjre som foreslatt i [Owe92], men i tillegg vil jeg ogsa fjerne sekvensene av leste verdier. Det eneste som tas vare paav historieinformasjon er sekvensene av verdier som er tilordnet til felles variable. Jeg lager et bevissystem med redusert mengde av mytiske variable og viser at dette er relativt komplett.
1Uttrykketrelativt komplett og andre begreper deneres i neste kapittel.
Det gis ogsa et par eksempler pa hvordan vi kan lage beviser med sa lite historieinfor- masjon som beskrevet ovenfor. Spesielt vil jeg se pa et produsent-konsument-eksempel som illustrerer hvordan vi ma ga frem for a bevise synkronisering av prosesser.
Videre vil jeg ta for meg hvordan vranglas/fravr av vranglas kan bevises i et av bevissys- temene fra [Owe92].
Leseren av denne oppgaven br ha god kjennskap til hvordan programmer veriseres. Dette grunnlaget kan komme fra kurset i programspesikasjon- og verikasjon som undervises ved instituttet [Dah92]. Videre er det en fordel a kjenne til verikasjon av parallelle program- mer, noe som ogsa undervises ved instituttet [Dah93]. Det kan ogsa vre nyttig med noe mer kunnskaper om logikk, slik at begreper som sunnhet og kompletthet er godt kjent.
Oppgaven er bygget opp slik:
I kapittel 2 gis bakgrunnen for oppgaven. Her nnes syntaks for programmeringsspraket vi ser pa, Hoare-logikk for sekvensielle programmer og en beskrivelse av bevissystemene fra [Owe92]. Videre forklares notasjonen som brukes i disse bevissystemene og noen sentrale begreper som f.eks. relativ kompletthet. Jeg ser ogsalitt pahva andre har gjort forabevise parallelle programmer.
Kapittel 3 inneholder bevissystemet der kun verdier av variable og historiesekvenser av tilordnete verdier kan brukes i spesikasjonen. Det blir gitt noen eksempler pa hvordan systemet brukes. Videre vises det at bevissystemet er komplett, og det argumenteres for at det (opplagt) ma vre sunt.
I kapittel 4 forklares det hvordan vi i et bevissystem fra [Owe92] kan vise vranglas/fravr av vranglas. Det bevises at ulike programmeringsstrategier for \Dining Philosophers" er fri fra vranglas/kan ga i vranglas.
Kapittel 5 inneholder en kort oppsummering.
Bakgrunn
I dette kapitlet beskrives frst det programmeringsspraket jeg behandler. Videre gis en kort oppsummering av hvilke regler jeg bruker fra Hoare-logikk for sekvensielle program- mer. Dernest flger en kort diskusjon om relativ kompletthet, som gjelder for Hoare-logikk (bade for sekvensielle og parallelle programmer). Jeg tar ogsa for meg hvordan histo- riesekvenser brukes som mytiske variable i bevissystemene. Bevissystemene i [Owe92] som denne oppgaven bygger pa presenteres, og til slutt ser jeg pa en del andre arbeider som behandler parallelle programmer med felles variable.
2.1 Programmeringsspraket
Det programmeringsspraket jeg ser pa er et enkelt ALGOL-aktig programmeringssprak utvidet med parallell sammensetning,
cobegin P
1 k kP
ncoend
, derP
1;:::;P
n er prosesser som utfres i parallell. Disse prosessene kan referere til felles variable, men bare slik at hver tilordningssetning i en prosess kan ses pa som en udelelig hendelse. Vi kan ikke anta noe om den relative hastigheten til de ulike prosessene, sa programmereren ma selv srge for eventuell synkronisering ved hjelp avawait
-konstruksjonen, som beskrives nedenfor. BNF-syntaksen for spraket ser slik ut:hstmti ::=hassigni hskipi hifi hwhilei hcompi hcobegini
hassigni ::=hvari:=hexpi
hskipi ::=
skip
hifi ::=
if
hexpithen
hstmtielse
hstmtihwhilei ::=
while
hexpido
hstmtiod
hcompi ::=hstmti ; hstmti
hcobegini ::=
cobegin
hprocessi k k hprocessicoend
hprocessi ::=hpstmti
hpstmti ::=hpassigni hskipi hpifi hpwhilei hpcompi hawaiti
hpassigni ::=hlocal vari:=hshared expi hvari:=hlocal expi
hpifi ::=
if
hlocal expithen
hpstmtielse
hpstmtihpwhilei ::=
while
hlocal expido
hpstmtiod
hpcompi ::=hpstmti ; hpstmti
hawaiti ::=
await
hexpido
hcstmtiod
hcstmti ::=hassigni hskipi hcifi hcwhilei hccompi
hcifi ::=
if
hexpithen
hcstmtielse
hcstmtihcwhilei ::=
while
hexpido
hcstmtiod
hccompi ::=hcstmti ; hcstmti
Som vanlig i sekvensielle programmer brukes hvari for en variabel og hexpi for et ut- trykk med konstanter, variable og operasjoner padisse. Datatypene som brukes er vanlige, statiske typer som heltall, boolske og arrayer av disse. Deklarasjoner gjres ikke eksplisitt i programmeringsspraket, men det er enkelt a ta dette med om nskelig. Variable som refereres til utenfor
cobegin ::: coend
eller i ere prosesser er felles, mens variable som bare refereres til i en prosess er lokale.Vi antar at alle uttrykk er veldenerte. Et eksempel pa et uttrykk som ikke er veldenert, er
a=b
narb
= 0. Videre antar vi at at alle funksjoner er totale, dvs. funksjoner som gir veldenerte verdier for alle veldenerte argumenter av riktig type.Nar det bare starhvari ellerhexpi er det ingen begrensning pa om variable som brukes er lokale eller felles. Inne i prosessene nsker viabetrakte hver programsetning som en udelelig operasjon. Dermed kan det bare tilordnes til en felles variabel, eller leses en felles variabel.
Uttrykkethshared expi i BNF-syntaksen inneholder en referanse til felles variable. Resten av tilordningssetningen og tester i
if
/while
-setninger skal ikke inneholde noen referanse til felles variable, og dette uttrykkes somhlocal vari/hlocal expi. Vi kan tillate ere referanser til felles variable ved a legge pa en implisitt kritisk region.await
hexpido
hcstmtiod
er kritisk region der hexpi er ventebetingelse og hcstmti er\innmat". En kritisk region implementeres som en udelelig operasjon, saher kan vi referere til sa mange felles variable vi nsker pa en gang. Det er vanskelig a lage en eektiv implementasjon av denne formen for kritisk region, men reglene for denne konstruksjonen kan lett tilpasses til den maten kritisk region er implementert pa i praksis. Nesting av kritiske regioner er ikke tillatt, men dette er heller ikke noe poeng, siden vi allerede har eksklusiv aksess til samtlige felles variable.
Nestede
cobegin ::: coend
-setninger er heller ikke tillatt, fordi det kompliserer bevissys- temet. Det burde imidlertid vre mulig a utvide systemet slik at dette kan tillates.2.2 Hoare-logikk
De bevissystemene jeg ser pai denne oppgaven bygger paHoare-logikk slik Hoare denerte den i [Hoa69]. Jeg bruker samme notasjon som i [Dah92], og denne avviker litt fra den Hoare opprinnelig brukte. Dette er ikke noen innfring i Hoare-logikk, bare en rask oppsummering av hvilke regler jeg skal bruke i denne oppgaven. Se [Dah92] for en grundig innfring i emnet.
Flgende notasjon brukes:
P
xe representerer utsagnet vi far ved a erstatte alle frie forekomster av variabelenx
iP
med uttrykkete
.V[
P
] er mengden av frie variable iP
hvisP
er et utsagn eller mengden av variable det refereres til iP
hvisP
er en programsetning.W[
S
] er mengden av variable som tilordnes i programsetningenS
. I Hoare-logikk ser vi pa utsagn pa formenf
P
gS
fQ
gder
S
er en program-setning ogP
ogQ
er utsagn i frste ordens logikk. Dette utsagnet kan vi tolke somHvis forbetingelsen
P
holder fr en eksekvering av programbitenS
, og eks- ekveringen terminerer normalt, sa vil bakbetingelsenQ
holde etter at eks- ekveringen har terminert.La
x
vre vektoren av variable i programmet, og la1og2 vre tilstander som gir verdier til variablene. Et programS
kan tolkes som en relasjon over to tilstander i et pa forhand denert tilstandsrom. La 1S
2 bety at en eksekvering avS
som starter i tilstand 1 kan terminere normalt i tilstand 2. Da kan meningen av et program uttrykkes mer formelt somf
P
gS
fQ
g , 81;
2jP
x1 ^1S
2)Q
x2I denne fremstillingen er det tatt med ere regler enn Hoare hadde i sin opprinnelige artikkel. Flgende aksiomskjemaer er tatt fra [Dah92]:
AS: f
P
xegx
:=e
fP
gCONS: f
P
gS
fP
g for V[P
]\W[S
] =;SKIP: f
P
gskip
fP
gFra samme sted har jeg tatt med disse reglene:
SEQ: f
P
gS
1fQ
g;
fQ
gS
2fR
gf
P
gS
1;S
2fR
gTDIF: f
P
^e
gS
1fQ
g;
fP
^:e
gS
2fQ
gf
P
gif e then S
1else S
2 fQ
gWDO: f
I
^e
gS
fI
gf
I
gwhile e do S od
fI
^:e
gCQL (Left Consequence):
P
)P
0;
fP
0gS
fQ
gf
P
gS
fQ
g CQR (Right Consequence):fP
gS
fQ
0g; Q
0)Q
f
P
gS
fQ
gCJ (Conjunction): f
P
gS
fQ
1g;
fP
gS
fQ
2gf
P
gS
fQ
1^Q
2g DJ (Disjunction): fP
1gS
fQ
g;
fP
2gS
fQ
gf
P
1_P
2gS
fQ
gEXST: f
P
gS
fQ
gf9
z
jP
gS
fQ
g forfz
g\(V[S
][V[Q
]) =;UNIV: f
P
gS
fQ
gf
P
gS
f8z
jQ
g forfz
g\(V[P
][V[S
]) =; Disse reglene brukes utenforcobegin ::: coend
og nar betingelsene ikke refererer til felles variable. Reglene brukes ogsai de delene av en prosess som ikke refererer til felles variable, og der denne prosessen har eksklusiv aksess til felles variable. Siden tester iif/while
- setninger ikke kan referere til felles variable, kan de tilhrende reglene brukes direkte i bevissystemene.Andre regler enn de som er gitt her, f.eks. for andre konstruksjoner i sekvensielle pro- grammer kan selvflgelig ogsa brukes. Det er da viktig a passe pa at kravet om atomiske operasjoner overholdes.
Reglene som er gitt her er bare for konstruksjoner i sekvensielle programmer, sa i tillegg madet gis regler for de programkonstruksjonene som nnes for parallelle programmer. Jeg vil senere i denne oppgaven se pa ere slike regelsett.
2.3 Egenskaper ved bevissystemer
I dette avsnittet vil vi se pa flgende begreper: partiell korrekthet, total korrekthet, vranglas, sunnhet, kompletthet, relativ kompletthet og hierarkisk oppbygging av bevis.
2.3.1 Partiell korrekthet, total korrekthet og vranglas
A bevise en spesikasjon av et sekvensielt program som denert i avsnitt 2.2, kalles a bevise partiell korrekthet. Dersom vi ogsa viser at et program terminerer, kalles det total korrekthet.
Det kan vre erearsaker til at et parallelt program ikke terminerer. I tillegg til de samme problemene som vi vil ha for sekvensielle programmer kan et parallelt program gai vranglas.
Vi bruker flgende denisjon av total vranglas:
Alle prosesser som ikke har terminert er i venting.
I tillegg kan vi ha partiell vranglas, der bare en del av prosessene er blokkert. I dette tilfellet vil hver blokkerte prosess vente pa en annen prosess som ogsa er blokkert.
Begrepene partiell og total korrekthet kan generaliseres til ogsaa gjelde for parallelle pro- grammer. Ofte brukes begrepene safety og liveness. Safety-egenskaper brukes forauttrykke at ikke noe galt kan skje, mens liveness-egenskaper brukes forauttrykke at noe (riktig) vil skje.
I flge denne denisjonen er fravr av vranglas en safety-egenskap, og denne egenskapen ved et program br kunne bevises i et bevissystem for partiell korrekthet.
2.3.2 Sunnhet
For a verisere programmer er det ikke tilstrekkelig a bruke bare Hoare-logikk. Vi trenger i tillegg et deduktivt system, og da er det vanlig a bruke frste ordens logikk slik vi gjr i konsekvensreglene, LCQ og RCQ. Videre er det ndvendig med et aksiomsystem for hver datatype vi bruker. For enkelhets skyld er det vanlig a anta at vi bare har med datatypen naturlige tall og at aksiomsystemet er Peano-aritmetikk. Disse resonnementene kan utvides til ogsaa gjelde for andre datatyper.
Litt upresist kan vi si at en tolkning bestar av et domene, dvs. en mengde av termer, og en tilordning av verdier til funksjoner/relasjoner over disse. Flgende notasjon benyttes for sann, gyldig og bevisbar:
j=T
P
| utsagnetP
er sant i tolkningenT
.j=
P
| utsagnetP
er gyldig, dvs. sant i alle tolkninger.j B
P
| utsagnetP
kan vises i bevissystemetB
.Sunnhet vil si at alt vi kan vise med bevissystemet er gyldig. Formelt kan sunnhet av et bevissystem for spesikasjon av programmer uttrykkes som
Hvis
A
j (H;D)fP
gS
fQ
g, saj=T fP
gS
fQ
ghvor (
H;D
) er bevissystemet (Hoare-logikk og frste ordens logikk),T
star for en tolkning ogA
er mengden av utsagn som er sanne iT
. Siden vi ser pa naturlige tall vilA
inneholde alle sanne utsagn fra Peano-aritmetikk. Sunnhet br vre et minimumskrav til et bevis- system, selv om det er lett a lage gale regler. I litteraturen er det ere eksempler pa slike feil, spesielt gjelder dette reglene for prosedyrekall [Coo78].2.3.3 Kompletthet
Kompletthet er det motsatte av sunnhet, dvs. at alt som er gyldig, kan bevises. Dette kan formelt uttrykkes slik
Hvisj=T f
P
gS
fQ
g, saA
j (H;D)fP
gS
fQ
gDessverre er det umulig a nne et bevissystem for verikasjon av programmer som er komplett, ogsa selv om det deduktive systemet i bunnen er komplett.
Vi lar det deduktive systemet besta av frste ordens logikk og Presburger-aritmetikk, og dette systemet er komplett. Hvis vi ser pa dette systemet i sammenheng med stoppeprob- lemet, vil vi nne ut hvorfor et komplett bevissystem for verikasjon av programmer ikke kan nnes.
Presburger-aritmetikk er det samme som Peano-aritmetikk uten multiplikasjon. Mengden av utsagn som kan vises fra aksiomene i Presburger-aritmetikk er rekursivt enumererbar, dvs. det er mulig a lage en algoritme som lister opp mengden, og alle elementene vil fr eller senere komme med1.
Paden annen side har vi stoppeproblemet som er uavgjrbart. Dette innebrer at mengden av programmer paformenf
P
gS
ffalse
gikke er rekursivt enumererbar. Hvis denne mengden var rekursivt enumererbar, ville vi ha en lsning pa stoppeproblemet. Foranne ut om et gitt program ikke stopper, kunne vi bare liste opp alle programmer som ikke stopper, og fr eller senere ville vi komme til det spesielle programmet.Siden denne mengden ikke er rekursivt enumererbar vil det ikke vre mulig a lage et bevissystem basert pa frste ordens logikk og Presburger-aritmetikk, som kan bevise alle programmer pa formen f
P
gS
ffalse
g. Vi kan altsa ikke nne et komplett bevissystem basert pa dette deduktive systemet.2.3.4 Relativ kompletthet
Heldigvis kan vi likevel si noe om kompletthet. Cook [Coo78] tar utgangspunkt i en interpre- tiv modell og denerer kompletthet relativt til denne. Dette kaller han relativ kompletthet, men denne formen for kompletthet kalles ogsa Cook-kompletthet i litteraturen.
En betingelse for relativ kompletthet hos Cook er at vi kan uttrykke sterke nok betingelser.
Dersom det for en gitt tolkning og en gitt klasse programmer for enhver forbetingelse,
P
, og enhver programbit,S
, er mulig a formulere bakbetingelsen,Q
, i spraket vart, sier vi at spraket er uttrykksfullt (expressive) relativt til tolkning og klassen av programmer.1Mengden av naturlige tall er rekursivt enumererbar.
Anta at vi har en tolkning, en klasse av programmer og et sprak som er uttrykksfullt relativt til tolkningen og klassen av programmer. Et bevissystem er relativt komplett hvis vi for hver slik tolkning kan bevise mengden av programmer som er sanne i tolkningen, med utsagn som kan bevises fra teorien som antagelse.
De tolkninger som gir uttrykksfullhet for det spraket vi ser pavil for Peano-aritmetikk vre standardmodellen2 eller en tolkning der domenet er en endelig delmengde av de naturlige tallene.
Relativ kompletthet kan dermed uttrykkes som Hvisj=T0 f
P
gS
fQ
g, saA
j (H;D)fP
gS
fQ
gder
T
0 er standardmodellen for Peano-aritmetikk, eventuelt en annen tolkning som gir uttrykksfullhet.Denne fremstillingen er svrt kort. I [Apt81] er det gitt en mer detaljert fremstilling, og der bevises sunnhet/kompletthet for ere programkonstruksjoner for sekvensielle programmer.
2.3.5 Hierarkisk oppbygging av bevis
Et program i det spraket vi ser pa vil vre bygget opp av delprogrammer. Det er nskelig a kunne benytte den strukturen dette gir i beviset av programmet. Dette nsket kan formuleres som prinsippet om hierarkisk oppbygging av bevis (principle of compositional program verication), se f.eks. [Zwi89]:
\Spesikasjonen av et program br kunne bevises utfra spesikasjonene av de syntaktiske delene av programmet, uten at det skal vre ndvendig a kjenne innmaten i disse delene."
Dette innebrer at vi kan bevise en isolert del av programmet av gangen, og det blir enklere a lage et bevis som er hierarkisk oppbygget enn et som ikke er det. Spesielt tydelig blir dette hvis vi ser pa parallelle programmer der kompleksiteten av bevis kan bli svrt stor.
I beviset av en prosess kan vi bruke betingelser om globale tilstander, men vi kan ikke bruke lokale betingelser fra en annen prosess, for at kravet om hierarkisk oppbygging skal vre overholdt.
All spesikasjon kan vre i en global invariant, som inneholder all informasjon om alle prosesser. Dette vil ikke gi noen reduksjon i kompleksiteten i spesikasjonen av delene i forhold til spesikasjonen av hele programmet, sakravet ovenfor kan med fordel forsterkes.
Ideelt sett nsker vi oss at kompleksiteten av beviset av hele programmet skal vre av samme orden som summen av kompleksitetene av bevisene for hver prosess, ikke av samme orden som produktet. Det kan virke som dette kravet er noe sterkt, men vi br kunne ha noe reduksjon i kompleksitet av delbevisene for en prosess i forhold til beviset av hele programmet.
2Standardmodellen for de naturlige tallene skiller seg fra en ikke-standardmodell ved maten1, uendelig, behandles pa.
2.3.6 Mytiske variable
Mytiske variable er variable som tas med i et program bare for a lette gjennomfringen av et bevis. Slike variable vil ikke bidra noe til resultatet av programutfrelsen, og som et siste skritt i beviset av et program kan de derfor fjernes. Mytiske variable kan ikke brukes pa hyre side i en tilordning til programvariable, siden dette vil ha eekt for resultat av programmet. I en tilordning til mytiske variable trenger vi imidlertid ikkeata slike hensyn.
For a fa relativ kompletthet av et bevissystem for parallelle programmer ma vi kunne uttrykke tilstrekkelig sterke betingelser. Inne i parallelle prosesser er det ndvendig med mytiske variable for a fa til dette. En av de frste som brukte dette i et bevis var Brinch Hansen [Bri73]. I [Owi75] vises det at det er ndvendig a ta med mytiske variable fora fa kompletthet av et bevissystem.
Det er ere muligheter for hva slags mytiske variable vi kan bruke. F.eks. er det i [Owi75]
opp til den som veriserer et program a velge riktige mytiske variable selv, og det er gitt en generell regel for handtering av mytiske variable. Dersom disse mytiske variablene skal endre verdi i lpet av programmet, ma brukeren selv skrive mytiske programsetninger for a oppdatere variablene.
Ofte er det imidlertid vanlig at de mytiske variablene er en del av det formelle systemet, og at det ikke er ndvendig med mere mytisk informasjon enn det som er innbakt i sys- temet. Dette er tilfelle i de bevissystemene jeg ser pa i denne oppgaven. Her brukes historiesekvenser som tar vare pa informasjon om hva som er skjedd med de felles variab- lene.
2.4 Historiesekvenser brukt i System 1, 2 og 3
I dette avsnittet presenteres de mytiske variablene som brukes i bevissystemene i denne oppgaven. De er en del av bevissystemet, og en bruker trenger ikke tenke paa skrive kode for a oppdatere dem.
2.4.1 Sekvenser
Siden sekvenser er viet samye oppmerksomhet i denne fremstillingen, vil jeg kort oppsum- mere de funksjonene for sekvenser som benyttes i denne oppgaven:
"
| den tomme sekvensenh
x
1;:::;x
ni| sekvensen med elementenex
1,:::
,x
n
q
`x
| legg til et element til hyre i en sekvens
x
aq
| legg til et element til venstre i en sekvens
q
`ar
| konkatener to sekvenser#
q
| lengden av en sekvens
rt
(q
) | right term, hyre element av en sekvens
q
[i
] | indeksering, element nr.i
fra en sekvens
q
[i
:j
] | delsekvens, f.o.m. element nr.i
t.o.m. element nr.j
3
q=m
| projeksjon pa en mengdem
. Resultatet av denne er en sekvens med kun de elementene som ogsa nnes im
En fullstendig denisjon av disse funksjonene nnes i [Dah92], og der nnes ogsa denisjo- nen av flgende predikat:
q head r
|q
er en headsekvens (preks) avr
og et predikat for etting av to sekvenser, som jeg bruker denne generelle varianten av:
q ismerge q
1;:::;q
n |q
er en etting av sekvenseneq
1;:::;q
nEn etting av sekvenser vil si at i uttrykket over vil
q
inneholde alle elementene fra sekvenseneq
1;:::;q
n. Rekkeflgen av elementene i sekvensenq
i, (i
= 1;:::;n
), vil vre den samme som iq
nar vi ser bort fra elementer de andre sekvensene er opphav til.2.4.2 Lokale historiesekvenser
Vi skal se hvordan vi kan ta vare pa all informasjon om manipulering med felles variable sett fra en prosess. En slik historiesekvens
h
i kalles lokal fordi den hrer sammen med prosessi
og inneholder det vi kan vite lokalt i denne prosessen. Den kan besta av flgende typer av elementer:(!
j;e
) | tilordnet verdiene
til variabelenr
j(?
j;e
) | lest verdiene
fra variabelenr
j(??
r
) | inngang til kritisk region, lest vektoren av verdierr
fra variablene(!!
r
) | utgang av kritisk region, tilordnet vektoren av verdierr
til variablene!
j
og ?j
er navn som konstrueres utfra indeksen til variabelr
j i vektoren av felles variable.De brukes bare som konstanter i en historiesekvens for a angi hvilken variabel som er tilordnet/lest, og de vil ikke bli endret ved anvendelse av Hoare-regler.
En kritisk region kan vi tenke pa som at alle variable leses ved starten av den. Deretter kan alle felles variable leses/tilordnes fritt uten at dette avleires i historiesekvensen, og til slutt har vi en tilordning til alle variablene.
La
x
ogy
vre felles variable ogv
lokal variabel i prosessP
1 i flgende eksempel:3I [Dah92] er denne denert slik ati:jkan erstattes av en vilkarlig sekvens av naturlige tall.
x
:= 0;y
:= 0;cobegin P
1 ::x
:= 3;v
:=y
k
P
2 ::await x
= 3do x
:=y
+ 1coend od
Det vil alltid vre en denert ordning av variablene. I sekvensene i dette eksemplet lar vi
x
ha indeks 1 ogy
indeks 2 i vektoren av felles variable.Vi vet flgende om hvordan de lokale historiesekvensene
h
1 ogh
2 ser ut pa slutten av hver prosess (men frcoend
) i en eksekvering av dette programmet:
h
1 =h(!1;
3);
(?2;y
)i | Vi kan ikke vite hvilken verdi som ble lest i andre element (utenase paresten av programmet). I praksis vil det by paproblemerabrukey
inne i en historiesekvens. Hvisy
far en ny verdi senere i prosessen, vil historiesekvensen vre gal.
h
2 = h(??(3;y
));
(!!(y
+ 1;y
))i | Her vet vi at verdien avy
i andre element er den samme som den som ble lest i frste element, og verdien avx
i andre element er verdien avy
fra frste element pluss 1.Som sagt kan vi ikke vite lokalt i en prosess hvilke verdier som blir lest fra de felles variablene i dette eksemplet, selv om vi lett ser hvilke verdier det dreier seg om ved a se pa hele programmet. Informasjonen i lokale historiesekvenser skal bare inneholde det vi vet lokalt i en prosess. Etter
coend
kan vi imidlertid se pa alle historiesekvensene og nne ut hvordan en etting av dem ma vre. Da kan vi ogsa nne de manglende verdiene.2.4.3 Globale historiesekvenser
Istedenfor a se pa informasjonen lokalt, kan vi se pa alle prosessene og konstruere en global historiesekvens, som tar med all ndvendig informasjon fra alle prosessene. Flgende elementer kan nnes i en global historiesekvens
h
:(
i
!j;e
) | prosessi
har tilordnet verdiene
til variabelenr
j(
i
?j
) | prosessi
har lest variabelenr
j. Verdien blir ikke tatt vare pa(
i
!!r
) | utgang fra kritisk region, prosessi
har tilordnet vektoren av verdierr
til alle variableneMerk at vi her tar med
i
, prosessidentikasjon for prosessP
i, slik at vi far med informasjon om hvilken prosess som gjorde hva. Det er ingen verdi-del i ?-elementet, bare angivelse avhvilken variabel som ble lest. Dette er fordi vi kan nne verdien ved a se tilbake til siste tilordning, eventuelt initialverdien, i en global historiesekvens. ??-elementet er ogsafjernet, fordi verdiene som ble lest kan nnes ved a se pa resten av sekvensen. Slik kritisk region er denert vet vi at et ??-element skal etterflges av et tilhrende !!-element.
For a nne verdien av en variabel i en historiesekvens kan vi bruke flgende funksjon:
final
j(q
) =rt
((!!r
0aq
):values
j)der
values
j plukker ut verdidelen av de elementene som refererer tilr
j, ogr
0 er vektoren av variablenes initialverdier. Hvis vi brukerfinal
j pa en global historiesekvens, vil vi fa den verdien som sist er tilordnet tilr
j av en av prosessene, altsaden riktige verdien. Brukes den pa en lokal sekvens far vi den siste verdien som er lest eller tilordnet av denne prosessen.Dette er ikke ndvendigvis den verdien variabelen har i yeblikket.
All informasjonen som bare er implisitt i
h
, kan gjres eksplisitt ved a bruke funksjonenexpl
, denert som flger:expl
("
) ="
expl
(q
`(i
?j
)) =expl
(q
)`(i
?j;final
j(q
))expl
(q
`(i
!j;a
)) =expl
(q
)`(i
!j;a
)expl
(q
`(i
!!::a
j::
)) =expl
(q
)`(i
??::final
j(q
)::
)`(i
!!::a
j::
)For a konstruere en lokal historiesekvens
h
i, fra en global kan vi bruke en funksjonlocal
i(q
), som erexpl
(q
)=i
med prosessidentikasjoneni
fjernet fra hvert element.der
expl
(q
)=i
betyr sekvensen av elementer fraexpl
(q
) som har prosessidentikasjoni
. Eksemplet over vil gi flgende to muligheter for den globale historiesekvensen, slik ath
1 =local
1(h
) ogh
2 =local
2(h
):
h
=h(1!1;
3);
(1?2);
(2!!(1;
0))i
h
=h(1!1;
3);
(2!!(1;
0));
(1?2)iMerk at sekvensen ma begynne med elementet (1!1
;
3) pa grunn av ventebetingelsen iawait
-setningen.Fra disse mulige
h
'ene, initialverdiene til variablene og funksjonene denert over kan vi konstruere lokale historiesekvenser, og i disse vil vi vite hvilke verdier som kan vre lest (og dermed tilordnet etterpa) i hver prosess.All informasjon som er tilgjengelig kan samles i en global historiesekvens, som beskrevet over. Imidlertid er dette svrt mye a holde rede pa. Ofte har vi ikke sa mye informasjon som i eksemplet over, og ofte kan vi nske a ikke vre ndt til a spesisere hele historien.
Flgende kortnotasjon brukes for a projisere historiesekvensene
h
ellerh
i pa en passende mengde av elementer:
q=
! | projeksjon pa elementer som har med tilordning a gjre, !j
- og !!-elementer
q=
? | projeksjon pa ?j
- og ??-elementer
q=
!j
| er en forkortelse for (q=
!):values
j, dvs. verdidelen av de elementene som har som eekt tilordning til variabelenr
j
q=
?j
| forkortelse for (q=
?):values
j, dvs. verdidelen av elementene for lesing av variabelenr
j
q=i
| projeksjon pa elementer som tilsvarer en operasjon utfrt av prosessi
2.4.4 Oppsplittede historiesekvenser
Vi kan splitte historiesekvensene
h
i ogh
opp i ere sekvenser som hver inneholder mindre informasjon, men som tilsammen er ekvivalent med de historiesekvensene som er introdusert sa langt.For hver variabel kan vi lage en sekvens av tilordnete verdier og en sekvens av leste verdier.
For ikke a miste informasjon under oppsplittingen ma vi ogsa ha en sekvens som holder rede pa rekkeflgen de ulike operasjonene er utfrt i. Globalt ma denne ogsa inneholde prosessidentikasjon for at all informasjon skal vre tilgjengelig.
For
m
felles variable far vi flgende 2m
+ 1 sekvenser som en lokal historiesekvens,h
i, kan splittes opp i:!
r
j |h
i=
!j
, en sekvens for hver variabelr
j, som inneholder de verdiene som er tilordnet til denne variabelen?
r
j |h
i=
?j
, en sekvens for hver variabelr
j med verdier som er lest| en sekvens for hele prosessen, som inneholder rekkeflgen de ulike operasjonene er utfrt i, dvs. elementer av typen !
j
1, ?j
3, ?? og !!Den globale historiesekvensen med ?-informasjonen eksplisitt,
expl
(h
), deles opp i til- svarende 2m
+ 1 sekvenser. For a bevare all informasjon ma inneholde prosessidenti- kasjon ogsa, dvs. elementer av typen 3!j
4, 2?j
1, 2?? og 1!!.Dette gir to sett med sekvensvariable med identiske navn i de to settene. Vi kan tillate a snakke om de lokale variablene globalt, og for a unnga navnekonikt, prekses de med
prosessnavn,
P
i.Vi ser nok en gang pa det samme eksemplet. Dette vil gi flgende lokale, oppsplittede sekvenser for prosess
P
1:!
x
=h3i?
x
="
!
y
="
?
y
=hy
i| lokalt kan vi ikke vite hvilken verdi som ble lest, og som nevnt i eksemplet medh
i kan det vre dumt a brukey
i spesikasjonen av historiesekvensen. Derfor vil vi ofte bare si #?y
= 1.=h!1
;
?2iog vi vet flgende om sekvensene for prosess
P
2:!
x
=hy
i| vi vet ikke hvilken verdi som ble tilordnet, bare at denne er liky
som ble lest ved inngang til kritisk region, og ikke er endret enna.?
x
=h3i!
y
=hy
+ 1i?
y
=hy
i=h??
;
!!iSom nar vi hadde hele historien samlet i en sekvens kan vi vite sammenhengen mellom verdiene som ble lest og tilordnet i
await
-setningen: !y
[1] = ?y
[1] og !x
[1] = ?y
[1]+1. Det er bedreabruke dette i spesikasjonen sammen med informasjon om lengden av sekvensene enn a referere tily
.Vi far flgende globale sekvenser:
!
x
=h3;
1i?
x
=h3i!
y
=h0i?
y
=h0;
0i=h1!1
;
1?2;
2??;
2!!ieller =h1!1;
2??;
2!!;
1?2iLegg merke til at elementet 2?? skal matche med et element fra begge ?-sekvenser, siden inngang til kritisk region kan ses pa som lesing av alle felles variable. For 2!! ma vi ha et matchende element i hver !-sekvens.
Vi vet ogsa flgende om de lokale sekvensene, sett fra et globalt synspunkt:
P
1!x
=h3i
P
1?x
="
P
1!y
="
P
1?y
=h0i
P
1:
=h!1;
?2i
P
2!x
=h1i
P
2?x
=h3i
P
2!y
=h0i
P
2?y
=h0i
P
2:
=h??;
!!iDe historiesekvensene som er presentert i dette avsnittet inneholder svrt mye informasjon.
Faktisk er mye av denne informasjonen overdig. Som vi skal se senere i oppgaven klarer vi oss med en delmengde av de oppsplittede sekvensene som eneste mytiske variable, uten at vi mister kompletthet av bevissystemet.
2.5 System 1: Bevissystem uten global invariant
Det frste bevissystemet fra [Owe92] bygger pa en modell for parallelle programmer. I denne modellen vil operasjoner pa felles variable ha sideeekt pa historievariable,
h
i, som beskrevet i forrige avsnitt. I tillegg er det i modellen tatt hensyn til ikke-determinismen vi har ved lesing og inngang til kritisk region. Vedcoend
ettes de lokale historiesekvensene sammen til en global sekvens.Bevissystemet er sunt og komplett relativt til denne modellen. Med den regelen for parallell sammensetning som vi har i dette bevissystemet trenger vi i beviset av en prosess ikke a ta hensyn til hva en annen prosess gjr. Dermed tillater systemet hierarkisk oppbygging av bevis.
2.5.1 Regler
Tilordning til felles variabel:
T1: f
Q
re; hj;hii`(!j;e)gr
j :=e
fQ
gVi ser at i denne regelen endres
r
j som vanlig for tilordningsregler. I tillegg er sideeekten ath
i utvides med elementet (!j;e
) tatt med.Lesing av felles variabel:
L1: f8
r
jjQ
v;ej;hhii`(?j;rj)g
v
:=e
jfQ
gder
r
j er den felles variabelen som nevnes i uttrykkete
j. I denne regelen oppdateresh
i, og i tillegg er ikke-determinismen ved at vi ikke kan vite hvilken verdi som er lest, fanget inn med en 8-kvantor. Dette innebrer at vi lokalt ikke kan anta noe om verdien av en variabel vi er i ferd med a lese. Siden dette er en felles variabel kan den vre endret av en annen prosess like fr denne prosessen leser den.Kritisk region:
K1: f
P
gS
fQ
hhii`(!!r)g
f8
r
je
)P
hhi`(??i r)gawait e do S od
fQ
gVentebetingelsen
e
ma vre sann i det vi gar inn i kritisk region, og dermed kan vi anta denne i beviset. Siden alle variable leses, ma vi ha en 8-kvantor for hele vektoren av felles variable.Parallell sammensetning:
P1: f
P
igS
ifQ
igf
r
=r
0ViP
ih"igcobegin S
1 kkS
ncoend
f9h
jViQ
iVjr
j=final
j(h
)g for allei
= 1;:::;n
.Q
i er (Q
i::rj::::finalj(hi)::)hlocali i
(h), og
r
0 er vektoren av startverdiene til variablene. Historiesekvensene skal vre tomme vedcobegin
. Samme sted kan vi anta at variablene har initialverdienr
0. Vektoren av initialverdier brukes som tidligere nevnt i funksjonenfinal
j foranne verdien av en variabel gitt en historiesekvens. Denne funksjo- nen brukes ettercoend
foragi verdien av de felles variablene. Ettercoend
er alle de lokale forekomster av felles variable erstattet avfinal
j(h
i) siden det ikke gir mening asnakke om lokale verdier for felles variable pa dette stedet. Videre ettes historiesekvensene sammen til en global historiesekvensh
, og denne globale sekvensen skjules med en9-kvantor, siden vi ikke nsker mytiske variable utenforcobegin ::: coend
.Variable som er lokale i en prosess, skulle egentlig ha vrt deklarert eksplisitt. Vi antar isteden at vi har en implisitt deklarasjonssetning i starten av
S
i og en konstruksjon som terminerer skopet til de lokale variablene pa slutten. Ved a bruke en Hoare-regel for vari- abeldeklarasjoner, ser vi at lokale variable vil skjules av en8-kvantor iP
iog av en9-kvantor iQ
i.2.6 System 2: Bevissystem med global invariant
I bevissystemet som ble presentert i forrige avsnitt ble beviset for hver prosess utfrt kun med kunnskap om denne prosessen vi for yeblikket sa pa. Frst pa slutten ble de ulike sekvensen koblet sammen, og vi sa der pa hele den globale historien.
Isteden kan det vre nskelig akunne anta noe om de andre prosessene ogsaunder beviset lokalt for en prosess. Dette kan gjres som i [Owe92], vedainnfre en global invariant, som bestandig skal vre sann. Denne kan da antas et hvilket som helst sted i prosessene, men samtidig ma vi forsikre oss om at det ikke utfres noen programsetninger som delegger invarianten.
Dette bevissystemet er ogsa sunt og komplett relativt til modellen, og det tillater at be- vis bygges opp hierarkisk. Systemet har den fordelen fremfor System 1 at det blir ere muligheter for hvordan vi kan utfre beviset av et program. Vi kan fortsatt la all infor- masjonen ligge i de lokale betingelsene, men i stedet lnner det seg ofteabruke den globale invarianten fora spesisere hvordan de ulike prosessene samhandler.
Vi bruker flgende notasjon
(
I
)fP
gS
fQ
g som betyrHvis
I
ogP
holder frS
, ogS
terminerer, vilI
ogQ
holde etter atS
har terminert, safremt alle andre prosesser srger fora vedlikeholdeI
.I de lokale betingelsene kan vi bare se paden lokale historiesekvensen
h
ifor denne prosessen og lokale utgaver av felles variable.I den globale invarianten ser vi imidlertid pa alle prosessenes historie
h
og global verdi for felles variable. Her kan vi selvsagt ikke referere til lokale variable.For a kunne se pa bade lokale og globale betingelser denerer vi frst noen utsagn om sammenhengen mellom lokale og globale sekvenser/verdier.
Den lokale verdien av en variabel er den siste som er tilordnet eller lest av denne prosessen.
Dette vil vre avleiret i
h
i:R
i , Vjr
j=final
j(h
i)Den globale verdien av en variabel er den siste verdien som en av prosessene har gitt den, og denne vil nnes i
h
:R
, Vjr
j=final
j(h
)Det er naturligvis en sammenheng mellom hvordan lokale og globale historiesekvenser kan se ut pa et gitt sted i programmet.
H
i ,h
i=local
i(h
)Disse sammenhengene bruker vi for a fa en global betingelse, gitt en lokal:
G
i[P
] ,R
^9r;h
ijR
i^H
i^P
og motsatt for a fa en lokal betingelse fra en global:
L
i[P
] ,R
i^9r;h
jR
^H
i^P
I noen tilfeller kan vi postulere at
h
ogh
i gir samme verdi forr
j. Da kan vi bruke en sterkere variant av disse operatorene,G
ji ogL
ji derj
betyr at 9-kvantoren kan slyfes forr
j.For hver regel ma vi na, som i forrige avsnitt, vise de lokale betingelsene. Na far vi lov a anta en lokalisert utgave av den globale invarianten ogsa.
I tillegg madet vises at den globale invarianten vedlikeholdes. Siden denne bare inneholder variable som har relevans for de felles variable, er det bare ndvendig a vise dette for programsetninger som faktisk manipulerer de felles variable. I et slikt bevis kan vi anta bade den globale invarianten og en globalisert utgave av den lokale forbetingelsen.
2.6.1 Regler
Tilordning til felles variabel:
T2:
P
^L
i[I
])Q
re; hj;hii`(!j;e); I
^G
i[P
])I
e; hhrj; `(i!j;e) (I
)fP
gr
j :=e
fQ
gFrste premiss i denne regelen tilsvarer aksiomskjemaet i System 1. Beviset for at den globale invarianten vedlikeholdes svarer til andre premiss.
Lesing av felles variabel:
L2:
P
^L
ji[I
])Q
v;ej;hhii`(?j;rj)
; I
^G
ji[P
])I
hh`(i?j) (I
)f8r
jjP
gv
:=e
jfQ
gder
r
j er den felles variabelen som nevnes i uttrykkete
j. Her har vi ogsa en premiss for lokale betingelser og en for globale som i regelen for tilordning til felles variabel.Kritisk region:
K2: f
e
^I
^P
^R
^R
igS
f(H
i)Q
^I
)h;h`(i!!r);hhii`(!!r)g
(
I
)f8r
jP
hhi`(??i r)gawait e do S od
fQ
gSiden inngang til kritisk region tilsvarer at denne prosessen leser alle variablene, vil vi ha samme verdier lokalt og globalt for alle variablene. Vi kan se palokale og globale betingelser pa samme niva utenabruke
L
i ogG
i, og derfor trenger vi bare en premiss i denne regelen.Fordi vi ser pakritisk region som en atomisk operasjon er det ikke ndvendig at invarianten er sann hele tiden i
S
.Parallell sammensetning:
P2: (
I
)fP
igS
ifQ
igf
I
h"^r
=r
0ViP
ih"igcobegin S
1 kkS
ncoend
f9h
jI
ViG
i[Q
i]gfor alle
i
=1;:::;n
. Vi ser at historiesekvensene skal vre tomme i alle utsagn frcobegin
og at vi etter
coend
ser pa globale betingelser. Ogsa i denne regelen vil forekomster av lokale variable iP
i ogQ
i vre implisitt kvantorisert vekk. Utenforcobegin ::: coend
vil det dermed bare vre frie forekomster av felles variable, siden de mytiske variablene ogsa fjernes.Vi har ogsa disse reglene:
f
P
gS
fQ
g(