【问题标题】:Petri net drawing and code generationPetri 网绘图和代码生成
【发布时间】:2011-02-09 14:32:20
【问题描述】:
是否有任何软件可以绘制 Petri 网并从那里生成任何源代码?源代码可以是任何已知的编程语言...
稍微不太理想的选项是在基于文本的文件中以某种开放格式(如 XML 或任何其他数据语言)输出仅包含 Petri 网图描述的文件。然后我可以自己编写代码生成器,但至少我想避免 gui/graph 开发部分;))
谢谢
【问题讨论】:
标签:
automation
code-generation
metaprogramming
petri-net
【解决方案1】:
我正在用 Ruby 开发 y_petri。目前,YPetri 可以处理可视化(YPetri::Net 类有 #visualize 方法使用 Graphviz 来绘制网络),但不是您似乎想到的 GUI 编辑。仅供参考,首先,Petri 网中的 GUI 编辑并不像看起来那么重要。
使用的数据语言是 Ruby 本身(更准确地说,是用 Ruby 编写的内部 DSL)。
Petri 网的一个主要问题是,它们的种类实在太多了。 YPetri 试图成为一个通用的 Petri 网框架,具有 1 种位置(任意标记类型)和 4 种基本类型的转换(定时/永恒 x 化学计量/非化学计量)。此外,还有第五种转换,赋值转换,它用函数的返回值替换目标位置的标记。我相信这可以用来描述任何动态系统,同时尽可能简约。
Petri 网弧被理解为转换和位置之间的关系(它们属于 y_petri 中的转换。我发现有一种方法可以表达 Petri 网节点(位置/转换)之间的关系,而不仅仅是弧. 为此,I use Ted Nelson's ZZ structure (ZigZag) basically as a replacement for a relational database。
至于模拟(Petri网执行),一般的混合Petri网没有比隐式欧拉法(我称之为伪欧拉法)更快的模拟方法。这是因为 Petri 网可用于实现图灵机,而一般的加速是不可能的。
如果您愿意在 Ruby 中进行操作,那么您可以使用 y_petri 或 y_nelson DSL 代码来描述 Petri 网。我不提供到 XML 的转换,因为我不认为它优于源 DSL。可以编写这样的导出例程,但我鼓励您改用 DSL。
【解决方案2】:
我会看看CPN Tools。它们提供各种有色Petri网的构建、分析、模拟,以及索赔代码生成能力。