Por que não é simples contar o número de palavras em um idioma comum?


8

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


3
εnão é uma linguagem infinita.
David Richerby

Respostas:


12

Sim, isso está errado, por causa da ambiguidade.

Considere o seguinte idioma: (uma+umauma)+uma(uma+ϵ).

Com seu método, vemos 4 palavras, uma,umauma,umauma,uma. 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:

  • 1 palavras termina no estado inicial: ϵ
  • Para cada estado q, o número de palavras que terminam lá é a soma do número de palavras que terminam em cada estado com uma transição para q.

O número total de palavras é então a soma do número de palavras que terminam em cada estado final.


2
É importante notar que essas recorrências sempre podem ser resolvidas pela álgebra computacional, por exemplo, para as funções geradoras. Então, sim, linguagem regular são realmente fácil de contar.
Raphael

9

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 um Q×Q matriz M (Onde Q é o conjunto de estados) em que M(Eu,j) é o número de letras que fazem com que o DFA mude do estado j declarar Eu. Deixei1q0 0 e 1Fser os indicadores para o estado inicial e para os estados aceitantes, respectivamente. Finalmente, vamosn=|Q|.

O número de palavras de comprimento m é cm: =1FMm1q0 0. Calcularcm para 0 0m<2n. E secn++c2n-1>0 0entã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 de M, 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.)


2
Eu amo essa abordagem. Também descobri que calcular os autovalores deMna verdade, correspondem às raízes do denominador na abordagem da função geradora e que, talvez sem surpresa, esses valores próprios sejam invariantes à minimização do DFA. No entanto, não tenho absolutamente nenhuma idéia de como interpretar isso corretamente.
Lee

1
Isso não é tão surpreendente, dado que a função geradora é P(z)=n=0 01FMn1q0 0zn, que simplifica para P(z)=1F(Eu-zM)-11q0 0. Você pode obter um resultado ainda mais explícito refazendo esse cálculo usando o formulário Jordan deM, que apresenta os valores próprios.
Yuval Filmus

7

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:

eRe: =xΣe0 0 e1e0 0+e1e

Considere a seguinte tradução [[]]:ReC(z) que pega uma expressão regular e a traduz em uma função racional de valor complexo:

[[xΣ]]=z[[e0 e1]]=[[e0]]×[[e1]][[e0+e1]]=[[e0]]+[[e1]][[e]]=11[[e]]

Podemos mostrar que essa tradução retorna uma expressão racional fazendo indução estrutural em e, e observando que todas as operações usadas no lado direito preservam a racionalidade.

Suponha que a expressão regular e 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 (ab), 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:

[[(ab)]]=11[[ab]]=11([[a]]×[[b]])=11(11[[a]]×z)=11z1z=12+124z

As it turns out, given the above generating function, its coefficient extraction will be

[zn][[(ab)]]=2n1+δ(n)2
where
δ(n)={1if n=00otherwise

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

r(z)+p(z)q(z)
where r,p,q are polynomials, then you can decompose this into
r(z)+C0zq0++Cnzqn
where qk are the roots of q(z). There's a bit of technical corner-cases (like multiplicity of roots, etc), but it's relatively easy to do coefficient extraction on the expression above:
[zn]Czq=C×qn

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 are n as and m bs?"

Unfortunately, the extent to which this method will be useful ends when you have an ambiguous expression.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.