Garavel-15-a

**Nested-Unit Petri Nets: A Structural Means to Increase Efficiency and Scalability of Verification on Elementary Nets**

*Hubert Garavel*

Proceedings of the 36th International Conference on Application and Theory of Petri Nets and Concurrency (PETRI NETS'15), Brussels, Belgium, June 2015

*[April 2019] This conference paper has been superseded by a journal article*.

**Abstract:**

Petri nets can express concurrency and nondeterminism but not hierarchy. This article presents an extension of Petri nets, in which places can be grouped into so-called ``units'' expressing sequential components. Units can be recursively nested to reflect the hierarchical nature of complex systems. This model called NUPN (Nested-Unit Petri Nets) was originally developed for translating process calculi to Petri nets, but later found also useful beyond this setting. It allows significant savings in the memory representation of markings for both explicit-state and symbolic verification. Six tools already implement the NUPN model, which is also part of the next edition of the Model Checking Contest.

21 pages | PostScript |

(Extended) slides of H. Garavel's lecture at the Petri Net 2015 conference |

Slides of H. Garavel's lecture at OPCT'17 (Open Problems in Concurrency Theory) |

**ERRATA [September 17, 2018]**

- In
**Definition 3**, 8th item (definition of a reachable marking), replace:

... and*n*markings M_{1}, M_{2}, ..., M_{n}such that M_{0}—t_{1}→ M_{1}—t_{2}→ M_{2}... —t_{n}→ M_{n}.

with:

... and*n-1*markings M_{1}, M_{2}, ..., M_{n-1}such that M_{0}—t_{1}→ M_{1}—t_{2}→ M_{2}... M_{n-1}—t_{n}→ M. - On the 2nd line of the proof of
**Proposition 4**, replace:

...**unit**(*u*) ...**unit**(*u'*)

with:

...**places**(*u*) ...**places**(*u'*)

**ERRATA [November 22, 2018]**

- On the 9th line of the proof of
**Proposition 8**, replace:

... =**disjoint**(u_{1}, u_{2}) =*false*, since ...

with:

... =**disjoint**(u_{1}, u_{2}) =*true*, since ... - On the last line of the proof of
**Proposition 9**, replace:

... =**disjoint**(u_{1}, u_{2}) =*false*, since ...

with:

... =**disjoint**(u_{1}, u_{2}) =*true*, since ...