• Nie Znaleziono Wyników

Graficzna reprezentacja agenta VP-XCCS

W dokumencie Index of /rozprawy2/10134 (Stron 63-70)

8. Podsumowanie 103

5.1 Graficzna reprezentacja agenta VP-XCCS

Nazwa agenta mo˙ze zosta´c wzbogacona o jego stan pocz ˛atkowy. Jest on wtedy bezpo´sred-nio widoczny w warstwie graficznej i jest to preferowany sposób przedstawiania tej własno´sci. Innym sposobem przekazania stanu pocz ˛atkowego agenta jest przeniesienie tej informacji do warstwy tekstowej. W takim przypadku nazwa agenta jest identyczna jak w przypadku modeli w XCCS, a w warstwie tekstowej mo˙ze ona przyj ˛a´c nast˛epuj ˛ac ˛a form˛e:

agent A = A(X : IS := {})

agent A(X : IS := {}) = ...

W rachunku VP-XCCS, w porównaniu do XCCS, nazwa portu w agencie mo˙ze zosta´c rozszerzona o nazw˛e parametru i jego typ. Elementy te umieszcza si˛e w nawiasach okr ˛agłych za nazw ˛a portu. Wymagane jest deklarowanie wszystkich u˙zywanych typów danych, a ich definicje

maj ˛a charakter globalny dla modelu. Przykład sparametryzowanego portu pokazano na rys. 5.1. Przez port wej´sciowy in przesyłany jest parametr e typu I.

5.2. Warstwa algebraiczna

Warstwa algebraiczna dla algebry VP-XCCS składa z dwóch zasadniczych cz˛e´sci. Pierw-sza z nich zawiera definicje typów i stałych u˙zywanych w modelu. Druga cz˛e´s´c to równania definiuj ˛ace agentów, w których mo˙zna stosowa´c wcze´sniej zdefiniowane typy i stałe. Tekstowa definicja agenta jest ´sci´sle zwi ˛azana z jego graficzn ˛a reprezentacj ˛a.

5.2.1. Deklaracje

Sekcja deklaracji zawiera definicje wszystkich typów oraz deklaracje stałych wykorzysty-wanych w modelu. Deklaracja stałej rozpoczyna si˛e słowem kluczowym const, po którym nast˛epuje unikalna nazwa stałej pisana z małej litery. Nast˛epnie musi pojawi´c si˛e znak równo-´sci oraz warto´s´c stałej. Przy podawaniu wartorówno-´sci stałej dopuszcza si˛e wykorzystanie operatorów arytmetycznych. Je´sli deklaracja stałej wykorzystuje inne stałe, to wymagane jest, aby były one okre´slone wcze´sniej. Przykładowe deklaracje stałych przedstawiono poni˙zej.

const r = 2;

const n = r;

const x = 2 * n;

Definicja typu składa si˛e ze słowa kluczowego type, po którym nast˛epuje unikalna nazwa typu rozpoczynaj ˛aca si˛e z wielkiej litery. Nast˛epnie wyst˛epuje wyra˙zenie okre´slaj ˛ace typ po-przedzone znakiem równo´sci. Typy proste wspierane przez VP-XCCS przedstawiono w tab. 5.1.

Nazwa typu Warto´sci Przykład logiczny true, false true całkowity -231.. 231 52

ła´ncuchowy "[[:ASCII:]]" "VP XCCS"

Tabela 5.1. Typy podstawowe VP-XCCS

VP XCCS pozwala na wykorzystanie trzech zło˙zonych typów danych: zbiorów, krotek oraz list. Zbiór mo˙zna zdefiniowa´c na dwa sposoby:

• wyliczenie elementów,

• u˙zycie funkcji generuj ˛acej elementy.

Przykład definicji zbioru przez wymienienie jego elementów mo˙ze wygl ˛ada´c nast˛epuj ˛aco:

type A = {1, true, "CCS"};

Tak jak jest to widoczne w powy˙zszym przykładzie, elementami zbioru mog ˛a by´c dowol-ne warto´sci typów prostych. Dodatkowo elementami zbiorów mog ˛a by´c tak˙ze inne zbiory. W szczególno´sci dopuszczalny jest poni˙zszy zapis, zgodnie z którym z elementów zbioru B jest zbiór A.

