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