Existe-t-il un algorithme / une procédure systématique pour tester si une langue est régulière?
En d'autres termes, étant donné un langage spécifié sous forme algébrique (pensez à quelque chose comme ), testez si la langue est régulière ou non. Imaginez que nous écrivons un service Web pour aider les élèves dans tous leurs devoirs; l'utilisateur spécifie la langue et le service Web répond par "régulier", "non régulier" ou "je ne sais pas". (Nous aimerions que le service Web réponde «Je ne sais pas» aussi rarement que possible.) Existe-t-il une bonne approche pour automatiser cela? Est-ce traitable? Est-ce décidable (c.-à-d. Est-il possible de garantir que nous n'aurons jamais besoin de répondre «je ne sais pas»)? Existe-t-il des algorithmes raisonnablement efficaces pour résoudre ce problème et être en mesure de fournir une réponse autre que "ne sais pas" pour de nombreuses / la plupart des langues susceptibles de survenir dans la pratique?
La méthode classique pour prouver qu'une langue n'est pas régulière est le lemme de pompage. Cependant, il semble que cela nécessite un aperçu manuel à un moment donné (par exemple, pour choisir le mot à pomper), donc je ne sais pas si cela peut être transformé en quelque chose d'algorithmique.
Une méthode classique pour prouver qu'un langage est régulier serait d'utiliser le théorème de Myhill – Nerode pour dériver un automate à états finis. Cela ressemble à une approche prometteuse, mais cela nécessite la capacité d'effectuer des opérations de base sur les langues sous forme algébrique. Il n'est pas clair pour moi s'il existe un moyen systématique d'effectuer symboliquement toutes les opérations qui peuvent être nécessaires, sur des langues sous forme algébrique.
Pour que cette question soit bien posée, nous devons décider comment l'utilisateur spécifiera la langue. Je suis ouvert aux suggestions, mais je pense à quelque chose comme ceci:
où est une expression-mot et S est un système d'inégalités linéaires sur les variables de longueur, avec les définitions suivantes:
Chacun de est une expression verbale. (Ceux-ci représentent des variables qui peuvent prendre n'importe quel mot en Σ ∗ .)
Chacun de est une expression verbale. (Ici, x r représente l'inverse de la chaîne x .)
Chacun de est une expression verbale. (Implicitement, Σ = { a , b , c , … } , donc a , b , c , … représentent un seul symbole dans l'alphabet sous-jacent.)
Chacun de est une expression de mot, si η est une variable de longueur.
La concaténation des expressions-mots est une expression-mot.
Chacun de est une variable de longueur. (Ceux-ci représentent des variables qui peuvent prendre n'importe quel nombre naturel.)
Chacun Est une variable de longueur. (Ceux-ci représentent la longueur d'un mot correspondant.)
Cela semble assez large pour gérer la plupart des cas que nous voyons dans les exercices de manuels. Bien sûr, vous pouvez remplacer toute autre méthode textuelle de spécification d'une langue sous forme algébrique, si vous avez une meilleure suggestion.