Calcule a interseção do seu idioma CFG com o idioma normal (isso significa multiplicar o número de estados por ke adicionar um estado "sem saída"). Agora verifique se o resultado está vazio: converta em gramática (acho que o resultado terá tamanho polinomial) e "retorne" das produções epsilon.∑ki=0Akk
Edit: Kaveh mencionou que isso é polinomial em , então se kkk é dado como entrada, o algoritmo é exponencial em . No entanto, Kaveh encontrou uma maneira de corrigi-lo. Converta o autômato original em um CFG e substitua todos os terminais por um terminal fixo. Agora use um algoritmo iterativo para encontrar o tamanho mínimo de uma palavra gerada por cada não-terminal, conforme a seguir.|k|
Inicialize todos os comprimentos com e atualize iterativamente todos os comprimentos da maneira óbvia: dada uma produção A → a t ∏ B i (a ordem não importa), coloque f ( A ) = min ( f ( A ) , t + ∑ f ( B i ) ) . Reivindicação: isso converge em∞A→at∏Bif(A)=min(f(A),t+∑f(Bi)) iterações, onde nO(n)né o número de não terminais. O motivo é que, em uma árvore que gera a palavra de tamanho mínimo, nenhum não terminal é usado duas vezes; cada "aresta" leva no máximo uma iteração para processar (algumas arestas podem ser "atualizadas" em paralelo).