Laboratorium 2

Proszę przeanalizować przykłady sieci utworzonych za pomocą pakietu Renew. 

Celem przykładów jest  pokazanie rozmaitych konstrukcji kolorowanych sieci Petriego, które mogą zostać wykorzystane przy sporządzaniu modeli do projektów. W niektórych sieciach występują odwołania do języka Java, do ich zrozumienia wystarczy znajomość składni C++. Warto także przeanalizować przykłady opisane w dokumentacji pakietu.

Uwaga: Edytor Renew nie jest niestety idealny. Wyrażenia dla łuków, wartości żetonów, akcje tranzycji wprowadzamy prawym kliknięciem myszy. Czasem zdarza się, że klikniemy dwa razy i dodamy dwa elementy w tym samym miejscu. Z reguły blokuje to wykonanie tranzycji. Warto wtedy przesunąć teksty i ewentualnie usunąć nadmiarowe elementy.

Przykłady sieci

Dodawanie

manual - aby wykonać tranzycję podczas symulacji, użytkownik musi kliknąć prawym klawiszem na jej symbol

Wykonaniu centralnej tranzycji towarzyszy dodanie wartości całkowitych. 

action System.out.println("x="+x) - w Renew tranzycji można przypisać akcję - może być nią instrukcja języka Java. Wywołanie System.out.println() powoduje wydruk na konsoli. 

renew/dodawanie.rnw

Zadanie: zmień wyrażenie wyjściowe tranzycji na dowolnie wybrane.

Dozory

W Renew tranzycji można przypisać dozór. Po słowie guard należ wprowadzić wyrażenie logiczne 

renew/guards.rnw

Zadanie: dodaj jeszcze jedno miejsce z żetonem o wartości 4 i spróbuj zastąpić stałą w dozorach wartością odczytaną z tego miejsca.

Wydzielanie liter

Wersja 1

Tekst w języku Java jest reprezentowany przez obiekt typu String. Stała będąca łańcuchem znaków jest również typu String (dokładniej referencją typu String ). Metoda length()  zawraca długość tekstu. Metoda charAt(int i) zwraca znak na i-tym miejscu. Przedstawiona sieć wydziela kolejne znaki tekstu.

renew/unpack_string.rnw

Wersja 2

Tutaj dodatkowo drukujemy znaki.

renew/unpack_string-1.rnw

Wersja 3

Znaki dodawane są do bufora. W języku Java String jest obiektem niemodyfikowalnym. Jeśli chcemy przeprowadzać operacje na tekście, należy użyć klasy StringBuffer. Pierwsza tranzycja tworzy obiekt tej klasy i umieszcza referencję do niego w miejscu opisanym jako  sbuf:StringBuffer.

Centrana tranzycja produkuje żetony typu krotka. Tutaj są parami [znak, referencja do StringBuffer]. Kolejna pokazuje sposób manipulacji krotkami.

Uwaga: Wykonanie tranzycji opisanej action y.append(x) modyfikuje zawartość miejsca sbuf:StringBuffer, chociaż tranzycja z tym miejscem nie ma połączenia. Jest to efekt uboczny zastosowania mechanizmów języka Java w Renew. Żeton sbuf (później y) jest referencją do obiektu klasy StringBuffer. Żeton umieszczony w miejscu  sbuf:StringBuffer wskazuje tan sam obiekt, stąd modyfikacja przenosi się na zawartość miejsca. W Renew żetonami mogą być: 

W zasadzie w języku Java klasa nie jest typem, ale jest nim referencja do klasy.

renew/unpack_string-2.rnw

Zadanie: dodaj miejsce modelujące listę haseł z kilkoma wartościami, między innymi zawierającymi "Ala ma kota". Dodaj tranzycję, która wykonuje się, jeśli hasło w sbuf jest na liście haseł. Dodaj dozór do tranzycji - sprawdzaj, gdy i==s.length().

 

Metody

W Renew zaimplementowano szczególne rozszerzenie kolorowanych sieci Petriego. Jest nim możliwość synchronicznego wykonania tranzycji (dokumentacja Renew, rozdział 3.7). Synchroniczne wykonanie przypomina wywołanie metod. Wołający wykonuje instrukcję this:nazwaMetody() równocześnie wykonywana jest tranzycja oznaczona przez :nazwaMetody(). Możliwe jest przesyłanie parametrów.

renew/methods.rnw

Zadanie: sprawdź, czy możliwe jest synchroniczne wykonanie 3 tranzycji. Np. pierwsza woła metodę drugiej, a druga równocześnie metodę trzeciej. 
Sprawdź, jak może wyglądać zwrócenie wartości z metody?.

Wzajemne wykluczanie (wykorzystanie metod)

Przykład pokazuje zastosowanie metod do dekompozycji sieci na obiekty składowe. Dwa procesy korzystają ze wspólnego obiektu zapewniającego wzajemne wykluczanie z metodami odpowiadającymi wait() i signal().

renew/mtx_synchro.rnw

Zadanie: dodaj jeszcze jeden proces wołający wait - signal (oczywiście z wykorzystaniem copy-paste)

 

Wydzielanie liter (z wykorzystaniem metod)

Wersja 1

Obiekt oznaczony na żółto to kontener wraz z iteratorem. Iterator ma metody start() - ustawia wartości początkowe, next() przestawia kursor na następny element, get(x) - zwraca w x znak wskazywany przez kursor, end() - tranzycja jest wykonywana, gdy iterator dojdzie do końca tekstu.

renew/unpack_string-methods.rnw

Wersja 2

Obiekt oznaczony kolorem jasnoróżowym to odbiorca znaków (bufor), udostępniający jedynie metodę append(). Centralna sieć (kolor zielony) odczytuje kolejne znaki i dodaje do bufora. Pomijane są spacje. Druga wersja jest minimalnie uproszczona.

renew/unpack_string-methods-2.rnw

renew/unpack_string-methods-3.rnw

Zadanie: dodaj do ostatniego przykładu podsieć pełniącą rolę filtra z metodą wejściową accept(x). Po odczytaniu znaku this.get(x) znak x jest przesyłany do filtra - wywołanie this.accept(x). Filtr ma zwrócić informację, czy dodawać znak do bufora wyjściowego.