type A = {1, 2, true, false, "CCS"};

Przykładem funkcji generuj ˛acej zbiór jest range, która pozwala okre´sli´c zakres podzbioru liczb całkowitych. Przykładowo, w celu zdefiniowania zbioru zawieraj ˛acego wszystkie liczby całkowite pomi˛edzy 5 i 11 wł ˛acznie, mo˙zna u˙zy´c nast˛epuj ˛acej konstrukcji:

type A = range(5, 11); Dost˛epne s ˛a ponadto funkcje:

• union(A,B) – suma zbiorów A i B, • diff(A,B) – ró˙znica zbiorów A i B, • pow(A) – zbiór pot˛egowy zbioru A,

• prod(A,B,C) – iloczyn kartezja´nski zbiorów A, B i C, • size(A) – moc zbioru A,

• member(e,A) – sprawdza czy element e nale˙zy do zbioru A.

Przykłady zastosowanie wy˙zej wymienionych funkcji podano poni˙zej. Wymienione funkcje mo˙zna wykorzystywa´c zarówno w trakcie definiowania typów jak i w definicjach agentów.

type A = {1, 2, 3};

type B = pow(A);

type C = union(A, B);

type D = diff(A, B);

type F = {1, size(A)};

Iloczyn kartezja´nski definiuje si˛e z u˙zyciem funkcji prod. Przykładowo zbiór par opisuj ˛ a-cych poło˙zenie figury na szachownicy mo˙zna zdefiniowa´c nast˛epuj ˛aco:

type A = {"A", "B", "C", "D", "E", "F", "G", "H"};

type B = range(1, 8);

type Square = prod(A, B);

Do manipulacji elementami iloczynów kartezja´nskich w VP-XCCS dost˛epny jest opera-tor # oraz funkcja update. Operaopera-tor # zawraca n-ty element krotki. Funkcja update pozwa-la na nadpisanie n-tego elementu now ˛a warto´sci ˛a. Przykładowo, je˙zeli krotka reprezentowana jest przez zmienn ˛a e, to wyra˙zenie e#2 zwraca jej drugi element składowy. U˙zycie funkcji

updatemo˙ze wygl ˛ada´c nast˛epuj ˛aco: update(x,2,5). W takim przypadku, je˙zeli x było krotk ˛a, to nast ˛api zamiana drugiej jej składowej na warto´s´c 5.

Konstrukcja <<n1, n2, ..., nn>> zwraca w rezultacie krotk˛e (n1, n2, . . . , nn) i mo˙zna j ˛a wykorzysta´c zarówno w definicji typów jak i w definicji agentów.

Ostatnim z typów danych obsługiwanych przez VP-XCCS s ˛a listy. Dost˛epne s ˛a dwa sposo-by ich definiowania:

• wyliczenie wszystkich elementów typu,

• wygenerowanie zbioru list z u˙zyciem funkcji seqs.

Definicja listy z wykorzystaniem pierwszego sposobu polega na okre´sleniu typu przez po-danie wszystkich jego elementów, np.:

type L = {[], [0], [1], [0,0], [0,1]};

Powy˙zsza definicja okre´sla typ listowy, którego maksymalna długo´s´c to 2, elementami skła-dowymi listy mog ˛a by´c elementy 0 i 1. Nale˙zy jednak zauwa˙zy´c, ˙ze elementy [1,0] oraz [1,1]nie nale˙z ˛a do typu listowego L prezentowanego w tym przykładzie.

U˙zycie funkcji seqs do definicji typu listowego powoduje wygenerowanie wszystkich mo˙zliwych list o długo´sci nie wi˛ekszej ni˙z warto´s´c podana jako pierwszy argument funkcji, z elementów zbioru, który jest drugim argumentem funkcji np:

type E = {0, 1};

type L = seqs(2,E);

Powy˙zsza definicja jest równorz˛edna do nast˛epuj ˛acej utworzonej według schematu z poprzed-niego przykładu:

type L = {[], [0], [1], [0,0], [0,1], [1,0], [1,1]};

