Dado um DFA, A, deixe L (A) denotar o número de palavras que A aceita. Eu acho que é fácil calcular L (A): traduza a codificação de A em uma expressão regular. Se a estrela Kleene aparecer em qualquer lugar da expressão - o idioma é infinito. Senão: percorra e conte todas as combinações de palavras possíveis de usar com a expressão (basicamente, se houver um operador + na expressão, multiplique a quantidade de palavras legais pela quantidade de strings conectadas pelo + ..)
Isso está errado? desde já, obrigado
regular-languages
automata
regular-expressions
user67573
fonte
fonte
Respostas:
Sim, isso está errado, por causa da ambiguidade.
Considere o seguinte idioma:(a+aa)+a(a+ϵ) .
Com seu método, vemos 4 palavras,a,aa,aa,a . Mas temos duplicatas! Existem várias maneiras de criar a mesma palavra na expressão regular especificada.
Um método melhor é usar a programação dinâmica em um DFA mínimo para o seu idioma, sem estados "inativos". Se o DFA mínimo é cíclico, o idioma é infinito; portanto, podemos assumir que não há ciclos. Usar um DFA é fundamental, porque o determinismo significa que há exatamente um caminho no DFA para cada palavra.
O que você faz é criar uma recorrência para o número de palavras que terminam em um determinado estado:
O número total de palavras é então a soma do número de palavras que terminam em cada estado final.
fonte
Complementando a resposta do jmite, não é muito difícil calcular o número de palavras em uma linguagem regular, usando o método "matriz de transferência". É o mesmo que a programação dinâmica do jmite, mas a técnica tem outras aplicações, como enumeração assintótica.
Dado um DFA, construa umQ × Q matriz M (Onde Q é o conjunto de estados) em que M( i , j ) é o número de letras que fazem com que o DFA mude do estado j declarar Eu . Deixei1q0 0 e 1F ser os indicadores para o estado inicial e para os estados aceitantes, respectivamente. Finalmente, vamosn = | Q | .
O número de palavras de comprimentom é cm: =1FMm1q0 0 . Calcularcm para 0 ≤ m < 2 n . E secn+ ⋯ +c2 n - 1> 0 então o idioma aceito pelo DFA é infinito. Caso contrário, o número de palavras no idioma éc0 0+ ⋯ +cn - 1 .
(Ao calcular os poderes deM , deve-se tomar cuidado com a magnitude das entradas, que é exponencial em m . Como o tamanho deles é apenas polinomial, o algoritmo resultante é executado em tempo polinomial.)
fonte
Na verdade, você ainda pode derivar fórmulas de contagem para inequívocos expressões regulares com estrelas Kleene.
Dada a definição indutiva de uma expressão regular como:
Considere a seguinte tradução[[ ⋅ ]] : R e → C (Z) que pega uma expressão regular e a traduz em uma função racional de valor complexo:
Podemos mostrar que essa tradução retorna uma expressão racional fazendo indução estrutural eme , e observando que todas as operações usadas no lado direito preservam a racionalidade.
Suponha que a expressão regulare que colocamos é inequívoco, então descobriríamos que a função racional denotada por [[e]]∈C(z) é, na verdade, a função geradora da família de palavras aceitas pelo idioma subjacente e , classificados por seu comprimento.
Por exemplo, considere o idioma(a∗b)∗ , que define o idioma das execuções de a delimitado por b . Agora, essa expressão regular é inequívoca, para que possamos executar nosso truque de tradução:
As it turns out, given the above generating function, its coefficient extraction will be
In fact, since our translation[[⋅]] generates rational functions, we can use a partial fraction decomposition to create an enumeration formula for any unambiguous regular expression.
Suppose you have a irreducible rational function
In fact, the partial fraction decomposition generalize to multivariate rational functions, so you can actually construct counting formulas for queries such as "How many words are there where there aren m
a
s andb
s?"Unfortunately, the extent to which this method will be useful ends when you have an ambiguous expression.
fonte