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.
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.
Zadanie: zmień wyrażenie wyjściowe tranzycji na dowolnie wybrane.
W Renew tranzycji można przypisać dozór. Po słowie guard należ wprowadzić wyrażenie logiczne
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.
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.
Tutaj dodatkowo drukujemy znaki.
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.
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().
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.
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?.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().
Zadanie: dodaj jeszcze jeden proces wołający wait - signal (oczywiście z wykorzystaniem copy-paste)
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.