Elementami listy mog ˛a by´c dowolne typy proste jak i typy zdefiniowane wcze´sniej przez u˙zytkownika. Do operowania na listach, zarówno w trakcie definiowania typu jak i w wyra˙ze-niach definiuj ˛acych agenty, dost˛epne s ˛a nast˛epuj ˛ace funkcje:

• cons(x, l) – dodaje element x na pocz ˛atek listy l, • hd(l) – zwraca głow˛e listy (pierwszy element),

• tl(l) – zwraca ogon listy (wszystko poza pierwszym elementem); • append(l1,l2) – ł ˛aczy dwie listy;

• len(l) – zwraca długo´s´c listy.

5.2.2. Definicje agentów

Jak to ju˙z zostało wspomniane wcze´sniej definicja agenta składa si˛e z dwóch cz˛e´sci: ele-mentu graficznego oraz opisu tekstowego. Obie cz˛e´sci s ˛a ze sob ˛a ´sci´sle powi ˛azane. W szcze-gólno´sci wymagane jest aby:

• nazwa agenta w warstwie graficznej pokrywała si˛e z nazw ˛a pierwszego agenta wyst˛epu-j ˛acego w definicji algebraicznej (tzw. nazwa podstawowa) wraz z ewentualnymi parame-trami,

• wszystkie porty u˙zyte w definicji algebraicznej musz ˛a pojawi´c si˛e w warstwie graficznej wraz z ewentualnymi argumentami i typami i na odwrót.

Definicja agenta rozpoczyna si˛e od słowa kluczowego agent, po którym wyst˛epuje na-zwa agenta z ewentualnymi argumentami. Nast˛epnie musi wyst ˛api´c znak równo´sci, a po nim wyra˙zenie definiuj ˛ace agenta. Warstwa tekstowa definicji agenta VP-XCCS mo˙ze składa´c si˛e z definicji wielu wzajemnie powi ˛azanych ze sob ˛a agentów. W definicji pojedynczego agenta mo˙zna u˙zy´c nast˛epuj ˛acych operatorów:

• operator sekwencji (.), • operator sumy (+),

• operator silnej sumy (++), • operator przeplatania (?), • operator opó´znienia ($).

Ponadto dost˛epne jest wyra˙zenie warunkowe, które pozwala na wybór jednego z agentów w zale˙zno´sci od podanego warunku logicznego. Jego konstrukcja jest nast˛epuj ˛aca:

if wyrazenie_warunkowe then AgentA

else

Przy konstruowaniu wyra˙zenia warunkowego mo˙zna stosowa´c operatory logiczne (not, and,

or), operatory arytmetyczne (+, -, *, div, mod) oraz operatory relacyjne (=, <>, <, <=, >=, >), np.:

agent A(x:I) = if x > 1 and x < 4 then ’out(true).A

else

’out(false).A;

agent A(x:I) = if x mod 2 = 0 then

’out(true).A

else

’out(false).A;

Aby zdefiniowa´c operatory relacyjne (<>, <, <=, >=, >) w VP-XCCS stosowana jest glo-balna relacja porz ˛adku. Relacja ta jest definiowana dla warto´sci ró˙znych typów. Zaczynaj ˛ac od warto´sci „najmniejszych”, porz ˛adek jest nast˛epuj ˛acy:

• warto´sci logiczne, • liczby całkowite, • napisy, • krotki, • listy, • zbiory.

Przykładowo, według tak zdefiniowanej relacji porz ˛adku liczba całkowita jest mniejsza od do-wolnego napisu, dowolna krotka jest mniejsza od zbioru pustego itd. Dla warto´sci logicznych

false< true. Dla liczb całkowitych obowi ˛azuje relacja mniejszo´sci, za´s napisy, krotki i listy s ˛a uporz ˛adkowane leksykograficznie. Zbiory s ˛a porz ˛adkowane tak jak listy (przed porównaniem porz ˛adkowane s ˛a elementy w zbiorze i usuwane duplikaty).

5.3. Modelowanie z wykorzystaniem VP-XCCS

