import java.lang.*;

class Feux {

    public static void main(String[] args) {
	Petri feux = new Petri();

	PetriBuild(feux,7,6);

	int rouge_1          = PetriAddPool(feux,"1 rouge",       1);
	int rouge_2          = PetriAddPool(feux,"2 rouge",       1);
	int orange_1         = PetriAddPool(feux,"1 orange",      0);
	int orange_2         = PetriAddPool(feux,"2 orange",      0);
	int vert_1           = PetriAddPool(feux,"1 vert",        0);
	int vert_2           = PetriAddPool(feux,"2 vert",        0);
	int tout_rouge       = PetriAddPool(feux,"Tout est rouge",1);

	int passe_au_vert_1  = PetriAddTransition(feux,"1 passe au vert",   2,1);
	int passe_au_vert_2  = PetriAddTransition(feux,"2 passe au vert",   2,1);
	int passe_a_orange_1 = PetriAddTransition(feux,"1 passe a l'orange",1,1);
	int passe_a_orange_2 = PetriAddTransition(feux,"2 passe a l'orange",1,1);
	int passe_au_rouge_1 = PetriAddTransition(feux,"1 passe au rouge",  1,2);
	int passe_au_rouge_2 = PetriAddTransition(feux,"2 passe au rouge",  1,2);

	PetriSetInput (feux,passe_au_vert_1,rouge_1   , 1);
	PetriSetInput (feux,passe_au_vert_1,tout_rouge, 1);
	PetriSetOutput(feux,passe_au_vert_1,vert_1,     1);

	PetriSetInput (feux,passe_a_orange_1,vert_1,    1);
	PetriSetOutput(feux,passe_a_orange_1,orange_1,  1);

	PetriSetInput (feux,passe_au_rouge_1,orange_1,  1);
	PetriSetOutput(feux,passe_au_rouge_1,rouge_1,   1);
	PetriSetOutput(feux,passe_au_rouge_1,tout_rouge,1);

	PetriSetInput (feux,passe_au_vert_2,rouge_2   , 1);
	PetriSetInput (feux,passe_au_vert_2,tout_rouge, 1);
	PetriSetOutput(feux,passe_au_vert_2,vert_2,     1);

	PetriSetInput (feux,passe_a_orange_2,vert_2,    1);
	PetriSetOutput(feux,passe_a_orange_2,orange_2,  1);

	PetriSetInput (feux,passe_au_rouge_2,orange_2,  1);
	PetriSetOutput(feux,passe_au_rouge_2,rouge_2,   1);
	PetriSetOutput(feux,passe_au_rouge_2,tout_rouge,1);

	for(int steps = 0; steps < 100 && PetriStep(feux); ++steps);
    }
    
    public static void PetriBuild(Petri that,
				  int nb_pools,
				  int nb_transitions) {
	// Initialisez that correctement.
    }

    public static void PoolBuild(Pool that,
				 String name,
				 int nb_tokens) {
	// Initialisez that correctement.
    }

    public static int PetriAddPool(Petri that,
				   String pool_name,
				   int nb_tokens) {
	// renvoie le numero de case où le pool est stocké.
    }

    public static void TransitionBuild(Transition that,
				       String name,
				       int nb_inputs,
				       int nb_outputs) {
	// Initialisez that correctement.
    }

    public static int PetriAddTransition(Petri that,
					 String transition_name,
					 int nb_inputs,
					 int nb_outputs) {
	// renvoie le numero de case où la transition est stockée.
    }

    public static void TransitionSetInput(Transition that,
					  Pool input,
					  int nb_tokens) {
	// Connecte le pool input comme une entrée (consommant
	// nb_tokens tokens) à that.
    }

    public static void TransitionSetOutput(Transition that,
					   Pool output,
					   int nb_tokens) {
	// Connecte le pool output comme une sortie (produisant
	// nb_tokens tokens) à that.
    }

    public static boolean TransitionActivability(Transition that) {
	// Potitionne le champ booléen "activable" de that
	// correctement, suivant les jetons contenus dans les pools
	// d'entrée. La valeur finale de ce booléen est celle qui est
	// renvoyée par la fonction.
    }

    public static void TransitionActivate(Transition that) {
	// Modifie le nombre de jetons des pools concernés par la
	// transition that consécutivement à l'activation de
	// that. Cette fonction, au passage, affiche à l'écran le nom
	// de la transition that.
    }
    
    public static void PetriSetInput(Petri that,
				     int transition_idf,
				     int pool_idf,
				     int nb_tokens) {
	// Connecte un pool du réseau that comme entrée à une
	// transition. Le pool et la transition sont référencés par
	// le numéro de la case où ils sont stockés.
    }
    
    public static void PetriSetOutput(Petri that,
				      int transition_idf,
				      int pool_idf,
				      int nb_tokens) {
	// Connecte un pool du réseau that comme sortie d'une
	// transition. Le pool et la transition sont référencés par
	// le numéro de la case où ils sont stockés.
    }

    public static boolean PetriStep(Petri that) {

	// Cette fonction effectue un pas de simulation. Si aucune
	// transition n'est activable, le message "Dead lock" est
	// affiché à l'écran, et la valeur false est renvoyée.
    }

}