Luku 6 π-kalkyyli π-kalkyyli on toisen sukupolven prosessialgebra. Se pohjautuu CCS:ään. CCS eli Calculus of Communicating Systems on spesifiointikieli, jolla voidaan kuvata prosesseja ja niiden välistä kommunikointia. Esimerkiksi CCS:n avulla voidaan kuvata kaikki siirtymäsysteemit. Lisäksi CCS:ssä voidaan synkronoinnin yhteydessä välittää dataa. π kalkyyli poikkeaa CCS:stä siinä, että datan yhteydessä voidaan lähettää myös porttinimi toiselle prosessille. Toinen prosessi voi sitten datan saatuaan kommunikoida kolmannen prosessin kanssa saamansa portin kautta. Itse asiassa π-kalkyylissä ei porttinimiä erotella mitenkään muusta datasta. Tämä tekee siitä tietyssä mielessä elegantin, mutta toisessa mielessä myös vaikeasti ymmärettävän. Toinen seikka, mikä vaikeuttaa π-kalkyyliin perehtymistä, on siinä, että siitä on monia eri versioita. Kalkyyli on luonteeltaan teoreettinen kieli, eikä sitä ole aikomusta standardoida. Tässä luvussa perehdytään aluksi perus-ccs:ään, jossa ei ole mukana datan välitystä. Tämän lyhyen johdannon jälkeen ryhdytään käsittelemään π-kalkyyliä. 6.1 CCS:n Operaatiot Aivan samoin kuin siirtymäsysteemissä myös CCS:ssä käytetään toimintoja. CCS:ssä kuitenkin toimintojoukko on muotoa A Ā {}, missä Ā = {ā a A}. Eli jokaista :sta poikkeavaa toimintoa a A kohti on olemassa komplementtitoiminto ā Ā. Voidaan ajatella, että toiminto edustaa vastaanottoa ja komplementtitoiminto lähetystä. Tilanteesta riipuen voidaan antaa muitakin tulkintoja näille kahdelle toimintotyypille. Käytämme kreikkalaisen aakkoston aakkosia α, β jne kun tarkoitetaan mitä tahansa toimintoa joukosta A Ā {}. Joukon A toiminnoille käytetään merkintöjä a, b jne eli latinalaisia pieniä aakkosia. Seuraavassa luetellaan CCS:n operaatiot, joita käyttämällä saadaan muodostettua siirtymäsysteemeitä eli prosesseja. Operaatioiden semantiikka määritellään antamalla siirtymäsäännöt, joita soveltamalla nähdään mahdolliset siirtymät kustakin 57
58 LUKU 6. π-kalkyyli tilanteesta. Esimerkit valaisevat tilannetta operaatioiden yhteydessä. 6.1.1 Etutoiminto Tämä on yksinkertaisin operaatio, jolla saadaan aikaan suoraviivaisia siirtymiä tilasta toiseen ilman haarautumismahdollisuutta. Operaation syntaksi on α P, missä α on mikä tahansa toiminto (, tavallinen tai komplementtitoiminto). Esimerkiksi a b c NIL vastaa siirtymäsysteemiä P 1 a b P 2 P 3 P 4. Operaattorin semantiikka määritellään siirtymäsäännöllä α P α P. Siten esimerkkilausekkeesta saadaan semantiikkasäännön avulla siirtymät a b c a b c b c c NIL eli juuri edellä annettu siirtymäsysteemi. Huomattakoon tässä prosessi NIL, jolle käytetään myös merkintää 0. Se on prosessi, joka ei voi tehdä mitään. c 6.1.2 Summa eli valinta Valintaoperaattori on tuttua muotoa P + Q, missä P ja Q ovat prosesseja. Tällä saadaan aikaan haarautumia. Operationaalinen semantiikka saadaan säännöstä M + α.p + N α P. Huomattakoon, että M tai N voidaan valita NIL-operaattoriksi. Esimerkiksi kaava a.(b.c.n IL + b.d.n IL) vastaa kuvan 6.1 siirtymäsysteemiä. 6.1.3 Rinnakkaisoperaattori Rinnakkaisoperaattorista on jo ollut puhetta. Sen täsmällinen semantiikka saadaan kolmesta siirtymäsäännöstä: 1. Reaktiosääntö: Jos P α P ja Q ᾱ Q (siis α ), niin P Q P Q.
6.1. CCS:N OPERAATIOT 59 a b c P1 P2 P3 P4 b P5 d P6 Kuva 6.1: CCS-lauseketta vastaava siirtymäsysteemi 2. Vasen rinnakkaisuus: Jos P α P, niin P Q α P Q. 3. Oikea rinnakkaisuus: Jos Q α Q, niin P Q α P Q. Rinnakkaisoperaattorin avulla voidaan muodostaa yhteistilaverkko. Sama toiminto voi siis sekä osallistua synkronointiin että tapahtua itsekseen vain toisessa prosessissa. 6.1.4 Rajoitus Mikäli esimerkiksi ei haluta, että rinnakkaisoperaattorin yhteydessä sovelletaan kaikkia kolmea sääntöä, vaan halutaan soveltaa ainoastaan reaktiosääntöä, tarvitaan rajoitusoperaattoria. Käyttäen rajoitusoperaattorille merkintää ν(a) semantiikka voidaan antaa siirtymäsäännöllä Jos P α P, niin ν(a)p α ν(a)p edellyttäen, että α {a, ā}. Muita merkintöjä rajoitusoperaattorille ovat P \a ja new a P. Tällä kurssilla käytämme säännössä annettua ensimmäistä merkintää, joka näyttää olevan laajimmalle levinnyt π-kalkyylissä. 6.1.5 Prosessin kutsu CCS:ssä ja muissa prosessialgebroissa prosesseja voidaan määritellä kaavan A(a 1, a 2,, a n ) = P A (a 1, a 2,, a n ) mukaisilla kaavoilla. Tässä P A voi olla sama kuin A, jolloin saadaan aikaan rekursiivinen määritelmä, joka siirtymäsysteeminä näkyy syklinä. Määrittelyn jälkeen prosessia voidaan kutsua eri parametreillä. Tarkka määrittely vaatii kuitenkin lisämerkintöjä. Merkintä a tarkoittaa jonoa a 1, a 2,, a n tapahtumia. Jos P on prosessi, niin merkintä { b/ a}p tarkoittaa prosessia P, jossa a i :t on korvattu toiminnoilla b i.
60 LUKU 6. π-kalkyyli Prosessissa P esiintyviä toimintonimiä kutsutaan vapaiksi nimiksi. Perus-CCS:ssä ei muunlaisia nimiä tai toimintoja olekaan, mutta π-kalkyylissä otetaan käyttöön myös sidotut nimet. Prosessin P (vapaita) toimintoja merkitään symbolilla f n(p ). Kun prosessi A määritellään kaavalla A( a) = P A, niin silloin oletetaan, että toiminnot a sisältävät joukon fn(p A ). Perus-CCS:ssä sisältyvyys tarkoittaa samaa kuin identtisyys. Nyt voidaan antaa prosessin kutsun tarkka määritelmä: Jos A on määritelty kaavalla A( a) = P A ja { α b/ a}p A P, niin A( b) P α. 6.1.6 Esimerkkejä Näytämme seuraavaksi muutamia esimerkkejä CCS:n käytöstä. Ensiksi näytetään, miten määritellään puskuri, johon voidaan viedä kaksi bittiä. Siirtymäsysteeminä puskuri on esitetty kuvassa 6.2. CCS:llä esitettynä sama on Buff (2) = in 0.Buff (2) 0 + in 1.Buff (2) 1 Buff (2) i = out i.buff (2) + in 0.Buff (2) 0i + in 1.Buff (2) 1i Buff (2) ij = out j.buff (2) i in_0 in_1 out_0 in_0 0 out_1 in_1 out_0 in_0 1 in_1 out_1 00 10 01 11 Kuva 6.2: Puskuria vastaava siirtymäsysteemi Toisena esimerkkinä on yksinkertainen laskuri. Sen määritelmä on seuraava: Count 0 = inc.count 1 + zero.count 0 Count n+1 = inc.count n+2 + dec.count n Tässä laskuri on määritelty induktiivisesti, mikä on sallittua, jos spesifikaatiota käsitellään käsin. Jos sen sijaan on tarkoitus generoida yhteistilaverkko koneellisesti, määrittelyn on oltava äärellinen.
6.2. π-kalkyylin TUNNUSMERKIT 61 Kolmantena esimerkkinä tarkastellaan keskeytyskäsittelijää. Oletetaan, että järjestelmässä on n kpl prosesseja P 1,, P n. Prosessit P i suorittavat toimenpiteensä syklisesti P 1,, P n, P 1,, P n, P 1,, P n. Prosessi P i signaloi sanomalla a i skeduloijalle, että se haluaa aloittaa vuoron. P i päättää vuoronsa sanomalla b i. Skeduloijan periaatteet ovat seuraavat: 1. a 1,, a n tapahtuvat syklisesti. 2. a i ja b i vuorottelevat. 3. Prosessi voi tarjota a:ta ja b:tä mihin aikaan tahansa edellyttäen, että ehdot (1) ja (2) ovat voimassa. Konstruoidaan skeduloija n:n identtisen prosessin rinnakkaisena yhdisteenä. Ensin määritellään Tämän jälkeen määritellään vielä A = a.c, C = c.e, E = b.d + d.b, B = b.a, D = d.a. A i = A(a i, b i, c i, c i 1 ), missä indeksien vähennyslasku on modulo 2. Vastaavasti määritellään C i, B i ja D i. Lopuksi saadaan näistä skeduloija S = (A 1 D 2 D n ) \{c 1,, c n }. Skeduloijaa on hieman hankala piirtää verkkona käsin jopa tapauksessa n = 2, sillä samoja prosesseja kutsutaan eri parametreillä, mikä vaatii kirjanpitoa. 6.2 π-kalkyylin tunnusmerkit Ennen kuin lähdetään määrittelemään π-kalkyyliä formaalisti, käydään läpi ensin muutamia havainnollisia esimerkkejä. π-kalkyylille tunnusomaista, perus-ccs:stä poiketen, on se, että synkronoinnin yhteydessä voidaan myös lähettää ja vastaanottaa toimintosymboleja. Olkoon seuraavassa esimerkissä S palvelin, joka kontrolloi pääsyä kirjoittimelle. Kun asiakas haluaa kirjoittaa, se kommunikoi ensin palvelimen kanssa, joka välittää asiakkaalle kirjoittimen P osoitteen.
62 LUKU 6. π-kalkyyli Edellä kuvattu tilanne voidaan kirjoittaa π-kalkyylillä käyttäen palvelinprosessia ba.s ja asiakasprosessia b(c). cd.p. Asiakas saa ensin palvelimelta portin a. Siirtymänä tämä voidaan kuvata kaavalla, kun asiakas ja palvelin sidotaan yhteen rinnakkaisoperaattorin avulla: ba.s b(c). cd.p S ād.p. Siis saatuaan S:ltä a:n asiakas lähettää portista a kirjoitettavan datan kirjoittimelle (jota ei tässä ole spesifioitu) ja jatkaa sitten kuten P. Symboli a oli tässä kahdessa roolissa: dataobjektina ja kommunikointiporttina. Itse asiassa näitä rooleja ei erotella toisistaan kalkyylissä, vaan dataobjektien ja kommunikointiporttien sijasta puhutaan yleisesti nimistä. Tämä on itse asiassa periaate, johon π-kalkyyli nojautuu voimakkaasti. Ensi alkuun saattaa vaikuttaa, että kalkyyli on vain eräänlainen arvoja välittävä prosessialgebra. Verrattuna Lotokseen se saattaa jopa näyttää vaatimattomalta. Ei ole mitään funktioita, joilla voitaisiin käsitellä nimiä. Ei ole myöskään mitään tyyppijärjestelmää, jonka avulla nimiä voitaisiin erotella käyttötarkoituksen mukaan. Nimet ovat atomisia, niillä ei ole mitään sisäistä rakennetta. Kuitenkin π-kalkyyliä pidetään ilmaisuvoimaisempana kuin monia prosessialgebroja, joissa dataa voidaan käsitellä monipuolisesti. Syy tähän löytyy siitä, että kalkyylissä voidaan välittää lokaaleja näkyvyys- tai vaikutusalueita (eng. local scopes). Tarkastellaan tätä tarkemmin palvelimen, asiakkaan ja kirjoittimen yhteydessä. Oletetaan, että a on lokaali linkki tai portti palvelimen ja kirjoittimen välillä. Tilanne voidaan kirjoittaa muodossa (νa)( ba.s R). Rajoitus a:lle ilmaistaan rajoitusoperattorilla ν(a); se rajaa a:n vain S:n ja R:n käyttöön. Muut prosessit eivät voi käyttää sitä S:n tai R:n yhteydessä. Toisaalta S voi lähettää a:n b:n kautta asiakkaalle. Tämän seurauksena a:sta tulee portti, joka on yhteinen kaikille kolmelle. Siirtymänä tämä voidaan kirjoittaa (νa)( ba.s R) b(c). cd.p (νa)(s R ād.p ). Siten vaikka siirrettävät objektit ovatkin atomisia, niiden näkyvyysalue voidaan määritellä lokaaliksi. Tässä suhteessa π-kalkyyli poikkeaa oleellisesti muista prosessialgebroista. Esitetyt esimerkit vaikuttanevat suhteellisen selviltä. On kuitenkin tilanteita, joissa tulkinta ei ole niin selvää. Esimerkiksi lausekkeesta (νa)āu.p ei lähde yhtään siirtymää, joten se on yhtäpitävä lausekkeen 0 kanssa. Entä mitä siirtymiä lähtee lausekkeesta (νu)āu.p? Jotta tiedettäisiin tarkasti, mitä siirtymiä milloinkin non mahdollista suorittaa, tarvitaan syntaksin ja semantiikan määrittelyä. π-kalkyylissä kumpikin voidaan määritellä formaalisti ja siten ilman tulkintaeroja.
6.3. KALKYYLIN FORMAALI SYNTAKSI 63 6.3 Kalkyylin formaali syntaksi Tässä luvussa määritellään π-kalkyylin syntaksi, joka suurimmaksi osaksi noudattaa CCS:n syntaksia. Porttien eli nimien välittäminen tuo mukanaan yksityiskohtia, jotka esiintyvät vain π-kalkyylissä. Syntaksi rakennetaan kahdessa vaiheessa. Ensin annetaan lausekkeiden muodostussäännöt. Sen jälkeen annetaan säännöt, joiden mukaan lausekkeita voidaan sieventää. Nämä säännöt lasketaan vielä syntaksiin. Operationaalinen semantiikka annetaan vasta seuraavassa luvussa. Tämän luvun lopuksi esitetään muutamia esimerkkejä, jotka ovat ymmärrettäviä ilman, että semantiikkaa on vielä formaalisti määritelty. 6.3.1 Formaali syntaksi Kalkyylissä prosessi ja yhteistilaverkko rakennetaan seuraavien operaattorien ja konstruktioiden avulla. 1. 0 on tyhjä prosessi, joka ei tee mitään. 2. āx.p on lähetys (output prefix), jossa nimi x lähetetään portista a. Lähetyksen jälkeen prosessi jatkaa kuten prosessi P. 3. a(x).p on vastaanotto. Nimi otetaan vastaan portista a ja sijoitetaan muuttujan x arvoksi. 4..P on sisäinen toiminto. Prosesi suorittaa :n ja jatkaa sitten kuten P. Sisäinen tapahtuman suoritukseen eivät ulkopuoliset osallistu. 5. P + Q on summa eli valinta. Tämä operaattori on jo aikaisemmin määritelty. 6. P Q on rinnakkainen yhdiste, joka on myös aikaisemmin esitelty. 7. if x = y then P on samuusvertailu. Jos x = y, jatketaan kuten P. 8. if x y then P on erisuuruusvertailu. 9. (νx)p on rajoitus. Prosessi käyttäytyy kuten P, mutta x on lokaali eli sitä ei voi ulkopuolinen käyttää P :n kanssa kommunikointiin. Sen sijaan P :n komponentit voivat kommunikoida x:n kautta. 10. A(y 1,, y n ) on prosessin kutsu todellisilla parametreillä y 1,, y n, kun A on määritelty alunperin kaavalla A(x 1,, x n ) = P, missä x 1,, x n ovat formaaleja parametreja ja täyttävät ehdon x i x j kaikilla i, j, i j. Säännöissä 1-10 on määritelty, kuinka prosessi rakennetaan. Jotta kaikki sujuisi tehokkaasti myös konkreettisessa spesifioinnin kirjoittamistilanteessa, tarvitaan vielä muutamia lyhennysmerkintöjä ja sopimuksia.
64 LUKU 6. π-kalkyyli Ensiksikin vertailuja voidaan yhdistää. Konjunktiivinen ehto saadaan aikaan sisäkkäisillä vertailuilla: if x = y then if u v then P. Disjunktiivinen ehto saadaan puolestaan summan avulla: if x = y then P + if u v then P. Myös else-haaraa voidaan käyttää. Seuraavat kaksi versiota ovat samoja: if x = y then P else Q if x = y then P + if x y then Q Muita vertailuja ei ole, koska nimillä ei ole sisäistä rakennetta eikä nimiä voi myöskään käsitellä operaattoreilla. Hankalin asia π-kalkyylissä on rajoitettujen nimien näkyvyys. Ennen kuin täydelliset säännöt voidaan antaa (semantiikan puolella), täytyy määritellä käsitteet vapaat ja sidotut nimet. Tarkastellaan ensin etutoimintoja a(x).p ja āx.p. Näissä a:ta kutsutaan subjektiksi ja x:ää objektiksi. Määritellään, että objekti on vapaa lähetyksessä, mutta sidottu vastaanotossa. Eli lausekkeessa a(x).p x on sidottu prosessissa P. Toisaalta lauseke āx.p ei sido x:ää P :hen, vaan x on vapaa P :ssä. Sisäisellä tapahtumalla ei ole subjektia eikä objektia, eikä sen yhteydessä ole siis sidottuja tai vapaita muuttujia. Toisaalta rajoitusoperaattori (νx)p sitoo x:n P :hen. Kuitenkin x voidaan lähettää ulkopuolelle. Tämä aiheuttaa mutkikkuutta, jota ei ole muissa arvoja välittävissä prosessialgebroissa. Nyt voidaan määritellä fn(p ) = P : n vapaat nimet bn(p ) = P : n sidotut nimet Edelleen merkitään fn(p, Q) = fn(p ) fn(q). Samoja merkintöjä käytetään myös etutoiminnoille eli voidaan kirjoittaa fn(α) ja bn(α), kun α on āx, a(x) tai. Esimerkki. fn (( zy.0 + wv.0) xu.0) = {z, y, w, v, x, u}, fn ((νx) (x(z). zy.0 + wv.0) (νu) xu.0)) = {y, w, v}.
6.3. KALKYYLIN FORMAALI SYNTAKSI 65 Näiden merkintöjen avulla voidaan vielä asettaa lisäoletus prosessin märittelylle. Nimittäin määrittelyssä A(x 1,, x n ) = P oletetaan, että fn(p ) {x 1,, x n }. Tämän kappaleen lopuksi esitellään vielä sijoitus, jota tarvitaan semantiikan määrittelyssä. Sijoitus on kuvaus {x/y} : y x tai useammman muuttujan tapauksessa kuvaus {x 1,, x n /y 1,, y n } : y i x i, missä oletuksena on, että y i y j kaikilla i j. Olkoon σ sijoitus. Merkintä P σ tarkoittaa P :n muutosta siten, että kaikki vapaat nimet x korvataan σ(x):llä tarvittaessa käyttäen α-konversiota. Konversio tarkoittaa tässä, että sidotut nimet nimetään tarvittaessa uudelleen siten, että korvattaessa x σ(x):llä tulos σ(x) on vapaa P :ssä. Esimerkki valaisee tilannetta: (a(x).(νb) xb. cy.0) {xb/yc} = a(z).(νd) zd. bx.0. Lopuksi vielä syntaksiin liittyviä merkintöjä: P 1 + + P n = n i=1 P i = i P i. Jos yllä n = 0, niin koko summa on 0. (νx 1 ) (νx n )P = ν(x 1,, x n )P. Joskus merkitään lyhyesti a.p, kun tarkoitetaan a(x).p, mikäli asia on asiayhteydestä selvä. Vastaavasti bp = bx.p. α = α0. Unaarinen operaattori sitoo ennen binääristä ja ennen summaa: (νx)p Q + R = (((νx)p ) Q) + R. 6.3.2 Strukturaalinen kongruenssi Syntaksi vaatii tuekseen sievennyssääntöjä, jottei kalkyylistä tulisi liian jäykkää ja merkinnöiltään monimutkaista. Strukturaalinen kongruenssi on ekvivalenssirelaatio, jonka avulla voidaan samastaa erilaisia termejä. Tämä relaatio määritellään seuraavin säännöin: 1. Jos P ja Q saadaan toisistaan α-konversiolla, niin P Q.
66 LUKU 6. π-kalkyyli 2. Rinnakkaisoperaattorille pätee sekä vaihdannaisuus että liitännäisyys: Samat säännöt pätevät summalle. P Q = Q P (P Q) R (P (Q R) P 0 P 3. Jos prosessi A määritellään kaavalla A( x) = P, niin 4. Rajoitukseen liittyy kuusi sääntöä: A( y) P { y/ x}. (νx)0 0 (νx)(p Q) P (νx)q, jos x fn(p ) (νx)(p + Q) P + (νx)q, jos x fn(p ) (νx)if u = v then P if u = v then (νx)p, jos x u, x v (νx)if u v then P if u v then (νx)p, jos x u, x v (νx)(νy)p (νy)(νx)p Esimerkki. Jos x fn(p ), niin P P 0 P (νx)0 (νx)(p 0) (νx)p. Erikoistapauksena edellisestä saadaan kaikilla prosesseilla P (νx)(νx)p (νx)p. Sievennyssääntöihin ei ole otettu esimerkiksi sääntöä (νx)α.p α.(νx)p, jos x α. Sääntö on täysin pätevä, mutta se saadaan myös myöhemmistä ekvivalenssisäännöistä, joten sitä ei oteta tässä vaiheessa syntaksisääntöihin. 6.3.3 Yksinkertaisia esimerkkejä Käymme vielä läpi muutamia esimerkkejä. Esimerkeissä käsitellään tyypillisiä tilanteita ja niissä mahdollisia siirtymiä. Tapauksia esitellään jo nyt syntaksin yhteydessä, jotta sitten semantiikan formaaliin määrittelyyn tultaessa olisi jo pohjatiedot lausekkeiden käyttäymisestä. 1. Perustilanne, joka on jo esiintynyt, liittyy nimen lähettämiseen ja vastaanottoon. Esitämme siitä yksinkertaisen perustapauksen ja hieman yleisemmän version: a(x). cx āb a(x).p āb.q cb 0 P {b/x} Q
6.3. KALKYYLIN FORMAALI SYNTAKSI 67 2. Jos P Q, niin sillä rajoitus ei koske :ta. 3. Mitä siirtymiä lähtee prosessista (νx)p (νx)q, a(x). cx (νb)āb? Strukturaalisesta kongruenssista seuraa, että yllä oleva prosessi on ekvivalentti prosessin (νb)(a(x). cx āb) kanssa, koska b ei ole vapaa vasemmalla. Edelleen koska pätee myös Eli johtopäätöksenä saadaan siirtymä Yleisesti, jos b fn(p ), niin missä b on α-muunnettu b :ksi. 4. Entä siirtymät lausekkeesta a(x). cx āb cb 0, (νb) (a(x). cx āb) (νb)( cb 0) (νb) cb. (a(x). cx (νb)āb (νb) cb. a(x).p (νb)āb.q (νb ) (P {b /x} Q{b /b}), ((νb)a(x).p āb.q? Nyt b on vapaa oikealla, mutta sidottu vasemmalla. Tehdään ensin α-konversio b b, jolloin saadaan lauseke Siitä saadaan siirtymä (νb )(a(x).p {b /b} āb.q. (νb )(a(x).p {b /b} āb.q (νb )P {b /b}{b/x} Q. Siis α-konversion ja näkyvyyslaajennoksen avulla rajoitettuja nimiä voidaan lähettää objekteina. 5. Tarkastellaan taas kirjoitinta R, jota kontrolloi palvelin S: (νe)(s e.r). R ei voi aloittaa, ennen kuin saa signaalin e:stä. Toisaalta S voi lähettää e:n asiakkaalle Q: c(x). x.q (νe)( ce.s e.r) (νe)(ē.q S e.r) (νe)(q S R).
68 LUKU 6. π-kalkyyli Itse asiassa S voi lähettää e:n usealle asiakkaalle. Toisaalta R:llä voi olla useita portteja, joista tarjotaan erilaista palvelua: e 1 R 1 e 2.R 2 e n.r n. 6. Tarkastellaan tilannetta, jossa S lähettää nimet d ja e asiakkaalle varmistaen, että sama asiakas saa molemmat nimet. Ei käytetä etukäteen annettuja portteja, koska tällöin d ja e voivat mennä eri tahoille. Sen sijaan käytetään yksityistä kanavaa, joka saadaan aikaan rajoitusoperaattorilla: Asiakas määritellään kaavalla (νp) cp. pd. pe.s. c(p).p(x).p(y).q. Vaikka olisi useita asiakkaita, d ja e menevät nyt samalle asiakkaalle. Tilanne on niin yleinen, että sitä varten on kehitetty lyhennysmerkintä: c < e 1 e n >.P = (νp) cp. pe 1.. pe n.p, c(x 1 x n ).Q = c(p).p(x 1 )..p(x n ).Q, missä p fn(p, Q), ja x i x j, kun i j. Tällöin c < e 1 e n >.P c(x 1 x n ).Q P Q{e 1 e n /x 1 x n }. 7. Olkoon tilanne samantapainen kuin 6):ssa. Q haluaa suorittaa P :n lähettämällä aloitussignaalin e ja odottaa P :n suorituksen päättymistä. Odottaminen saadaan aikaan, jos P lähettää Q:lle yksityisen nimen lopuksi: (νr)ēr.r.q e(x).p (νr) (r.q P {r/x}). Nyt Q:n täytyy odottaa, kunnes saa r:n. Tämän r:n voi lähettää vain P, sillä vain P :llä Q:n lisäksi näkyvyysalue ulottuu r:ään. 6.4 π-kalkyylin operationaalinen semantiikka π-kalkyylin lausekkeille annetaan semantiikka siirtymäsäännöillä kuten CCS:n (ja Lotoksen) tapauksessakin. Siirtymäsäännöt ovat aika pitkälle samoja kuin CCS:ssä. Poikkeuksen muodostaa rajoitusoperaattori. Tilanteen voisi pelkistää seuraavaan esimerkkiin: (νu)āu.p. Mitä siirtymiä lausekkeesta lähtee? Siitä on lähdettävä joitakin siirtymiä, sillä tapauksessa u fn(p ) pätee strukturaalinen kongruenssi a(x).q (νu)āu.p (νu)(a(x).q āu.p,
6.4. π-kalkyylin OPERATIONAALINEN SEMANTIIKKA 69 josta nähdään, että lausekkeen ollessa liitettynä rinnakkaisoperaattorilla toiseen lausekkeeseen siirtymä on mahdollinen. Siis (νu)ū.p ei ole 0. Toisaalta (νu)āu.p ei ole sama kuin āu.p, minkä osoittaa seuraava vastaesimerkki. Ensinnäkin (a(x).if x = u then Q) āu if u = u then Q. Tuloksena olevasta lausekkeesta voidaan edetä Q:n siirtymillä. Toisaalta lauseke (a(x).if x = u then Q) (νu)āu on strukturaalisesti ekvivalentti lausekkeen (νv) ((a(x).if x = u then Q) āv) kanssa, josta puolestaan lähtee -siirtymä lausekkeeseen josta ei enää lähde siirtymiä. (νv) if v = u then Q, Siten (νu)āu vaatii uudenlaisen siirtymäsäännön. Määritellään, että siihen liittyy sidottu lähetys: āνu. Sidotun lähetyksen tulkinta on, että lokaali nimi u lähetetään a:n kautta ja u:n näkyvyys ulotetaan vastaanottajaan. Siten käytössä on neljä toimintotyyppiä: 1., sisäinen toiminto; 2. āx, lähetystoiminto; 3. a(x), vastaanottotoiminto; 4. āνx, sidottu lähetys. Merkitään āνx.p = (νx)āx.p. Käytetään edelleen kreikkalaisia pieniä kirjaimia kuvaamaan jokaista neljää tyyppiä toimintoja. Vielä määritellään fn(āνx) = {a}, bn(āνx) = {x}. (6.1) Ennen kuin semantiikka määritellään, on kätevää ottaa käyttöön vielä kaksi merkintää: 1. P a(x) Q tarkoittaa, että P saa nimen u a:sta ja jatkaa kuten Q{u/x}. Tässä x ei niinkään edusta saatua arvoa, vaan se viittaa Q:n paikkoihin, joihin saatu arvo täytyy sijoittaa. Kun tutkitaan siirtymiä Q:sta eteenpäin, on otettava huomioon kaikki mahdolliset arvot, jotka voidaan ottaa vastaan.
70 LUKU 6. π-kalkyyli 2. P āνx Q tarkoittaa, että lokaali nimi lähetetään ulos. Muuttuja x ilmaisee ne paikat Q:ssa, joissa nimi on. Siten x ei ole funktionaalinen parametri, vaan se edustaa sellaista, mikä eroaa kaikista nimistä kyseisessä ympäristössä. Semantiikka saadaan nyt seuraavista säännöistä: 1. STRUCT: Jos P P, P Q, α Q Q, niin P α Q. 2. PREFIX: Aina α.p α P. 3. SUM: Jos P α P, niin P + Q α P. 4. MATCH: Jos P α P, niin if x = x then P α P. 5. MISMATCH: Jos P α P ja x y, niin if x y then P α P. 6. PAR: Jos P α P ja bn(α) fn(q) =, niin P Q α P Q. 7. COM: Jos P a(x) P ja Q āu Q, niin P Q P {u/x} Q. 8. RES: Jos P α P ja x α, niin (νx)p α (νx)p. 9. OPEN: Jos P āx P ja a x, niin (νx)p āvx P. Ensimmäinen sääntö, STRUCT, huolehtii siitä, ettei tarvita useita tapauksia samaa sääntöä. Esimerkiksi summassa ei tarvitse käsitellä tapausta, jossa siirtymä lähteekin Q:sta. Strukturaalinen kongruenssi sanoo, että vaihdannaisuus on voimassa summan tapauksessa. Säännössä PAR on ylimääräinen ehto. Tarkastellaan ehdon tarpeellisuutta esimerkin avulla. Oletetaan, että käytössä on sääntö, että ehdosta a(x).p P a(x) seuraa (a(x).p ) Q P a(x) Q. Jos tämä vielä yhdistetään siirtymän āu.r R kanssa, saadaan, että ehdoista (a(x).p ) Q P a(x) Q ja āu.r R seuraa siirtymä ((a(x).p ) Q āu.r (P Q){u/x} R. Tämä on selvästi oikein, jos x fn(q). Muussa tapauksessa vapaa x muuttuisi sijoituksen vaikutuksesta. Jos x fn(q), niin samanlainen siirtymä on mahdollista vasta sen jälkeen, kun x on α-muutettu lausekkeessa a(x).p nimeksi, joka ei ole vapaa Q:ssa. OPEN-säännön avulla generoidaan sidottuja lähetyksiä. Sidotut lähetykset eivät ole käytössä COM-säännössä, eivätkä ne voi siten reagoida suoraan vastaanottojen kanssa. Nämä tapaukset saadaan aikaan sen sijaan strukturaalisen kongruenssin avulla siten, että rajoitus vedetään molempien prosessien ulkopuolelle mahdollisesti α-konversiota käyttäen. Seuraavassa on esimerkki tästä. Esimerkissä oletetaan, että u fn(p ). Oletetaan a(x).p āu.q P {u/x} Q. RES-sääntöä soveltamalla tästä saadaan (νu) (a(x).p āu.q) (νu) (P {u/x} Q).
6.4. π-kalkyylin OPERATIONAALINEN SEMANTIIKKA 71 Lopuksi saadaan STRUCT-säännöllä a(x).p (νu)āu.q (νu) (P {u/x} Q). Voitaisiin väittää, että sidotut lähetykset ja OPEN-sääntö ovat tarpeettomia, sillä niitä ei voi käyttää, kun generoidaan todellisia siirtymiä. Teknisesti tämä väite onkin tosi, mutta on muitakin syitä sisällyttää sidottu lähetys semantiikan sääntöihin. Ensinnäkin (νu)āu tekee jotain intuitiivisesti eli vie ulos lokaalin nimen. Jos tätä ei oteta huomioon semantiikassa, semantiikka ei käsittäisi kaikkia siirtymiä kaikissa mahdollisissa (keinotekoisissakin) tilanteissa. Filosofiselta kannalta kannalta katsoen semantiikan formaalin määärittelyn tulee olla täydellinen. Toinen, ehkä tärkeämpi, syy on siinä, että sidottua lähetystä tarvitaan konkreettisesti prosessien välisten ekvivalenssien määrittelyssä.