Lngges Automtes Non-déterminisme Grmmires Attiuées et Génértives Expressions régulières Correction Prtielle de Progrmmes Ceci n'est ps un cours de Lngge C++ 2.1 Comment implnter en C un reconnisseur de mots? Pr groupe de 4, envoyez pr emil votre progrmme à michel.perin@img.fr et eric.gscrd@img.fr. Votre progrmme doit être conforme à l spéciction. Ensuite, pour voir une chnce de ggner : il doit être lisile, le plus clir et le plus simple possile, être fcile à mintenir et à fire évoluer, être ecce et enn être élégnt. ) Donnez un progrmme C qui ccepte un mot écrit sur l'lphet {,, entré u clvier, s'il pprtient u lngge L 1 des mots formés d'une succession d'un nomre pirs de entrecoupées d'un nomre quelconque de. Pr exemple, les mots {ɛ,,,,,,,,,, doivent être reconnu mis ps les mots {,,,,,,. ) Donnez une progrmme C qui ccepte un mot s'il pprtient u lngge L 1.{() n n N 2.1.1 Une première implnttion en C d'un reconnisseur de mots Solution du ) L'utomte qui reconnît L 1 est codé sous l forme d'un tleu Aut q 0 q 1 ccept true f lse '' q 1 q 0 '' q 0 où l'étt initil est l'étt et les étts ccepteurs sont indiqués pr true sur l ligne du symole réservé ccept. Ainsi q i est ccepteur si et seulement si Aut[q i ][ccept] = true. L'implnttion en C est présenté en Figure 1. Solution du ) Soit on construit sur ppier l'utomte déterministe qui reconnît le lngge L et on le code sous forme d'un tleu Aut. Soit on code l'utomte qui reconnît L 1 sous l forme d'un tleu Aut1. On code l'utomte qui reconnît {() n n N sous l forme d'un tleu Aut2. Aut2 q 0 q 1 ccept true f lse '' q 1 '' q 0 Ensuite on construit Aut à l'ide des opértions d'une iliothèque sur les utomtes. 1
#include <stdio.h> #define ENTER 10 // L touche ENTER porte le numéro 10 #define ACCEPT ''-1 // pour que ACCEPT corresponde à l ligne 0 du tleu Aut #define NE 6 // nomre d'étts #define NS 3 // nomre de symoles de l'lphet + le symole réservé ACCEPT // codge des utomtes int Aut1[NS][NE] = { // utomte de l question ) {1, 0, // codge des étts ccepteurs {1, 0, // trnsitions sur '' {0,-1 // trnsitions sur '': l'sence de trnsition est indiqué pr -1 ; int Aut[NS][NE] = { // utomte de l question ) { 1, 0, 1, 0, 1, 0, // codge des étts ccepteurs { 1, 2, 3, 2, 5, -1, // trnsitions sur '' { 2,-1, 4, 4,-1, 4 // trnsitions sur '' ; // Fonctionnement d'un utomte (1 ligne!) int trnsition(int ec, chr c, int Aut[NS][NE]){ return Aut[ 1+ c-'' ][ec]; // Exemple d'utilistion : reconnissnce d'un mot entré u clvier int min(){ chr c; int q; q = 0; c = getchr(); while(c!=enter && q>=0){ q = trnsition(q,c,aut); c = getchr(); if ( c==enter && trnsition(q,accept,aut)==1 ) printf(":ccept\n"); else printf(":reject\n"); return 0 ; Fig. 1 Implnttion en C d'un ef pr un tle de trnsitions 2
conctention(aut1,aut2,aut) ; Aut = q 0 q 1 ɛ q 0 q 1 elimintion-epsilon(aut) ; Aut = q 0 q 0 q 1 deterministion(aut) ; Aut = minimistion(aut) ; q 0 Détils de l déterministion q 1 q 1 q 2 q 3 q 4 q 5 on otient le même utomte, il étit miniml {q 0 {q 1 {q 0, q 0 {q 1, q 1 {q 0 {q 1 Aut q 0 q 1 q 2 q 3 q 4 q 5 ccept true f lse true f lse true f lse '' {q 1 = q 1 {q 0, q 0 = q 2 {q 1, q 1 = q 3 {q 0, q 0 = q 2 {q 1 = q 5 '' {q 0, q 0 = q 2 {q 0 = q 4 {q 0 = q 4 {q 0 = q 4 On otient l'utomte déterministe miniml Aut réprésenté pr le tleu : Aut q 0 q 1 q 2 q 3 q 4 q 5 ccept true f lse true f lse true f lse '' q 1 q 2 q 3 q 2 q 5 '' q 2 q 4 q 4 q 4 On réutilise l'implnttion de l Figure 1 vec le tleu Aut insi otenu. 2.2 Autre implnttion en C d'un reconnisseur de mots On présente une utre solution qui représente l'ensemles des étts cournts d'un utomte nondéterministe pr un vecteur de ooléens. L Figure 2 présente l'implnttion en C de l'exercices (). Principe : Considérons un utomte non-déterministe à qutre étts {q 1,..., q 4 et supposons qu'il it tteint l'ensemle d'étts {q 1, q 3, on représente cette sitution pr le vecteur de ooléens : o 1, o 2, o 3, o 4 = {{ 1, {{ 0, {{ 1, {{ 0 qui indique les étts occupés : en q 1? en q 2? en q 3? en q 4? o i = vri si et seulement si l'utomte est dns l'étt q i. Plusieurs ooléens peuvent être à vri simultnément puisqu'un utomte non déterministe peut être dns plusieurs étts à l fois. À chque trnsition de l'utomte on met à jour le vecteur de ooléens. Soit crlu l vrile qui correspond à l lettre cournte. On psse dns l'étt q j (utrement dit o j psse à vri) si crlu correspond à une trnsition qui mène en q j et si on étit 3
L'implnttion utilise deux vecteurs de ooléens : o 0,..., o N qui représente les étts occupés vnt l trnsition o 0,..., o N qui représente les étts cournts, c'est-à-dire ceux occupés près l trnsition Pour représenter ces vecteurs on utilise un tleu O de tille 2 N et un ooléen c qui indique sur quelle ligne est le vecteur cournt (l'utre ligne correspond u vecteur vnt l trnsition). L'utilistion du ooléen c évite l recopie des N ooléens o i dns les o i vnt l mise à jour ; en eet, il sut de fire c :=!c pour échnger les vleurs nciennes vec les vleurs courntes. 0 1... n O[!c] o 0 o 1... o n O[c] o 0 o 1... o n #include <stdio.h> #define ENTER 10 #define N 4 int non_loque(int O[2][N], int c){ // l'utomte est non loque si l'un des etts de l'utomte est occupé. int i, s=0; for(i=0 ; i<n ; i++){ s = s O[c][i] ; return s; int min(){ int O[2][N] = {0 ; int c=0; chr crlu; O[c][0]=1; // Au deprt l'utomte occupe l'ett initil q0 O[c][2] = O[c][2] O[c][0]; // tritement des epsilon-trnsitions crlu=getchr(); while( crlu!=enter && non_loque(b,c) ){ c=!c; // les vleurs courntes deviennent les nciennes vleurs // specifiction de l'utomte sous forme d'equtions ooleennes O[c][0] = (O[!c][0] && crlu=='') (O[!c][1] && crlu=='') ; O[c][1] = (O[!c][0] && crlu=='') ; O[c][2] = (O[!c][3] && crlu=='') ; O[c][3] = (O[!c][2] && crlu=='') ; O[c][2] = O[c][2] O[c][0]; // tritement des epsilon-trnsitions crlu = getchr(); // lecture d'une lettre if (crlu==enter && O[c][2] ) // O[c][2] est l'étt ccepteur { printf(":ccept\n") ; else { printf(":reject\n") ; return 0; Fig. 2 Implnttion en C d'un 4ef pr des équtions ooléennes
précédemment dns l'étt source de l trnsition. Pr exemple, considérons l'utomte de l question () et toutes les trnsitions qui mènent dns l'étt q 0 : q 0 q 0 et q 1 q 0. L lettre cournte crlu fit psser dns l'étt q 0 (utrement dit o 0 psse à vri) si on emprunte l'une de ces 2 trnsitions. Les ooléens o 0 et o 1 désignent les vleurs des ooléens vnt l trnsition. o 0 := ( o ) ( 0 crlu = o ) 1 crlu = {{ {{ on étit en q 0 on étit en q 1 ɛ Une ɛ-trnsition telle que q 0 q 2 permet d'ller en q 2 dès qu'on est en q 0 sns lire de lettre. Pour en rendre compte, il fut jouter l'éqution o 2 := o 2 o 0. Autrement dit, on conserve le résultt du clcul précédent uquel on joute l nouvelle possiilité due à l'ɛ-trnsition. On indique que l'exécution de l'utomte commence dns son étt initil q i en ssignnt u ooléen o i l vluer vri. L'utomte est loqué si tous les ooléens o i vlent fux. Le mot est ccepté si lorsqu'on consommé toutes ses lettres, on se trouve sur un étt ccepteur (c'est-à-dire que l'un des ooléens du vecteur qui correspond à un étt ccepteur vut vri). Avntge / inconvénient de cette implnttion Cette implnttion permet d'exécuter un utomte non-déterministe sns qu'on it esoin de le déterminiser, ni d'éliminer les ɛ-trnsitions. Les ensemles d'étts sont codés pr le vecteur de ooléens o 1,..., o n où le ooléen o i indique si l'utomte est dns l'étt q i. n (ou 2n) ooléens susent pour coder l'étt d'un utomte non-déterministe tndis qu'vec l'implnttion précédente il fut déterminiser l'utomte et l'on sit que cette opértion peut conduire à un utomte à 2 n étts. n 5 10 15 20 25 30 35... 2 n 32 1024 32768 1048576 33554432 1073741824 34359738368... À chque trnsition de l'utomte on lit une lettre et on met à jour le vecteur de ooléens, ce qui nécessite n (ou 2n) ecttion, tndis que l précédente implnttion nécessitit seulement une ecttion. 2.2.1 Conclusion : quelle implnttion choisir? Considérons un utomte non-déterministe à N étts. Si s version déterministe comporte un petit nomre d'étts (de l'ordre de N), on préfer l première implnttion pour son eccité (1 ecttion pr trnsition) mlgré s représenttion (consomtrice de mémoire). Si l version déterministe comporte un nomre d'étts très supérieure à N et que l mémoire disponile est limitée, on préfer l seconde implnttion pour s représenttion compcte (N ooléens) mlgré son mnque d'eccité (N ecttions pr trnsition). 5