I - INTRODUCTION
Cet outil est destiné aux calculs des patterns valides selon la notation MMSTD.
Il a été écrit rapidement en Python. Il est relativement primaire et peut aisément être étendu au besoin.
Pour l'utiliser vous n'aurez normalement pas besoin d'appréhender ce langage.
Cet outil utilise un algorithme d'exploration des descendances
pour trouver les patterns valides.
Son fonctionnement est simple: pour un noeud donné, il parcourt la descendance de ce noeud, fils par fils
jusqu'à tomber sur une condition d'arrêt.
Les conditions d'arrêt paramétrables sont :
- Le nombre de passages maximum par Etat : Vous pouvez fixer cette valeur à :
- 1: Le fait de fixer cette valeur à 1 n'empêche pas la découverte d'un pattern dont noeud terminal et noeud initial sont identiques mais impose simplement de ne passer qu'une seule fois par les autres états. Il permet ainsi de générer l'ensemble des patterns unitaires.
- 2 pour autoriser 2 passages par le même état.
- X (X>2) pour autoriser X passages par le même état et même X-2 passages par l'état initial/terminal au sein du pattern. Ainsi par exemple, pour trouver le pattern Du Gillson's Mess ( Ul -o-> Lr -+-> Ul -o-> Ur -o-> Rl -+-> Ur -o-> Ul), vous devrez le fixer à 3 si vous commencez de l'état UL ou à 2 simplement si vous commencez de l'état Lr.
- La longueur du pattern : Fixez cette valeur à -1 pour ne pas limiter l'exploration par la longueur du pattern. Dans ce cas là, si votre paramètre du nombre de passages maximum par état est trop important (>=3) vous risquez de ne pas avoir de condition d'arrêt suffisante; le problème devient infini ;-(.
II - Utiliser MMSTD_GEN
Il vous faut au minimum un interpréteur python ainsi que mmstd_gen.py bien sûr. Ensuite un prompt intéractif vous sera donné à la suite d'une simple commande du style:
Welcome to the MMSTD Notation Tool v1.5
>>>
A partir de cet instant vous pouvez commencer
à entrer des fonctions de l'interpréteur Python ou celles
décrites ci-après autour de la notation MMSTD.
Vous pouvez utiliser dès à présent le
mécanisme de complétion de Python pour afficher les
différentes commandes valides.
Ce mécanisme est activé par une simple pression sur la touche TAB.
III - Représentations du graphe MMSTD, des transitions
Il est bien que vous ayez une idée sur le type Python du diagramme MMSTD.
Si ainsi, vous considerez des transitions invalides, vous pourrez les supprimer ou même en ajouter de nouvelles.
Le diagramme sera représenté par un dictionnaire d'états.
Les clés seront les états et les valeurs la liste des transitions sans l'état de départ
(puisqu'on le connaît), partant de cet état.
'Rr' : [('Rl','+'),('Rl','o'),('Ul','+')],
'Ul' : [('Rr','o'),('Ur','o'),('Ur','+'),('Lr','o')],
'Ur' : [('Ul','+'),('Ul','o'),('Rl','o'),('Ll','o')],
'Ll' : [('Ur','+'),('Lr','o'),('Lr','+')],
'Lr' : [('Ul','+'),('Ll','o'),('Ll','+')]}
Une transition sera un tuple ( Etat source, Etat destination, Type d'échange ). un pattern sera représenté par une liste de transitions.
IV - Les différentes fonctions possibles
1 - Génération de tous les patterns à partir d'un Etat donné : gen_patterns_from_state()
## Nom : gen_pattern_from_state (state, cpt, path_len_max)
##
## But : Donne l'ensemble des patterns valides pour un état donné avec pour contraintes :
## - cpt : Nombre de passages maximum par état autorisé.
## - path_len_max : longueur maximum du pattern. -1 pour n'importe quelle longueur.
##
## Paramètres :
## - state : L'état dont on veut générer les patterns.
## - cpt : Nombre de passages maximum par état autorisé.
## - path_len_max : longueur maximum du pattern. -1 pour n'importe quelle longueur.
##
>>> gen_patterns_from_state('Rl',2,-1)
[[('Rl', 'Rr', '+'), ('Rr', 'Rl', '+')], [('Rl', 'Rr', '+'), ('Rr', 'Rl', '+'), ('Rl', 'Rr', '+'),
('Rr', 'Rl', '+')], [('Rl', 'Rr', '+'), ('Rr', 'Rl', '+'), ('Rl', 'Rr', '+'), ('Rr', 'Rl', 'o')],
[('Rl', 'Rr', '+'), ('Rr', 'Rl', '+'), ('Rl', 'Rr', '+'), ('Rr', 'Ul', '+'), ('Ul', 'Ur', 'o'),
('Ur', 'Ul', '+'), ('Ul', 'Ur', 'o'), ('Ur', 'Rl', 'o')], [('Rl', 'Rr', '+'), ('Rr', 'Rl', '+'),
('Rl', 'Rr', '+'), ('Rr', 'Ul', '+'), ('Ul', 'Ur', 'o'), ('Ur', 'Ul', '+'), ('Ul', 'Ur', '+'),
('Ur', 'Rl', 'o')], [('Rl', 'Rr', '+'), ('Rr', 'Rl', '+'), ('Rl', 'Rr', '+'), ('Rr', 'Ul', '+'),
('Ul', 'Ur', 'o'), ('Ur', 'Ul', '+'), ('Ul', 'Lr', 'o'), ('Lr', 'Ll', 'o'), ('Ll', 'Ur', '+'),
('Ur', 'Rl', 'o')], [('Rl', 'Rr', '+'), ('Rr', 'Rl', '+'), ('Rl', 'Rr', '+'), ('Rr', 'Ul', '+'),
('Ul', 'Ur', 'o'), ('Ur', 'Ul', '+'), ('Ul', 'Lr', 'o'), ('Lr', 'Ll', 'o'), ('Ll', 'Lr', 'o'),
('Lr', 'Ll', 'o'), ('Ll', 'Ur', '+'), ('Ur', 'Rl', 'o')], [('Rl', 'Rr', '+'), ('Rr', 'Rl', '+'),
('Rl', 'Rr', '+'), ('Rr', 'Ul', '+'), ('Ul', 'Ur', 'o'), ('Ur', 'Ul', '+'), ('Ul', 'Lr', 'o'),
('Lr', 'Ll', 'o'), ('Ll', 'Lr', 'o'), ('Lr', 'Ll', '+'), ('Ll', 'Ur', '+'), ('Ur', 'Rl', 'o')],
[('Rl', 'Rr', '+'), ('Rr', 'Rl', '+'), ('Rl', 'Rr', '+'), ('Rr', 'Ul', '+'), ('Ul', 'Ur', 'o'),
('Ur', 'Ul', '+'), ('Ul', 'Lr', 'o'), ('Lr','Ll', 'o'), ('Ll', 'Lr', '+'), ('Lr', 'Ll', 'o'),
('Ll', 'Ur', '+'), ('Ur', 'Rl', 'o')], [('Rl', 'Rr', '+'), ('Rr', 'Rl', '+'), ('Rl', 'Rr', '+'),
.....
Si vous voulez en récupérer un affichage formaté utilisez print_patterns_from_state
2 - Génération de tous les patterns possibles pour les états : gen_all_patterns_from_states()
##
## Nom : gen_all_patterns_from_states (cpt, path_len_max)
##
## But : Donne tous les patterns disponibles pour le diagramme MMSTD en partant
## des différents états avec pour contraintes :
## - cpt : Nombre de passages maximum par état autorisé.
## - path_len_max : longueur maximum du pattern. -1 pour n'importe quelle longueur.
##
## Paramètres :
## - cpt : Nombre de passages maximum par état autorisé.
## - path_len_max : longueur maximum du pattern. -1 pour n'importe quelle longueur.
##
## Retour : Une liste de pattern pour une ensemble d'états.
## L'ensemble d'états est un dictionnaire. Chaque clé est un état,
## chaque valeur est une liste de transitions valides selon le diagramme MMSTD.
## Une transition est un tuple (State src, State dst, exchange type) .
##
## sans passer plus de 2 fois par le même état, classifié par état
>>> gen_all_patterns_from_states (2,-1)
{'Rr': [[('Rr', 'Rl', '+'), ('Rl', 'Rr', '+')], [('Rr', 'Rl', '+'), ('Rl', 'Rr', '+'), ('Rr', 'Rl', '+'),
('Rl', 'Rr', '+')], [('Rr', 'Rl', '+'), ('Rl', 'Rr', '+'), ('Rr', 'Rl', '+'), ('Rl', 'Rr', 'o')],
[('Rr', 'Rl', '+'), ('Rl', 'Rr', '+'), ('Rr', 'Rl', '+'), ('Rl', 'Ur', '+'), ('Ur', 'Ul', '+'),
('Ul', 'Rr', 'o')], [('Rr', 'Rl', '+'), ('Rl', 'Rr', '+'), ('Rr', 'Rl', '+'), ('Rl', 'Ur', '+'),
('Ur', 'Ul', '+'), ('Ul', 'Ur', 'o'), ('Ur', 'Ul', '+'), ('Ul', 'Rr', 'o')], [('Rr', 'Rl', '+'),
('Rl', 'Rr', '+'), ('Rr', 'Rl', '+'), ('Rl', 'Ur', '+'), ('Ur', 'Ul', '+'), ('Ul', 'Ur', 'o'),
('Ur', 'Ul', 'o'), ('Ul', 'Rr', 'o')], [('Rr', 'Rl', '+'), ('Rl', 'Rr', '+'), ('Rr', 'Rl', '+'),
('Rl', 'Ur', '+'), ('Ur', 'Ul', '+'), ('Ul', 'Ur', 'o'), ('Ur', 'Ll', 'o'), ('Ll', 'Lr', 'o'),
('Lr', 'Ul', '+'), ('Ul', 'Rr', 'o')], [('Rr', 'Rl', '+'), ('Rl', 'Rr', '+'), ('Rr', 'Rl', '+'),
.....
## Génération de tous les patterns à partir de l'ensemble des états sans passer plus d'1 fois par le même état classifié par état
## Il s'agit en fait des patterns unitaires.
>>> gen_all_patterns_from_states (1,-1)
{'Rr': [[('Rr', 'Rl', '+'), ('Rl', 'Rr', '+')], [('Rr', 'Rl', '+'), ('Rl', 'Rr', 'o')], [('Rr', 'Rl', '+'),
('Rl', 'Ur', '+'), ('Ur', 'Ul', '+'), ('Ul', 'Rr', 'o')], [('Rr', 'Rl', '+'), ('Rl', 'Ur', '+'),
('Ur', 'Ul', 'o'), ('Ul', 'Rr', 'o')], [('Rr', 'Rl', '+'), ('Rl', 'Ur', '+'), ('Ur', 'Ll', 'o'),
('Ll', 'Lr', 'o'), ('Lr', 'Ul', '+'), ('Ul', 'Rr', 'o')], [('Rr', 'Rl', '+'), ('Rl', 'Ur', '+'),
('Ur', 'Ll', 'o'), ('Ll', 'Lr', '+'), ('Lr', 'Ul', '+'), ('Ul', 'Rr', 'o')], [('Rr', 'Rl', 'o'),
('Rl', 'Rr', '+')], [('Rr', 'Rl', 'o'),('Rl', 'Rr', 'o')], [('Rr', 'Rl', 'o'), ('Rl', 'Ur', '+'),
('Ur', 'Ul', '+'), ('Ul', 'Rr', 'o')], [('Rr', 'Rl', 'o'), ('Rl', 'Ur', '+'), ('Ur', 'Ul', 'o'),
('Ul', 'Rr', 'o')], [('Rr', 'Rl', 'o'), ('Rl', 'Ur', '+'), ('Ur', 'Ll', 'o'), ('Ll', 'Lr', 'o'),
('Lr', 'Ul', '+'), ('Ul', 'Rr', 'o')], [('Rr', 'Rl', 'o'), ('Rl', 'Ur', '+'), ('Ur', 'Ll', 'o'),
('Ll', 'Lr', '+'), ('Lr', 'Ul', '+'), ('Ul', 'Rr', 'o')],[('Rr', 'Ul', '+'), ('Ul', 'Rr', 'o')],
[('Rr', 'Ul', '+'), ('Ul', 'Ur', 'o'), ('Ur', 'Rl', 'o'), ('Rl', 'Rr', '+')], [('Rr', 'Ul', '+'),
Si vous voulez en récupérer un affichage formaté utilisez print_patterns_from_state_list
3 - Génération de tous les patterns possibles : gen_all_patterns()
Cette fonction est très proche de la précédente, avec la différence que cette fois-ci les redondances sont supprimées.
##
## Nom : gen_all_patterns (cpt, path_len_max)
##
## But : Donne tous les patterns disponibles pour le diagramme MMSTD avec pour contraintes :
## - cpt : Nombre de passages maximum par état autorisé.
## - path_len_max : longueur maximum du pattern. -1 pour n'importe quelle longueur.
## Contrairement à gen_all_pattern_from_states, ici les doublons et les patterns équivalents sont omis.
##
## Paramètres :
## - cpt : Nombre de passages maximum par état autorisé.
## - path_len_max : longueur maximum du pattern. -1 pour n'importe quelle longueur.
##
## Retour : Une liste de pattern pour une ensemble d'états.
## L'ensemble d'états est un dictionnaire. Chaque clé est un état,
## chaque valeur est une liste de transitions valides selon le diagramme MMSTD.
## Une transition est un tuple (State src, State dst, exchange type) .
##
## fois par le même état avec suppression des équivalences
>>> gen_all_patterns (2,-1)
[[('Rr', 'Rl', '+'), ('Rl', 'Rr', '+')], [('Rr', 'Rl', '+'), ('Rl', 'Rr', '+'), ('Rr', 'Rl', '+'),
('Rl', 'Rr', '+')], [('Rr', 'Rl', '+'), ('Rl', 'Rr', '+'), ('Rr', 'Rl', '+'), ('Rl', 'Rr', 'o')],
[('Rr', 'Rl', '+'), ('Rl', 'Rr', '+'),('Rr', 'Rl', '+'), ('Rl', 'Ur', '+'), ('Ur', 'Ul', '+'),
('Ul', 'Rr', 'o')], [('Rr', 'Rl', '+'), ('Rl', 'Rr', '+'), ('Rr', 'Rl', '+'), ('Rl', 'Ur', '+'),
('Ur', 'Ul', '+'), ('Ul', 'Ur', 'o'), ('Ur', 'Ul', '+'), ('Ul', 'Rr', 'o')], [('Rr', 'Rl', '+'),
('Rl', 'Rr', '+'), ('Rr', 'Rl', '+'), ('Rl', 'Ur', '+'), ('Ur', 'Ul', '+'), ('Ul', 'Ur', 'o'),
('Ur', 'Ul', 'o'), ('Ul', 'Rr', 'o')], [('Rr', 'Rl', '+'), ('Rl', 'Rr', '+'), ('Rr', 'Rl', '+'),
('Rl', 'Ur', '+'), ('Ur', 'Ul', '+'), ('Ul', 'Ur', 'o'), ('Ur', 'Ll', 'o'), ('Ll', 'Lr', 'o'),
.....
## Génération de tous les patterns à partir de l'ensemble des états sans passer plus d'1
## fois par le même état.
## Il s'agit en fait des patterns unitaires avec suppression des équivalences
>>> gen_all_patterns (1,-1)
[[('Rr', 'Rl', '+'), ('Rl', 'Rr', '+')], [('Rr', 'Rl', '+'), ('Rl', 'Rr', 'o')], [('Rr', 'Rl', '+'),
('Rl', 'Ur', '+'), ('Ur', 'Ul', '+'), ('Ul', 'Rr', 'o')], [('Rr', 'Rl', '+'), ('Rl', 'Ur', '+'),
('Ur', 'Ul', 'o'), ('Ul', 'Rr', 'o')], [('Rr', 'Rl', '+'), ('Rl', 'Ur', '+'), ('Ur', 'Ll', 'o'),
('Ll', 'Lr', 'o'), ('Lr', 'Ul', '+'), ('Ul', 'Rr', 'o')], [('Rr', 'Rl', '+'), ('Rl', 'Ur', '+'),
('Ur', 'Ll', 'o'), ('Ll', 'Lr', '+'), ('Lr', 'Ul', '+'), ('Ul', 'Rr', 'o')], [('Rr', 'Rl', 'o'),
('Rl', 'Rr', '+')], [('Rr', 'Rl', 'o'), ('Rl', 'Rr', 'o')], [('Rr', 'Rl', 'o'), ('Rl', 'Ur', '+'),
('Ur', 'Ul', '+'), ('Ul', 'Rr', 'o')], [('Rr', 'Rl', 'o'), ('Rl', 'Ur', '+'), ('Ur', 'Ul', 'o'),
('Ul', 'Rr', 'o')], [('Rr', 'Rl', 'o'), ('Rl', 'Ur', '+'), ('Ur', 'Ll', 'o'), ('Ll', 'Lr', 'o'),
('Lr', 'Ul', '+'), ('Ul', 'Rr', 'o')], [('Rr', 'Rl', 'o'), ('Rl', 'Ur', '+'), ('Ur', 'Ll', 'o'),
('Ll', 'Lr', '+'), ('Lr', 'Ul', '+'), ('Ul', 'Rr', 'o')], [('Rr', 'Ul', '+'), ('Ul', 'Rr', 'o')],
.....
Si vous voulez en récupérer un affichage formaté utilisez print_patterns_from_list
4 - Affichage d'un pattern : print_pattern()
##
## Nom : print_pattern (pattern):
##
## But : Affichage d'un pattern.
##
## Paramètres :
## - pattern : un pattern.
## Un pattern est une liste de transitions valides selon le diagramme MMSTD.
## Une transition est un tuple (State src, State dst, exchange type) .
##
## Retour : Non
##
>>> pattern_example = [('Rl', 'Rr', 'o'), ('Rr', 'Ul', '+'), ('Ul', 'Lr', 'o'),
('Lr', 'Ll', '+'), ('Ll', 'Ur', '+'), ('Ur', 'Rl', 'o')]
>>> print_pattern(pattern_example)
Rl -o-> Rr -+-> Ul -o-> Lr -+-> Ll -+-> Ur -o-> Rl [UOSUOS]
5 - Affichage des patterns d'une liste de patterns : print_patterns_from_list()
## Nom : print_patterns_from_list (patterns_list)
##
## But : Affiche les patterns d'une liste de patterns
##
## Paramètres :
## - patterns_list : Une liste de patterns.
## Chaque pattern est une liste de transitions valides selon le diagramme MMSTD.
## Une transition est un tuple (State src, State dst, exchange type).
##
## Retour : Non
##
## sans passer plus de 2 fois par le même état.
>>> print_patterns_from_list(gen_patterns_from_state('Rl',2,-1))
Transitions Of Length 2 :
Rl -+-> Rr -+-> Rl [UO] : Reversed Cross Arm Cascade (Right Above) [OU]
Rl -+-> Rr -o-> Rl [UO]
Rl -o-> Rr -+-> Rl [UO]
Rl -o-> Rr -o-> Rl [UO] : Cross Arm Cascade (Right Above) [OU]
Rl -+-> Ur -o-> Rl [US] : Windmill (Catch Under) [SU]
Transitions Of Length 4 :
Rl -+-> Rr -+-> Rl -+-> Rr -+-> Rl [UOUO]
Rl -+-> Rr -+-> Rl -+-> Rr -o-> Rl [UOUO]
Rl -+-> Rr -+-> Rl -o-> Rr -+-> Rl [UOUO]
Rl -+-> Rr -+-> Rl -o-> Rr -o-> Rl [UOUO]
Rl -+-> Rr -+-> Rl -+-> Ur -o-> Rl [UOUS]
Rl -+-> Rr -o-> Rl -+-> Rr -+-> Rl [UOUO]
Rl -+-> Rr -o-> Rl -+-> Rr -o-> Rl [UOUO]
Rl -+-> Rr -o-> Rl -o-> Rr -+-> Rl [UOUO]
Rl -+-> Rr -o-> Rl -o-> Rr -o-> Rl [UOUO]
Rl -+-> Rr -o-> Rl -+-> Ur -o-> Rl [UOUS]
.....
6 - Affichage d'une liste de patterns pour un ensemble d'états : print_patterns_from_state_list()
## Nom : print_patterns_from_state_list (state_list)
##
## But : Afficher une liste de patterns pour un ensemble d'états.
##
## Paramètres :
## - state_list : une liste de patterns pour un ensemble d'états.
## L'ensemble d'états est un dictionnaire. Chaque clé est un état,
## chaque valeur est une liste de transitions valides selon le diagramme MMSTD.
## Une transition est un tuple (State src, State dst, exchange type).
##
## Retour : Non
##
## des états sans passer plus de 2 fois par le même état.
>>> print_patterns_from_state_list(gen_all_patterns_from_states (2,-1))
## Affichage formaté du résultat de la Génération de tous les patterns à partir de l'ensemble
## des états sans passer plus de 1 fois par le même état.
## Il s'agit en fait de l'intégralité des patterns unitaires.
>>> print_patterns_from_state_list(gen_all_patterns_from_states (1,-1))
7 - Time Reversed Pattern d'un pattern donné : reverse_pattern()
##
## Nom : reverse_pattern (pattern)
##
## But : donne le Time Reversed pattern d'un pattern donné.
##
## Paramètre :
## - pattern : le pattern à inverser.
## Un pattern est une liste de transitions naturelles telles que définies par le diagramme MMSTD.
## Une transition est un tuple (State src, State dst, exchange type).
##
## Retour : le pattern Time Reversed.
##
>>> pattern_example = [('Rl', 'Rr', 'o'), ('Rr', 'Ul', '+'), ('Ul', 'Lr', 'o'), ('Lr', 'Ll', '+'), ('Ll', 'Ur', '+'), ('Ur', 'Rl', 'o')]
>>> reverse_pattern (pattern_example)
[['Rr', 'Ul', '+'], ['Ul', 'Lr', 'o'], ['Lr', 'Ll', 'o'], ['Ll', 'Ur', '+'], ['Ur', 'Rl', 'o'], ['Rl', 'Rr', '+']]
>>> print_pattern(reverse_pattern (pattern_example))
Rr -+-> Ul -o-> Lr -o-> Ll -+-> Ur -o-> Rl -+-> Rr [OSUOSU]
8 - Validité d'un pattern selon le diagramme MMSTD : is_pattern_valid()
##
## Nom : is_pattern_valid (pattern)
##
## But : Vérifie la validité d'un pattern selon le diagramme MMSTD.
##
## Paramètre :
## - pattern : le pattern à vérifier.
## Un pattern est une liste de transitions naturelles telles que définies par le diagramme MMSTD.
## Une transition est un tuple (State src, State dst, exchange type).
##
## Retour : un couple (bool, transitions list)
## bool vaudra True si le pattern est valide selon le diagramme MMSTD;
## False sinon. S'il vaut False, la transitions list donnera les transitions invalides utilisées.
##
>>> pattern_example = [('Rl', 'Rr', 'o'), ('Rr', 'Ul', '+'), ('Ul', 'Lr', 'o'), ('Lr', 'Ll', '+'), ('Ll', 'Ur', '+'), ('Ur', 'Rl', 'o')]
>>> pattern_invalid_example = [('Rl', 'Rr', 'o'), ('Rl', 'Lr', '+'), ('Ul', 'Lr', 'o'), ('Lr', 'Ll', '+'), ('Ll', 'Ur', '+'), ('Ur', 'Rl', 'o'),('Lr','Rl','o')]
>>> print(is_pattern_valid(pattern_example))
[True, []]
>>> print(is_pattern_valid(pattern_invalid_example))
[False, [('Rl', 'Lr', '+'), ('Lr', 'Rl', 'o')]]
9 - Vérification de l'équivalence de deux patterns au sens MMSTD : is_equivalent()
##
## Nom : is_equivalent (pattern1, pattern2)
##
## But : Vérifie l'équivalence de deux patterns selon le graph MMSTD.
##
## Paramètres :
## - pattern1, pattern2 : les deux patterns à comparer.
## Un pattern est une liste de transitions naturelles telles que définies par le diagramme MMSTD.
## Une transition est un tuple (State src, State dst, exchange type).
##
## Retour : un boolean
## True si les patterns sont équivalents selon le graph MMSTD;
## False sinon.
##
## Ll -+-> Ur -+-> Ul -o-> Lr -o-> Ll
## Ul -o-> Lr -o-> Ll -+-> Ur -+-> Ul
>>> pattern_example1 = [('Ll', 'Ur', '+'), ('Ur', 'Ul', '+'), ('Ul', 'Lr', 'o'),
('Lr', 'Ll', 'o')]
>>> pattern_example2 = [('Ul', 'Lr', 'o'), ('Lr', 'Ll', 'o'), ('Ll', 'Ur', '+'),
('Ur', 'Ul', '+')]
>>> is_equivalent(pattern_example1,pattern_example2)
True
10 - Affichage du nom d'un pattern : print_name()
##
## Nom : print_name (pattern)
##
## But : Affiche le nom d'un pattern donné
##
## Paramètre :
## - pattern : Le pattern dont on veut obtenir le nom
## Un pattern est une liste de transitions naturelles telles que définies par le diagramme MMSTD.
## Une transition est un tuple (State src, State dst, exchange type).
##
## Retour : Aucun
##
>>>print_name([('Ur','Rl','o'),('Rl','Rr','+'),('Rr','Ul','+'),('Ul','Lr','o'),('Lr','Ll','+'),('Ll','Ur','+')])
Mills Mess [SUOSUO]
>>>print_name([('Ur','Rl','o'),('Rl','Rr','+'),('Rr','Ul','+'), ('Ul','Rr','o'),('Rr','Ll','+'),('Ll','Ur','+')])
Unknown Pattern