Interface PNML para Haskell



A Petri Net Markup Language (PNML) consiste num formato XML para definição de redes de Petri. Este formato tem sido adoptado por muitas ferramentas para especificação e verificação de redes Petri, sendo muito útil na migração de redes entre ferramentas. A PNML distingue entre características gerais e especificas de um determinado tipo de redes, sendo as últimas definidas numa Petri Net Type Definition (PNTD). Por exemplo, no site deste projecto existe já uma PNTD para redes P/T.

Pretende-se neste projecto desenvolver um parser e um gerador de PNML em Haskell. O parser deverá aceitar uma rede P/T e produzir um elemento cujo tipo pertence à seguinte classe. O gerador de PNML deve ser genérico e aceitar qualquer tipo que pertence à classe PTNet.

{-# OPTIONS -fglasgow-exts #-}
module PTNet where

import Data.Set
import Data.Map

class (Eq p, Show p, Eq t, Show t) => PTNet n p t where
    places :: n p t -> Set p
    trans :: n p t -> Set t
    pre :: n p t -> Map (p,t) Int
    pos :: n p t -> Map (t,p) Int
    capacity :: n p t -> Map p Int
    initial :: n p t -> Map p Int


Os tipos de dados Set e Map implementam, respectivamente, conjuntos e funções finitas e fazem parte das bibliotecas hierárquicas do GHC. Para desenvolver este projecto deve ser usada uma biblioteca para manipulação de XML em Haskell, como por exemplo a HaXML. Para tal poderá ser necessário definir um DTD que corresponda à PNTD em questão, pois a PNML usa como formato de especificação schemas RELAX NG. Existem outras bibliotecas para manipulação de XML que já incluem algum suporte para este formalismo, como por exemplo a Haskell XML Toolbox.

Uma ferramenta que podem usar para editar redes P/T e gerar PNML é o WoPeD (obrigado ao Samuel Silva pela referência). Outra ferramenta que pode ser testada é o PIPE (não parece totalmente robusta, mas consegue ler o PNML gerado pelo WoPeD e faz uma série de análises que nos interessam).