检查上下文无关语法是否生成DFA拒绝的无限语言的算法

时间:2017-04-06 10:48:30

标签: algorithm context-free-grammar formal-languages automaton

我有一个DFA A和一个CFG G,然后我必须检查G是否生成A不接受的无限单词(被A拒绝),以及复杂的时间。

我想用CFG构建一个图形,如果它包含一个有向循环,那么就产生一个无限的语言。顶点是变量,每个生产我绘制一些边。输入是DFA拒绝的所有单词,当我找到一个循环时,我可以说CFG会生成由DFA A拒绝的无限语言。

我不知道如何在算法中对其进行转换,或者如果我的提案不正确,我必须创建一个新的。

编辑:我可以将我的cfg转换为CNF,然后转换为DFA(使用chomsky)。之后,我尝试找到一个循环。但是我变形的dfa可以比我的dfa更少的状态...我需要如何在我的cfg中得到DFA A拒绝的词语。

1 个答案:

答案 0 :(得分:2)

给定CFG G,构建PDA B.给定DFA A和PDA B,构建PDA C使得C接受L(C)= L(B)\ L(A),其中\设定差异。现在,L(C)恰好是PDA B接受的词语(因此由CFG G生成),但不被DFA A接受,即被拒绝。

现在,问题是B的语言是否是无限的。我们做得到。一种方法是将PDA转换回CFG,然后将CFG放入CNF中 - 删除不必要的和非生产性的符号。然后,在非终结符号之间创建依赖关系树。如果任何剩余的(生产性)非终结符号依赖于它自身,即存在一个循环,则该语言是无限的。否则,语言是有限的(如果没有剩余的生产符号,则为空)。