95 lines
2.1 KiB
Plaintext
95 lines
2.1 KiB
Plaintext
// Petri Net Reachability Vision Test
|
|
// Based on 2025-12-12 design document
|
|
|
|
// Basic Petri net structure
|
|
theory PetriNet {
|
|
// Places
|
|
P : Sort;
|
|
|
|
// Transitions
|
|
T : Sort;
|
|
|
|
// Arcs (input to transitions, output from transitions)
|
|
in : Sort;
|
|
out : Sort;
|
|
in/src : in -> P;
|
|
in/tgt : in -> T;
|
|
out/src : out -> T;
|
|
out/tgt : out -> P;
|
|
}
|
|
|
|
// A marking is a multiset of tokens, each at a place
|
|
theory (N : PetriNet instance) Marking {
|
|
token : Sort;
|
|
token/of : token -> N/P;
|
|
}
|
|
|
|
// A reachability problem is: can we get from initial marking to target?
|
|
theory (N : PetriNet instance) ReachabilityProblem {
|
|
initial_marking : N Marking instance;
|
|
target_marking : N Marking instance;
|
|
}
|
|
|
|
// A trace is a sequence of firings connected by wires
|
|
theory (N : PetriNet instance) Trace {
|
|
// Firings of transitions
|
|
F : Sort;
|
|
F/of : F -> N/T;
|
|
|
|
// Wires connect firing outputs to firing inputs
|
|
W : Sort;
|
|
W/src : W -> [firing : F, arc : N/out];
|
|
W/tgt : W -> [firing : F, arc : N/in];
|
|
|
|
// Terminals are unconnected arc endpoints (to/from the initial/target markings)
|
|
input_terminal : Sort;
|
|
output_terminal : Sort;
|
|
input_terminal/of : input_terminal -> N/P;
|
|
output_terminal/of : output_terminal -> N/P;
|
|
input_terminal/tgt : input_terminal -> [firing : F, arc : N/in];
|
|
output_terminal/src : output_terminal -> [firing : F, arc : N/out];
|
|
}
|
|
|
|
// Example Petri net: A <--ab/ba--> B, (A,B) --abc--> C
|
|
instance ExampleNet : PetriNet = {
|
|
A : P;
|
|
B : P;
|
|
C : P;
|
|
ab : T;
|
|
ba : T;
|
|
abc : T;
|
|
ab_in : in;
|
|
ab_in in/src = A;
|
|
ab_in in/tgt = ab;
|
|
ab_out : out;
|
|
ab_out out/src = ab;
|
|
ab_out out/tgt = B;
|
|
ba_in : in;
|
|
ba_in in/src = B;
|
|
ba_in in/tgt = ba;
|
|
ba_out : out;
|
|
ba_out out/src = ba;
|
|
ba_out out/tgt = A;
|
|
abc_in1 : in;
|
|
abc_in1 in/src = A;
|
|
abc_in1 in/tgt = abc;
|
|
abc_in2 : in;
|
|
abc_in2 in/src = B;
|
|
abc_in2 in/tgt = abc;
|
|
abc_out : out;
|
|
abc_out out/src = abc;
|
|
abc_out out/tgt = C;
|
|
}
|
|
|
|
// Reachability problem: Can we reach B from A?
|
|
instance problem0 : ExampleNet ReachabilityProblem = {
|
|
initial_marking = {
|
|
t : token;
|
|
t token/of = ExampleNet/A;
|
|
};
|
|
target_marking = {
|
|
t : token;
|
|
t token/of = ExampleNet/B;
|
|
};
|
|
}
|