Existe um algoritmo / procedimento sistemático para testar se um idioma é regular?
Em outras palavras, dado um idioma especificado em forma algébrica (pense em algo como ), teste se o idioma é regular ou não. Imagine que estamos escrevendo um serviço da Web para ajudar os alunos com todos os seus trabalhos de casa; o usuário especifica o idioma e o serviço da web responde com "regular", "não regular" ou "não sei". (Gostaríamos que o serviço da Web respondesse "não sei" com a menor frequência possível.) Existe alguma boa abordagem para automatizar isso? Isso é tratável? É decidível (ou seja, é possível garantir que nunca precisamos responder "eu não sei")? Existem algoritmos razoavelmente eficientes para resolver esse problema e poder fornecer uma resposta diferente de "não sei"
O método clássico para provar que um idioma não é regular é o lema de bombeamento. No entanto, parece que requer uma percepção manual em algum momento (por exemplo, para escolher a palavra a ser bombeada), então não estou claro se isso pode ser transformado em algo algorítmico.
Um método clássico para provar que uma linguagem é regular seria usar o teorema de Myhill-Nerode para derivar um autômato de estado finito. Isso parece uma abordagem promissora, mas requer a capacidade de executar operações básicas em idiomas na forma algébrica. Não está claro para mim se existe uma maneira sistemática de executar simbolicamente todas as operações que possam ser necessárias, em idiomas de forma algébrica.
Para tornar essa questão bem formulada, precisamos decidir como o usuário especificará o idioma. Estou aberto a sugestões, mas estou pensando em algo assim:
onde é uma expressão de palavra e é um sistema de desigualdades lineares sobre as variáveis de comprimento, com as seguintes definições:S
Cada um de é uma expressão de palavra. (Eles representam variáveis que podem assumir qualquer palavra em .)Σ ∗
Cada um de é uma expressão de palavra. (Aqui x r representa o reverso da cadeia x .)
Cada de a , b , c , … é uma expressão de palavra. (Implicitamente, Σ = { a , b , c , … } , então a , b , c , … representam um único símbolo no alfabeto subjacente.)
Cada de a η , b η , c η , … é uma expressão de palavra, se η é uma variável de comprimento.
A concatenação de expressões de palavras é uma expressão de palavras.
Cada um de é uma variável de comprimento. (Eles representam variáveis que podem assumir qualquer número natural.)
Cada um de É uma variável de comprimento. (Eles representam o comprimento de uma palavra correspondente.)
Isso parece amplo o suficiente para lidar com muitos dos casos que vemos nos exercícios de livros didáticos. Obviamente, você pode substituir qualquer outro método textual de especificar um idioma na forma algébrica, se tiver uma sugestão melhor.