VP-XCCS nie udost˛epnia wszystkich konstrukcji dost˛epnych w VP-CCS obsługiwanym przez konwerter jvp. Celem tych ogranicze´n jest uproszczenie procesu modelowania, skróce-nie czasu potrzebnego do opanowania narz˛edzia oraz unikni˛ecie skróce-nieintuicyjnych konstrukcji mog ˛acych powodowa´c pó´zniejsze problemy.

W skryptach jvp generowanych przez edytor Inez wszystkie porty parametryzowane zapisy-wane s ˛a jako etykiety indeksowane. Pozwala to na unikni˛ecie potencjalnego problemu w trak-cie konstruowania modelu wynikaj ˛acego z mo˙zliwo´sci podwójnego indeksowania elementów w portach wej´sciowych. Rozwa˙zmy przykład z listingu 5.1 oraz wynik jego konwersji do CCS zamieszczony na listingu 5.2. Wynikowe agenty B, C i D s ˛a zgodne z oczekiwaniem i przed-stawiaj ˛a sum˛e wyra˙ze´n z okre´slonego zakresu. Agent A natomiast został zindeksowany dwu-krotnie. Raz w wyniku zastosowania funkcji sum i drugi raz, niejawnie w wyniku obecno´sci indeksowanej etykiety a(x), gdzie x jest typu Size.

W VP-XCCS ka˙zde indeksowania jest jawne i polega na podaniu ˙z ˛adanego zakresu. Zakres indeksowania mo˙zna okre´sli´c przez podanie typu zmiennej lub zbioru dopuszczalnych warto-´sci z wykorzystaniem dowolnych dost˛epnych funkcji. W pierwszym przypadku indeksowanie przebiega po wszystkich elementach z danego typu.

const Max = 5

const Size = range(1,Max)

label a(Size)

label b_Size

agent A = sum(x:range(1,Max), a(x).A(x))

agent B = sum(x:range(1,Max), b_x.B(x))

agent C = sum(x:range(1,Max), ’a(x).C(x))

agent D = sum(x:range(1,Max), ’b_x.D(x))

Listing 5.1. Suma parametryzowanych i indeksowanych etykiet (jvp)

agent A = a%1%.A%1% + a%2%.A%2% + a%3%.A%3% + a%4%.A%4% +

a%5%.A%5% + a%1%.A%1% + a%2%.A%2% + a%3%.A%3% + a%4%.A%4% + a%5%.A%5% + a%1%.A%1% + a%2%.A%2% + a%3%.A%3% + a%4%.A%4% + a%5%.A%5% + a%1%.A%1% + a%2%.A%2% + a%3%.A%3% + a%4%.A%4% + a%5%.A%5% + a%1%.A%1% + a%2%.A%2% + a%3%.A%3% + a%4%.A%4% + a%5%.A%5%;

agent B = b%^1%.B%1% + b%^2%.B%2% + b%^3%.B%3% +

b%^4%.B%4% + b%^5%.B%5%;

agent C = ’a%1%.C%1% + ’a%2%.C%2% + ’a%3%.C%3% +

’a%4%.C%4% + ’a%5%.C%5%;

agent D = ’b%^1%.D%1% + ’b%^2%.D%2% + ’b%^3%.D%3% +

’b%^4%.D%4% + ’b%^5%.D%5%;

Listing 5.2. Suma parametryzowanych i indeksowanych etykiet (CWB)

Rozwa˙zmy nast˛epuj ˛acy zapis w algebrze VP-XCCS b˛ed ˛acy fragmentem definicji agenta: ... aLabel(x:Type).Agent;

Wynikiem konwersji powy˙zszego fragmentu b˛edzie: ... sum(x:Type,aLabel_x.Agent);

Natomiast je´sli zapis pozbawiony jest wyra˙zenia okre´slaj ˛acego zakres konwersja przebiega w poni˙zszy sposób:

... aLabel(x).Agent; do

... aLabel_x.Agent;

Zakłada si˛e w tym wypadku, ˙ze warto´s´c x została zwi ˛azana wcze´sniej w wyra˙zeniu.

