Declaração do problema:
Seja um autômato pushdown (potencialmente não determinístico) e seja seu alfabeto de entrada. Existe uma palavra st que é aceito por ?
Esse problema está completo? Foi estudado? Existe um algoritmo que permita encontrar essa palavra?
Respostas:
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=0Ak k
Edit: Kaveh mencionou que isso é polinomial em , então se kk k é 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∏Bi f(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).
fonte
Altere todos os caracteres do alfabeto para um único caractere específico. Agora, você tem o PDA definido sobre um único caractere. Sua linguagem é uma gramática livre de contexto. No entanto, a gramática livre de contexto sobre um único caractere é regular. Portanto, converta o CFG em um idioma comum e verifique se ele contém uma palavra de comprimento k.
Agora, todas essas conversões tendem a exigir tempo exponencial, mas me parece improvável que o problema esteja completo. Especialmente se você permitir o tempo polinomial em .k
Posso estar errado e peço desculpas pela minha resposta inicial ...
Aliás, o fato de um CFG sobre uma única letra ser regular segue o teorema de Parikh. Embora uma prova direta não seja muito difícil. Veja o link para obter mais detalhes sobre o teorema de Parikh - é um resultado bonito ... http://www8.cs.umu.se/kurser/TDBC92/VT06/final/3.pdf
fonte
Um método provavelmente subótimo: execute o algoritmo de Djikstra. Então, para cada estado final, compare as distâncias com . Se algum for ≤ kk ≤k , aceite. Rejeitar.EDIT: O acima funciona apenas para NFAs! Me desculpe por isso.
fonte