Recursion 在给定上下文无关语法的情况下,找出生成的语言?

Recursion 在给定上下文无关语法的情况下,找出生成的语言?,recursion,grammar,context-free-grammar,Recursion,Grammar,Context Free Grammar,我是否应该手动应用产生式规则来找出此语法生成的语言?这太乏味了,有什么技巧/窍门可以加快速度吗 G = {{S, B}, {a, b}, P, S} P = {S -> aSa | aBa, B -> bB | b} 编辑:我发现Matajon的答案很好,那就是考虑由非终端符号生成的每种语言,然后将它们组合起来 但当我必须解决一些复杂的例子时,我仍然被卡住了,比如: G = {{S, R, T}, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, P, S} P =

我是否应该手动应用产生式规则来找出此语法生成的语言?这太乏味了,有什么技巧/窍门可以加快速度吗

G = {{S, B}, {a, b}, P, S}
P = {S -> aSa | aBa, B -> bB | b}
编辑:我发现Matajon的答案很好,那就是考虑由非终端符号生成的每种语言,然后将它们组合起来

但当我必须解决一些复杂的例子时,我仍然被卡住了,比如:

G = {{S, R, T}, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, P, S}

P = {S -> A | AS | BR | CT,
     R -> AR | BT | C | CS,
     T -> AT | B | BS | CR,
     A -> 0 | 3 | 6 | 9,
     B -> 1 | 4 | 7,
     C -> 2 | 5 | 8}

疯了,不是吗?摘自过去的考试(编程语言课程)。

我认为您只需要应用产生式规则。

我不知道任何一般技巧,但通常思考每个非终端生成的语言会有所帮助

在您的示例中,由B生成的语言显然是
L(B)={B}^+
。然后考虑S规则,使用第一个规则,可以生成判决形式
{a^n.S.a^n | n>=1}
。如果在这些判决形式上使用第二条规则,或者仅在S上使用第二条规则,则可以生成判决形式
{a^n.B.a^n | n>=1}

Rest非常简单,将这两件事结合起来,得到
L(G)={a^n.b^+.a^n | n>=1}

顺便说一下,在语法定义中,终端和非终端是集合,而不是元组。第三部分是产生式规则,而不是开始符号。所以你应该写
G={{S,B},{a,B},P,S}

编辑

事实上,有一种方法可以解决你的第二个例子,不需要太多思考,只需遵循一些类似于食谱的东西。因为,第二个上下文无关语法生成的语言实际上是规则的

当你将A、B和C的规则替换为前三个规则时,你得到

P' = {S -> 0 | 3 | 6 | 9 | 0S | 3S | 6S | 9S | 1R | 4R | 7R | 2T | 5T | 8T
     R -> 0R | 3R | 6R | 9R | 1T | 4T | 7T | 2 | 5 | 8 | 2S | 5S | 8S
     T -> 0T | 3T | 6T | 9T | 1 | 4 | 7 | 1S | 4S | 7S | 2R | 5R | 8R}
p'
是常规语法。正因为如此,您可以将其转换为非确定性有限自动机(有一种非常简单的方法,寻找它),然后将生成的NFA转换为正则表达式(这并不简单,但如果您遵循一种算法并且没有迷路,您应该可以)。从正则表达式可以很容易地看出它描述了什么语言

此外,一旦你有了这种语言的NFA,你可以查看它并确定它的逻辑功能(它与单词中
1,4,7
2,5,8
的计数以及
mod 3
的差异有关。仔细想想,这毕竟是你的家庭作业:-)


当然,如果不使用上下文无关语法生成常规语言,就无法使用此技巧。没有通用的方法来判断语法生成了什么语言(CFG的语言平等问题尚未确定),您必须考虑每个示例,并在其逻辑结构中寻找相似性和模式

逗号是这种语言字母表的一部分吗?@Matajon不,这是我的错。我编辑了文本以修复错误的定义。谢谢,好消息。帮助很大,但是更复杂的例子呢?(见我的编辑)。谢谢,很好的解释。我刚刚找到了将语法表示为NFA的方法,正如你所说的非常简单。然而,我仍然在寻找一个好的起点来学习第二遍(regex)。你能给我指一下正确的方向吗?顺便说一句,答案被接受!