ペトリネット
ペトリネットについて
ペトリネットは、離散事象システムにおける並行性・同期・リソースフローをモデリングするための基礎的な形式手法です。1962年に Carl Adam Petri が発明し、コンピュータサイエンス・制御工学・製造・ビジネスプロセスモデリングの分野で継続的に使用されています。記法はシンプルで一目でわかります。プレースは円、トランジションはバー、アークは重みを持ち、システムの動的状態はプレース上に散りばめられたトークンで表されます。
Schematex の petri エンジンがドラッグ&ドロップの形状ライブラリと異なるのは、動的挙動を理解している点です。マーキング(どのプレースにいくつのトークンがあるか)を知り、どのトランジションが有効(enabled)か(各入力プレースにアーク重み以上のトークンがある — 緑でハイライト)を計算し、トランジションを発火させて次のマーキングを生成できます。レンダリングはセマンティクスの下流にあります — pert がスケジューリングに対して取るのと同じスタンスです。状態図(トークン分布ではなく1つのアクティブ状態)、sfc(PLC 用の制限されたセーフペトリネット)、bpmn(トークンセマンティクスがワークフローペトリネットへの縮小によって定義される)とは明確に異なります。
初期マーキングでは、T1 が有効です(入力の P1 と P4 がそれぞれトークンを持つ)ので緑のリングが付きます。T2 は有効ではありません(P2 が空)。P4 -> T1 のフィードバックアークはバックエッジカーブとしてルーティングされます。
1. はじめてのネット
すべてのドキュメントは petri キーワードと任意のタイトルで始まり、プレースとトランジションを宣言してからアークで接続します。
petri "Minimal"
place P1 *1
transition T1
place P2
P1 -> T1
T1 -> P2place <id>— 円。*1で初期トークン数(マーキング)を設定します。transition <id>— バー(イベント/アクション)。<a> -> <b>— 有向アーク。アークは二部構造です。すべてのアークはプレース→トランジションまたはトランジション→プレースの方向であり、プレース→プレースやトランジション→トランジションはありません。間違いを書くと、エンジンがどの行かを教えてくれます。
他の一部の Schematex 図とは異なり、ノードはアークから自動宣言されません — 未宣言の ID はプレースかトランジションかを安全に型付けできないためです。不明なノードへのアークは読みやすいエラーになります。
2. マーキングとトークン
マーキングは各プレースが持つトークンの数です。3つの等価な設定方法があります。
place P1 *3 # *n shorthand
place P2 tokens: 3 # explicit
place P3 ••• # literal dots (1–4)または marking: 行で複数のプレースをまとめて設定できます。
marking: P1=3, P3=2トークンは点(4つまでグリッドにレイアウト)としてレンダリングされ、それ以上は数字で表示されます。tokens: dots | count | auto(デフォルト auto)でスタイルを強制できます。
3. トランジション:即時と時限
transition fast # immediate — a solid bar (the default)
transition slow timed rate: 0.8 # timed — a hollow box with a rate label λ即時トランジションはゼロ時間で発火し、古典的な塗りつぶしバーとして描画されます。時限トランジション(GSPN の慣習)は中空のボックスとして描画され、オプションの rate:(λ)を持ちます。rate: を持つトランジションは自動的に時限として扱われます。prio: n で優先度を設定し、[guard] はラベルとして描画されます(v0.1 では評価されません)。
4. アークの種類
4種類のアークヘッドが標準的な並行性の語彙をカバーします。
P -> T # standard arc (filled arrowhead)
P -> T weight: 2 # weight > 1 is labelled (weight: n or *n)
P -o T # inhibitor — enabled only while the place is empty (hollow-circle head)
P -- T # read / test — tests presence without consuming (no head)
P => T # reset — empties the place when the transition fires (double head)抑制アークとリセットアークはプレース→トランジションのみ — パーサーは逆方向を拒否します。
5. 容量
プレースに上限を設定できます。それを超えようとする発火は無効になり、プレースは破線の境界線と K=n ラベルで描画されます。
place Buffer capacity: 36. 動的挙動:有効化と発火
エンジンはすべてのレンダリングでセマンティクスを計算します。
- **有効(Enabled)**なトランジション(すべての入力が満たされ、抑制入力が空で、出力が容量を超えない)は緑のリングを持ちます。
- デッドトランジション — 現在のマーキングから決して発火できないもの — はミュートされます。
fire:行は発火シーケンスを再生し、結果として生じるマーキングをレンダリングします。
petri
place P1 *1
transition T1
place P2
transition T2
place P3
P1 -> T1
T1 -> P2
P2 -> T2
T2 -> P3
fire: T1T1 を発火させると、トークンが P1 → P2 に移動し、今度は T2 が有効なトランジションになります。SVG の <desc> にマーキング、有効セット、および検出されたサブクラス(状態機械 / マークドグラフ / ワークフローネット)が記録されます。
7. レイアウトとテーマ
layout: lr # left-to-right (default)
layout: tb # top-to-bottomプレースとトランジションは交互のレイヤーに自動的に配置されます。サイクルが検出され、そのフィードバックアークはバックエッジカーブとしてルーティングされます。3つのテーマ:
default— ハウスのブルーグレー、有効には緑、抑制には赤が予約されています。monochrome— 忠実な Murata-1989 テキストブックの見た目。有効は二重の黒いリングで表示されます(色はなく形状で区別)。dark— Catppuccin Mocha。
CJK ラベルと 「…」 / "…" の引用符はクリーンにパースされます。
petri "生産流程"
place 原料 *2 「原材料」
transition 加工
place 成品
原料 -> 加工 weight: 2
加工 -> 成品完全な仕様:ペトリネット標準リファレンス。
関連サンプル
サンプルギャラリーから使用可能なシナリオ:
Found this useful?
Schematex is free, fully open source, and zero-dependency. A star helps other developers discover it.