Automate * creer_automate_des_facteurs( const Automate* automate ){ Automate * facteur = copier_automate(automate); Ensemble * finaux = facteur->finaux; Ensemble_iterateur it1, it2; int etat_actuel, est_ok; est_ok = 0; for (it1 = premier_iterateur_ensemble(get_etats(facteur)); ! iterateur_ensemble_est_vide(it1); it1 = iterateur_suivant_ensemble(it1)){ etat_actuel = get_element(it1); for (it2 = premier_iterateur_ensemble(finaux); !iterateur_ensemble_est_vide(it2) && !est_ok; it2 = iterateur_suivant_ensemble(it2)){ if (est_dans_l_ensemble(etats_accessibles(facteur, etat_actuel), get_element(it2))) { est_ok = 1; ajouter_etat_initial(facteur, etat_actuel); ajouter_etat_final(facteur, etat_actuel); } } est_ok = 0; } return facteur; }
Automate *automate_accessible( const Automate * automate){ Automate* clone = copier_automate(automate); Ensemble* etats = creer_ensemble(NULL, NULL, NULL); Ensemble_iterateur it_etat; Ensemble_iterateur it_lettre; // On calcule l'ensemble des états accessibles for(it_etat = premier_iterateur_ensemble(get_initiaux(automate)); ! iterateur_ensemble_est_vide( it_etat ); it_etat = iterateur_suivant_ensemble( it_etat )){ ajouter_elements(etats, etats_accessibles(automate, get_element(it_etat))); ajouter_element(etats, get_element(it_etat)); } // On détermine les états qui ne sont pas accessibles => ceux qui sont dans get_etats mais pas dans etats Ensemble* non_accessible = creer_difference_ensemble(get_etats(automate), etats); // On parcourt l'ensemble obtenu for(it_etat = premier_iterateur_ensemble(non_accessible); ! iterateur_ensemble_est_vide( it_etat ); it_etat = iterateur_suivant_ensemble( it_etat )){ const intptr_t etat_courant = get_element(it_etat); // On cherche toutes les transitions partant d'un état for(it_lettre = premier_iterateur_ensemble(get_alphabet(automate)); ! iterateur_ensemble_est_vide( it_lettre ); it_lettre = iterateur_suivant_ensemble( it_lettre )){ Cle cle; initialiser_cle( &cle, etat_courant, get_element(it_lettre)); Table_iterateur it = trouver_table( clone->transitions, (intptr_t) &cle ); // Si on trouve une transition partant d'un état non accessible if( !iterateur_est_vide( it ) ){ delete_table( clone->transitions, (intptr_t) &cle); // on la supprime } } // si c'est un état final, on pense à le supprimer if (est_un_etat_final_de_l_automate(automate, etat_courant)) { retirer_element(clone->finaux, etat_courant); } // si c'est un état initial, on pense à le supprimer if (est_un_etat_initial_de_l_automate(automate, etat_courant)) { retirer_element(clone->initiaux, etat_courant); } } // On supprime tous les états non accessibles de l'automate deplacer_ensemble(clone->etats, etats); return clone; }
// aa est un sous-mot de abac // Donc si abac est reconnu par automate on doit pouvoir reconnaitre a, b, c, ab, aa, ac, ba, bc, aba, abc, aac, bac, abac // Autrement dit, on doit pouvoir aller depuis un état à n'importe quel autre état en _avant_, tout en pouvant commencer partout. // C'est donc l'automate des facteurs avec des epsilons transition en plus. Automate * creer_automate_des_sous_mots( const Automate* automate ){ Automate * sous_mots = copier_automate(automate); Ensemble * finaux = sous_mots->finaux; Ensemble_iterateur it1, it2; int etat_actuel, etat_cible; for (it1 = premier_iterateur_ensemble(get_etats(sous_mots)); ! iterateur_ensemble_est_vide(it1); it1 = iterateur_suivant_ensemble(it1)){ etat_actuel = get_element(it1); for (it2 = premier_iterateur_ensemble(etats_accessibles(sous_mots, etat_actuel)); !iterateur_ensemble_est_vide(it2); it2 = iterateur_suivant_ensemble(it2)){ etat_cible = get_element(it2); ajouter_epsilon_transition(sous_mots, etat_actuel, etat_cible); if (est_dans_l_ensemble(finaux, etat_cible)) { ajouter_etat_initial(sous_mots, etat_actuel); ajouter_etat_final(sous_mots, etat_actuel); } } } return sous_mots; }
int test_execute_fonctions(){ BEGIN_TEST int res = 1; Automate * automate2; Automate * automate; Automate * result = NULL; Ensemble * ens = NULL; Ensemble * ens1 = NULL; automate = creer_automate(); result = NULL; ajouter_lettre( automate, 'a' ); if( result ) liberer_automate( result ); liberer_automate( automate ); automate = creer_automate(); result = NULL; ajouter_etat_final( automate, 1 ); if( result ) liberer_automate( result ); liberer_automate( automate ); automate = creer_automate(); result = NULL; ajouter_etat_initial( automate, 1 ); if( result ) liberer_automate( result ); liberer_automate( automate ); automate = creer_automate(); get_initiaux( automate ); liberer_automate( automate ); automate = creer_automate(); get_finaux( automate ); liberer_automate( automate ); automate = creer_automate(); get_alphabet( automate ); liberer_automate( automate ); automate = creer_automate(); result = NULL; est_un_etat_initial_de_l_automate( automate, 1 ); if( result ) liberer_automate( result ); liberer_automate( automate ); automate = creer_automate(); result = NULL; est_un_etat_final_de_l_automate( automate, 1 ); if( result ) liberer_automate( result ); liberer_automate( automate ); automate = creer_automate(); result = NULL; est_une_lettre_de_l_automate( automate, 'a' ); if( result ) liberer_automate( result ); liberer_automate( automate ); automate = creer_automate(); ens = NULL; ens1 = creer_ensemble( NULL, NULL, NULL ); ens = delta_star( automate, ens1, "aba" ); if( ens ) liberer_ensemble( ens ); liberer_ensemble( ens1 ); liberer_automate( automate ); automate = creer_automate(); result = NULL; le_mot_est_reconnu( automate, "abaa" ); if( result ) liberer_automate( result ); liberer_automate( automate ); automate = creer_automate(); result = NULL; result = mot_to_automate( "abbaa" ); if( result ) liberer_automate( result ); liberer_automate( automate ); automate = creer_automate(); ens = NULL; ens = etats_accessibles( automate, 0 ); if( ens ) liberer_ensemble( ens ); liberer_automate( automate ); automate = creer_automate(); result = NULL; result = automate_accessible( automate ); if( result ) liberer_automate( result ); liberer_automate( automate ); automate = creer_automate(); result = NULL; result = miroir( automate ); if( result ) liberer_automate( result ); liberer_automate( automate ); automate = creer_automate(); result = NULL; result = automate_co_accessible(automate ); if( result ) liberer_automate( result ); liberer_automate( automate ); automate = creer_automate(); result = NULL; result = creer_automate_des_prefixes( automate ); if( result ) liberer_automate( result ); liberer_automate( automate ); automate = creer_automate(); result = NULL; result = creer_automate_des_suffixes( automate ); if( result ) liberer_automate( result ); liberer_automate( automate ); automate = creer_automate(); result = NULL; result = creer_automate_des_facteurs( automate ); if( result ) liberer_automate( result ); liberer_automate( automate ); automate = creer_automate(); result = NULL; ens = creer_ensemble( NULL, NULL, NULL ); result = creer_automate_des_sur_mot( automate, ens ); if( result ) liberer_automate( result ); liberer_automate( automate ); liberer_ensemble( ens ); automate = creer_automate(); automate2 = creer_automate(); result = NULL; result = creer_automate_de_concatenation( automate, automate2 ); if( result ) liberer_automate( result ); liberer_automate( automate ); liberer_automate( automate2 ); automate = creer_automate(); result = NULL; result = creer_automate_des_sous_mots( automate ); if( result ) liberer_automate( result ); liberer_automate( automate ); return res; }