module Game2PetriNet; create OUT: petrinet from IN: game; -- Obtenir la place correspondant au predecesseur d'une WorkSequence helper def: network(): petrinet!Network = 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.nom, tokens <- 0, network <- p.network()) } -- 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.nom, network <- t.network()), -- ARCS d'un Chemin arcIn: petrinet!Arc( place <- c.getPlaceOf('lieu_' + c.lieuIn.nom.nom), transition <- t, outgoing <- false, weight <- 1), arcOut: petrinet!Arc( place <- c.getPlaceOf('lieu_' + c.lieuOu.nom.nom), transition <- t, outgoing <- true, weight <- 1) }