2021-12-04 08:47:10 +00:00
|
|
|
module Game2PetriNet;
|
|
|
|
create OUT: petrinet from IN: game;
|
|
|
|
|
|
|
|
|
|
|
|
-- Obtenir la place correspondant au predecesseur d'une WorkSequence
|
2021-12-04 11:27:00 +00:00
|
|
|
helper def: getNetwork() : petrinet!Network =
|
2021-12-04 08:47:10 +00:00
|
|
|
petrinet!Network.allInstances()
|
|
|
|
->select(n | n.name = 'jeu')
|
|
|
|
->asSequence()->first();
|
|
|
|
|
|
|
|
-- Obtenir la transition correspondant au successeur d'une WorkSequence
|
|
|
|
helper context game!Chemin
|
|
|
|
def: getPlaceOf(s : String): petrinet!Place =
|
|
|
|
petrinet!Place.allInstances()
|
|
|
|
->select(p | p.name = s)
|
|
|
|
->asSequence()->first();
|
|
|
|
|
|
|
|
-- Traduire un Jeu en un PetriNet de même nom
|
|
|
|
rule Game2PetriNet {
|
|
|
|
from p: game!Jeu
|
|
|
|
to pn: petrinet!Network (name <- 'jeu')
|
|
|
|
}
|
|
|
|
|
|
|
|
-- Traduire un Lieu en un motif sur le réseau de Petri
|
|
|
|
rule Lieu2PetriNet {
|
|
|
|
from l: game!Lieu
|
|
|
|
to
|
|
|
|
-- PLACES d'un Lieu
|
|
|
|
p: petrinet!Place(
|
|
|
|
name <- 'lieu_' + l.nom,
|
|
|
|
tokens <- 0,
|
2021-12-04 11:27:00 +00:00
|
|
|
network <- p.getNetwork('jeu'))
|
2021-12-04 08:47:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
-- Traduire une WorkDefinition en un motif sur le réseau de Petri
|
|
|
|
rule Chemin2PetriNet {
|
|
|
|
from c: game!Chemin
|
|
|
|
to
|
|
|
|
-- TRANSITIONS d'un Chemin
|
|
|
|
t: petrinet!Transition(
|
|
|
|
name <- 'chemin_' + c.nom,
|
2021-12-04 11:27:00 +00:00
|
|
|
network <- t.getNetwork()),
|
2021-12-04 08:47:10 +00:00
|
|
|
-- ARCS d'un Chemin
|
|
|
|
arcIn: petrinet!Arc(
|
|
|
|
place <- c.getPlaceOf('lieu_' + c.lieuIn.nom),
|
|
|
|
transition <- t,
|
|
|
|
outgoing <- false,
|
|
|
|
weight <- 1),
|
|
|
|
arcOut: petrinet!Arc(
|
|
|
|
place <- c.getPlaceOf('lieu_' + c.lieuOu.nom),
|
|
|
|
transition <- t,
|
|
|
|
outgoing <- true,
|
|
|
|
weight <- 1)
|
|
|
|
}
|