Tutorial - LoLA - e-Learning
Transcript
Tutorial - LoLA - e-Learning
Tutorial - LoLA A Low Lever Petri Net Analyzer Massimiliano Scotti 1 Introduzione LoLA è un tool di analisi per reti di Petri di tipo P/T. Una rete deve essere definita secondo una notazione testuale. Il linguaggio di definizione è semplice ed esplicativo e dunque utilizzabile anche da programmatori non esperti. In questo tutorial affronteremo le seguenti fasi: • installazione del tool • breve introduzione alla sintassi • esempi di utilizzo • impressioni 2 Installazione L’installazione di LoLA necessita di un compilatore C++ come per esempio GCC. 2.1 Utenti UNIX Si presuppone che abbiate installato già un compilatore adatto. Per gli utenti Mac OS X lo si può installare tramite Xcode avendo cura di installare i componenti opzionali ‘command line tools’. Per quanto riguarda gli utenti Linux installare dagli opportuni repository della propria distribuzione i pacchetti necessari. Aprite il vostro terminale preferito. Se state utilizzando Linux scaricate i file sorgenti col seguente comando: 1 $ wget http://download.gna.org/service-tech/lola/lola-1.16.tar.gz Se state utilizzando Mac OS X invece utilizzate: $ curl -O http://download.gna.org/service-tech/lola/lola-1.16.tar.gz La versione in uso è la 1.16. Potete verificare eventuali nuove versioni su: http://download.gna.org/service-tech/lola/ Poi date i seguenti comandi uno dopo l’altro: $ gunzip lola-1.16.tar.gz $ tar xf lola-1.16.tar Entrate nella directory creata con: $ cd lola-1.16 Date il seguente comando: $ ./configure Ora dovete compilare. LoLA possiede diverse configurazioni predefinite che consentono di lanciare il tool con una determinata configurazione cosı̀ da poter verificare una certa proprietà. Per compilare tutte le configurazioni predefinite (consigliato) utilizzare: $ make all-configs È anche possibile compilare solo una delle configurazioni possibili. Fare riferimento alla guida ufficiale disponibile online [2]. Più avanti vedremo come utilizzare i vari eseguibili per verificare determinate proprietà. Concludiamo installando i sorgenti compilati con il seguente comando: $ make install In generale, se si vuole avere una particolare configurazione che non è tra quelle predefinite, bisogna modificare il file userconfig.H ed ogni volta ridare i seguenti comandi: $ make $ make install 2 2.2 Utenti Windows Gli utenti Windows non in possesso di una macchina virtuale Linux installata sul proprio sistema possono utilizzare Cygwin, un emulatore che permette di eseguire software per sistemi POSIX su Windows. Anche in questo caso si deve essere in possesso di un compilatore C++. Per questo si consiglia MinGW. Scaricatelo da http://www.mingw.org, installatelo (potete decidere quali compilatori installare durante questa fase), avendo cura di aggiungere a fine installazione il percorso C:\MinGW\bin alla variabile d’ambiente e riavviate. Scaricate Gygwin da http://www.cygwin.com. Durante l’installazione nella scelta dei pacchetti, dopo aver impostato la ‘View’ in alto a destra su ‘Not Installed’ o ‘Full’, dovete cercare nel campo apposito ‘Search’ la parola chiave ‘make’. Quindi cliccate su ‘Skip’ corrispondente alla riga del package ‘make: The GNU version of the make utility’ e lasciate spuntata la colonna ‘Bin?’. Cygwin crea un insieme di directory tipiche degli ambienti UNIX nel percorso selezionato in fase di installazione; quello predefinito sarà C:\cygwin. Scaricate l’ultima versione di LoLA, copiate la cartella decompressa nel percorso C:\cygwin\home\nomeutente e seguite le istruzioni per gli ambienti UNIX qui sopra. 3 Sintassi del linguaggio La grammatica del linguaggio permette di definire reti P/T e anche reti di alto livello. In questa guida affronteremo solo la sintassi per reti di basso livello. 3.1 3.1.1 Basi del linguaggio Identificatori Un identificatore è qualsiasi stringa di caratteri che non contiene i seguenti: , ; : () 3.1.2 Numeri I numeri sono qualsiasi sequenza di caratteri numerici. Non esiste il concetto di numero con segno. 3.1.3 Keywords LoLA possiede alcune keyword. Vedremo le più importanti più avanti. 3 3.1.4 Commenti I commenti possono essere fatti su una riga sola: { questo è un commento su una riga } Oppure su più righe: /* Questo è un commento su più righe */ 3.2 Posti I posti sono definiti con la keyword PLACE a cui segue opzionalmente la keyword SAFE che, seguita opzionalmente da un numero, serve a limitare la capacità dei posti che seguono. SAFE 1 equivale a SAFE. In alternativa si può modificare nel file userconfig.H la voce CAPACITY. Se non si specifica nulla né nella definizione dei posti né nel file il limite massimo diventa la rappresentazione di un intero nel vostro calcolatore. Notiamo inoltre come questa opzione a livello effettivo non abbia nessun tipo di influenza sulla regola di scatto (per esempio, in una eventuale esportazione in PNML non viene definito tale attributo), bensı̀ LoLA, previa modifica del file userconfig.H nella voce CHECKCAPACITY, può avvisare che nell’evoluzione della rete si raggiunge uno stato in cui la capacità definita viene superata. PLACE SAFE p1, 17, helloworld, p[]....8[[[; p2 , p3 ; SAFE 7 : p4 , p5; Qui sono definiti 8 posti: i primi quattro hanno capacità 1, p2 e p3 hanno capacità massima specificata nel file userconfig.H o limitata dal calcolatore, p4 e p5 hanno capacità 7. 3.3 Marcatura iniziale Dopo aver definito una lista di posti LoLA prevede la definizione di una marcatura iniziale con la keyword MARKING. Esempio: MARKING p1 : 13, p2 : 3 , p1 : 4 ; I posti non citati hanno marcatura iniziale 0, se la marcatura in un posto viene specificata più volte LoLA esegue una somma dei token in quel posto. 4 3.4 Transizioni e archi Infine si definiscono le transizioni. Le keyword da utilizzare sono TRANSITION, seguita da un identificatore di transizione, una lista di archi entranti, separati da virgola, preceduta da CONSUME e terminata con un punto e virgola, infine una lista di archi uscenti, separati da virgola, preceduta da PRODUCE e terminata da un punto e virgola. Ogni arco consiste di un nome di un posto, un ‘:’ e un numero che ne rappresenta il peso. Esempio: TRANSITION t1 CONSUME p1:2 , p2:4 ; PRODUCE p1:2 , p3:2 ; 4 Esempi 4.1 Proprietà della rete Come primo esempio utilizziamo questa semplice rete: p2 t1 p1 p3 Il codice LoLA corrispondente, contenuto in ex1.lola, è il seguente: PLACE p1,p2,p3; MARKING p1:1; TRANSITION t1 CONSUME p1 : 1; PRODUCE p2 : 1, p3 : 1; 5 Spostiamoci col terminale nella directory dove è contenuto il file. Come precedentemente anticipato, una volta compilate le varie preconfigurazioni di LoLA, possiamo utilizzarle una ad una per verificare determinate proprietà. Basterà chiamare l’eseguibile corrispondente.1 Per esempio, verifichiamo che la rete sia reversibile ricordando che una rete di Petri, con marcatura iniziale m0 è reversibile se e solo se ∀m ∈ [m0 i, m0 ∈ [mi, ossia se la marcatura iniziale è raggiungibile a partire da ogni marcatura raggiungibile dalla marcatura iniziale. $ lola-reversibility ex1.lola lola: 3 places lola: 1 transitions lola: 1 significant places lola: >>>>> 2 States, 1 Edges, 2 Hash table entries lola: >>>>> 1 States, 0 Edges, 1 Hash table entries lola: not reversible: no return to m0 from reported state La rete, come è facilmente intuibile, non è reversibile, e possiede uno stato di deadlock, ossia uno stato in cui la marcatura corrente non abilita nessuna transizione della rete: $ lola-deadlock ex1.lola lola: 3 places lola: 1 transitions lola: 1 significant places lola: dead state found! lola: >>>>> 2 States, 1 Edges, 2 Hash table entries Esiste anche l’eseguibile lola-deadlock1 che verifica oltre al deadlock anche che ogni posto abbia al massimo un token al suo interno. Ora modifichiamo la rete in questo modo: t2 p2 t1 p1 p3 1 Si consiglia di digitare lola- e poi utilizzare il tab per listare tutte le possibili opzioni eseguibili. 6 Salviamo le modifiche dopo l’aggiunta della transizione t2 nel file ex2.lola: PLACE p1,p2,p3; MARKING p1:1; TRANSITION t1 CONSUME p1 : 1; PRODUCE p2 : 1, p3 : 1; TRANSITION t2 CONSUME p2 : 1; PRODUCE p1 : 1; Risulta facilmente intuibile che risultato si ottiene verificando la proprietà di limitatezza della rete: $ lola-boundednet ex2.lola lola: 3 places lola: 2 transitions lola: 2 significant places lola: net is unbounded! lola: >>>>> 3 States, 2 Edges, 3 Hash table entries Come verificheremo in seguito, il posto p3 accumula un numero potenzialmente illimitato di marche. 4.2 Proprietà della marcatura È possibile verificare se una determinata marcatura è raggiungibile attraverso lo scatto di una sequenza di transizioni. Per farlo bisogna utilizzare un secondo file con estensione .state per definire la marcatura. Di seguito un esempio. Il contenuto del file ex2.state è: 7 ANALYSE MARKING p1 : 1, p3 : 1 Verifichiamo la proprietà: $ lola-reachability ex2.lola -a ex2.state lola: 3 places lola: 2 transitions lola: 2 significant places lola: state found! lola: >>>>> 3 States, 2 Edges, 3 Hash table entries Con lo scatto di t1 e t2 si raggiunge la marcatura espressa nel file ex2.state. 4.3 Proprietà dei posti In precedenza si è verificato che la rete non è limitata. Nel posto p3 infatti si accumulano infiniti token. Di seguito verifichiamo, anche se in questo caso risulta molto evidente, che si tratta effettivamente del posto p3. Creiamo il file ex2.task dal seguente contenuto: ANALYSE PLACE p3 Ora diamo il seguente comando: $ lola-boundedplace ex2.lola -a ex2.task lola: 3 places lola: 2 transitions lola: 2 significant places lola: place p3 is unbounded! lola: >>>>> 3 States, 2 Edges, 3 Hash table entries Come volevasi dimostrare. 4.4 4.4.1 Uso di formule CTL Definizione CTL [1] è un linguaggio logico temporale che serve ad esprimere proprietà la cui validità può cambiare nel tempo. Un grafo di raggiungibilità di una rete di Petri è un grafo in cui ai nodi sono associati stati globali del sistema che rappresentano tutte le possibili marcature e agli archi è associato lo scatto di determinate 8 transizioni che portano ad un nuovo stato. Il grafo di raggiungibilità può essere visto come l’insieme di tutte le possibili esecuzioni del sistema modellato, e una esecuzione come un determinato cammino nel grafo. Poiché l’evoluzione di una rete di Petri è discreta, faremo riferimento a tempi discreti. CTL possiede diversi operatori che vediamo direttamente nel campo applicativo del tool. Una formula CTL in LoLA si apre con la keyword FORMULA. Diamo una definizione ricorsiva: • Ogni confronto è una formula CTL. Un confronto consiste di un nome di un posto, un operatore e un numero naturale. • Ogni combinazione booleana di formule CTL è una formula CTL. • Ogni formula CTL preceduta dalle seguenti keyword è a sua volta una formula CTL: ALLPATH ALWAYS, EXPATH ALWAYS, ALLPATH EVENTUALLY, EXPATH EVENTUALLY, ALLPATH NEXTSTEP, EXPATH NEXSTEP. ALLPATH identifica il quantificatore universale ‘per ogni’ e richiede la validità della formula che lo segue su ogni cammino. EXPATH identifica il quantificatore esistenziale ‘esiste’ e richiede che esista almeno un cammino su cui vale la formula che lo segue. ALWAYS richiede che la formula a cui è applicata sia valida in tutti gli stati del cammino (corrisponde all’operatore temporale G). EVENTUALLY richiede che lungo il cammino vi sia almeno uno stato in cui vale la formula a cui è applicata (corrisponde all’operatore temporale F). NEXTSTEP richiede la validità della formula a cui è applicata nello stato successivo a quello corrente ed equivale all’operatore temporale X. • Inoltre se p e q sono due formule CTL anche EXPATH [p UNTIL q ] e ALLPATH [p UNTIL q ] sono formule CTL. La keyword UNTIL corrisponde all’operatore temporale U. 4.4.2 Uso e model checking LoLA non ha la possibilità di verificare direttamente la vivezza di una rete. Tuttavia si possono utilizzare tecniche alternative per provare la liveness. Una di queste è l’utilizzo di una formula CTL. Una rete è viva se ∀t ∈ T, ∀m ∈ [m0 i ∃m0 ∈ [mi : m0 [ti Prendiamo come esempio questa rete: 9 t2 t1 p2 p1 p3 t3 Il codice del file ex3.lola corrispondente alla rete in figura è: PLACE p1,p2,p3; MARKING p1:1; TRANSITION t1 CONSUME p1:1; PRODUCE p2:1; TRANSITION t2 CONSUME p2:1; PRODUCE p3:1; TRANSITION t3 CONSUME p3:1; PRODUCE p2:1; La rete non è viva in quanto la transizione t1 può scattare una sola volta (1-live). Verifichiamo questa proprietà con LoLA. Creiamo il file ex3.ctlformula dal seguente contenuto: FORMULA ALLPATH ALWAYS EXPATH EVENTUALLY p1 >= 1 AND ALLPATH ALWAYS EXPATH EVENTUALLY p2 >= 1 AND ALLPATH ALWAYS EXPATH EVENTUALLY p3 >= 1 Verifichiamo la proprietà nel seguente modo: $ lola-modelchecking ex3.lola -a ex3.ctlformula lola: 3 places 10 lola: 3 transitions lola: 2 significant places Formula with 11 subformulas and 6 temporal operators. result: false lola: >>>>> 3 States, 11 Edges, 3 Hash table entries Come facilmente intuibile, la rete non è viva. Modifichiamola come segue: t4 t2 t1 p2 p1 p3 t3 Aggiungendo al file ex3.lola la seguente transizione: ... ... ... TRANSITION t4 CONSUME p2:1; PRODUCE p1:1; Rieseguiamo il test: $ lola-modelchecking ex3.lola -a ex3.ctlformula lola: 3 places lola: 4 transitions lola: 2 significant places Formula with 11 subformulas and 6 temporal operators. 11 result: true lola: >>>>> 3 States, 18 Edges, 3 Hash table entries Ora la rete è viva. 4.4.3 PNML PNML è l’acronimo di Petri Net Markup Language ed è un uno standard basato su XML che permette lo scambio tra strumenti di analisi differenti su reti di Petri. Un file PNML prevede una determinata struttura in cui viene definita la topologia della rete ed eventualmente informazioni di carattere grafico per tool che supportano questa modalità. È possibile esportare il PNML con LoLA attraverso la seguente istruzione: $ lola-none mynet.lola -n lola: 3 places lola: 1 transitions L’eseguibile lola-none non fa nulla, né espande il grafo di raggiungibilità né quindi compie alcun tipo di analisi. Verranno creati nella directory corrente due file con nome identico a quello della definizione della rete ma con estensione diversa. In particolare .pnml conterrà la rete in formato PNML mentre il file con estensione .llnet l’equivalente rete di basso livello nel caso in cui avessimo definito nel file .lola una rete di alto livello. 4.4.4 Moduli accessori LoLA permette di salvare in un’immagine il grafo di raggiungibilità della rete data in input. La versione corrente, 1.16, soffre di un bug per il quale non possiamo utilizzare la configurazione più corretta, ossia lola-full. Essa non farebbe altro che espandere il grafo di raggiungibilità in formato testuale e stamparlo a video grazie all’opzione -M oppure scriverlo in un file di testo con estensione .graph tramite l’opzione -m. Vedremo in seguito come ottenere la versione grafica. Facendo riferimento al file ex3.lola, il grafo espanso e rappresentato in formato testuale dovrebbe essere il seguente: STATE 2 Prog: 0 p3 : 1 t3 -> 1 12 STATE 1 Prog: 0 p2 : 1 t4 -> 0 t2 -> 2 STATE 0 Prog: 0 p1 : 1 t1 -> 1 Tuttavia il risultato del comando lola-full ex3.lola -M, ignorando che a video vengono comunque stampate informazioni sul numero di posti e transizioni (corretto), è il seguente: lola-full ex3.lola -M lola: 3 places lola: 4 transitions lola: 2 significant places STATE p1 : 1 Fire list: t1 t2 t3 t4 STATE p2 : 1 Fire list: t1 t2 t3 t4 STATE p3 : 1 Fire list: t1 t2 13 t3 t4 Si fa notare che le prime righe di risultato riguardanti numero di posti e transizioni nel caso venga usata l’opzione -m non vengono scritte nel file ma solo stampate a video (giustamente) e il contenuto risultante è quello da STATE in poi. Ciò che importa è che si notano effettivamente differenze di sintassi tra la versione potenzialmente corretta e quest’ultima. Infatti se nella prima per ogni stato, numerato, vi sono indicate le transizioni che portano ad altri stati, in quella generata ciò non avviene nella maniera corretta e dunque, quando la si converte in un file .dot viene segnalato un errore sintattico come vediamo qui di seguito: $ lola-full ex3.lola -M | graph2dot digraph G { node [shape=plaintext style=filled fillcolor=lightgray fontname=Helvetica] edge [fontname=Helvetica] lola: 3 places lola: 4 transitions lola: 2 significant places lola: >>>>> 3 States, 4 Edges, 3 Hash table entries 2: syntax error, unexpected NAME, expecting NUMBER } Una buona soluzione è utilizzare lola-reversibility, in cui viene anche, inutilmente, verificato che la rete sia reversibile. L’opzione -M, come già detto, invia sullo standard output il grafo in formato testuale, il quale, in seguito, viene convertito in formato dot, ed infine trasformato in un pdf. Per farlo eseguiamo il seguente comando sfruttando le pipe della shell: $ lola-reversibility ex3.lola -M | graph2dot | dot -Tpdf -o ex3.pdf Nella working directory verrà salvato il file con estensione .pdf contenente il grafo di raggiungibilità. 14 p3 t3 t2 p2 t4 t1 p1 Figura 1: Grafo di raggiungibilità della rete ex3.lola 4.5 Invarianti In questa guida si sono affrontate le proprietà e gli aspetti principali di una rete P/T. Si sarà notato come non sia stata affrontata l’analisi degli invarianti. Infatti LoLA non ha questa possibilità. È tuttavia possibile esportare il file PNML ed importarlo in un tool che permette questo tipo di analisi strutturale. Si ricordi però che il PNML generato da LoLA non contiene informazioni grafiche, come per esempio le coordinate nello spazio dei posti e delle transizioni, e dunque l’intera rete verrà collassata nel punto (0,0) in caso si importi in uno strumento di analisi grafico. Oltre a ciò bisogna notare come a livello effettivo vi sono differenze anche nei file PNML prodotti dai vari tool e questo comporta quindi una sostanziale incompatibilità tra di essi. 5 Conclusione In conclusione ritengo che LoLA sia un buon software di analisi. Potrebbe sembrare svantaggioso il fatto che non sia un tool grafico, tuttavia rimane uno stru15 mento di facile utilizzo e in alcune circostanze risulta più rapido gestire file testuali e lanciare un comando dalla shell piuttosto che utilizzare macchinosi tool grafici magari poco curati nella loro usabilità. Una potenziale mancanza potrebbe essere l’assenza di macro con le quali si possano definire strutture particolari (si pensi ad esempio ai cicli) con brevi istruzioni. D’altro canto però la semplicità di LoLA è anche la sua forza ed uno stimolo ad utilizzarlo al posto di strumenti graficamente più user-friendly. Riferimenti bibliografici [1] Claude Girault and Rudiger Valk. Petri Nets for System Engineering: A Guide to Modeling, Verification, and Applications. Springer-Verlag, 2001. [2] Karsten Wolf. LoLA - A Low Level Petri Net Analyser, June 2011. 16