Drugim elementem dodawanym w trakcie konwersji do VP-CCS jest tzw. agent startowy. Dodawany jest on, je´sli w warstwie graficznej znajduje si˛e definicja stanu pocz ˛atkowego para-metryzowanego agenta (rys. 5.1). Wynika to z zało˙zenia, ˙ze ka˙zdy agent w XCCS i VP-CCS posiada swój stan pocz ˛atkowy. Agent startowy jest to agent nieparametryzowany posiadaj ˛acy nazw˛e tak ˛a jak agent podstawowy i zdefiniowany jako agent parametryzowany ze wskazanym argumentem. Przykład zastosowania powy˙zszej procedury znajduje si˛e w paragrafie 5.5.1.

5.4. Konwersja diagramów XCCS do algebry VP-CCS

Konwersja diagramów VP-XCCS w znacznej cz˛e´sci oparta jest na algorytmie wykorzysty-wanym dla wersji bez przesyłania danych. Dlatego te˙z niniejszy rozdział b˛edzie zawierał tylko opis ró˙znic, tj. dodatkowych kroków niezb˛ednych do prawidłowego wygenerowania skryptu dla wersji VP.

Pierwszym krokiem algorytmu, podobnie jak w przypadku modelu XCCS (zob. rozdz. 4.4) jest stworzenie modelu logicznego grafu. Ró˙znice w strukturze modelu wynikaj ˛a z konieczno´sci uwzgl˛ednienia w nim argumentów powi ˛azanych z agentami i portami oraz dodatkowej infor-macji zawieraj ˛acej globaln ˛a tablic˛e z deklaracjami stałych i typów. Nie zmienia si˛e macierz opisuj ˛aca poł ˛aczenia mi˛edzy portami.

Na wygenerowanym modelu logicznym wykonywane s ˛a kroki algorytmu konwersji opisane w paragrafach od 4.4.1 do 4.4.6. Generacja skryptu VP, ze wzgl˛edu na swoj ˛a specyfik˛e wygl ˛ada inaczej. Wykonywane s ˛a podczas niej nast˛epuj ˛ace kroki:

1. Generowany jest nagłówek z definicjami typów i deklaracjami stałych. 2. Generowana jest lista z deklaracjami etykiet.

3. Generowane s ˛a definicje poszczególnych agentów, przy czym podmianie ulegaj ˛a nast˛e-puj ˛ace elementy:

(a) Je˙zeli agent posiada argument okre´slaj ˛acy stan pocz ˛atkowy, to generowany jest agent startowy.

(b) Apostrof dodawany jest do nazw portów wyj´sciowych. (c) Wszystkie porty zostaj ˛a zamienione na indeksowane etykiety.

(d) Dla definicji agentów zawieraj ˛acych warto´s´c pocz ˛atkow ˛a generowany jest agent startowy (zob. podrozdz. 5.3).

(e) Porty zawieraj ˛ace deklaracj˛e zakresu zamieniane s ˛a na sum˛e po wszystkich poda-nych warto´sciach (zob. podrozdz. 5.3).

(f) Generowana jest lista portów ograniczonych.

(g) Generowany jest agent System b˛ed ˛acy zło˙zeniem wszystkich agentów wyst˛epuj ˛ a-cych w modelu.

(h) Zapisywany jest plik z gotowym skryptem.

Wygenerowany skrypt mo˙zna skonwertowa´c za pom ˛ac ˛a jvp do wersji akceptowanej przez CWB.

5.5. Przykłady

W poni˙zszym podrozdziale zaprezentowano przykłady modeli w j˛ezyku VP-XCCS wraz z automatycznie generowanymi na ich bazie skryptami do wersji VP akceptowanej przez na-rz˛edzie jvp oraz skryptami CCS generowanymi przez translator jvp. Przykłady te s ˛a ilustracj ˛a zagadnie´n omawianych w podrozdziałach 5.3 oraz 5.4.

5.5.1. Producent - konsument

Pierwszy przykład to model znanego z literatury systemu producent-konsument z buforem n-elementowym. Warstw˛e graficzn ˛a modelu pokazano na rys. 5.2.

put(x : Size)

get(x : Size) get(x : Size) produce(x : Size)

Producer Buffer

put(x : Size)

Consumer

need(x : Size)

W dokumencie Index of /rozprawy2/10134 (Stron 63-70)

Powiązane dokumenty