答案 0 :(得分:0)
从问题和韦尔博格的评论看来,您不清楚语法的工作原理。您可能已经猜到了,它所要做的不只是写下与问题陈述中相同的数学符号。这是有关语法如何工作的简短说明。
语法有终端符号和非终端符号。终止符是语言字母中的符号,而非终止符只是语法用户的占位符。非终结符通过所谓的生产与非终结符和终结符的字符串相关。作品描述了可以用(右侧)替换非终止符号(左侧)的内容。文法有一个起始非终止符号(通常为S),据说它们生成或描述了字符串的语言,可以通过从起始非终止起始并依次应用产生式将所有非终止符号替换为终止符号来获得字符串的语言。例如,下面是语言a*b*
的简单语法:
1) S -> AB Nonterminals: S, A, B
2) A -> e Terminals: a, b
3) A -> aA Special: e is the empty string
4) B -> e
5) B -> bB
我们看到字符串aaabb
的语言如下:
S start nonterminal
-> AB production (1): S -> AB
-> aAB production (3): A -> aA
-> aaAB production (3): A -> aA
-> aaaAB production (3): A -> aA
-> aaaB production (2): A -> e
-> aaabB production (5): B -> bB
-> aaabbB production (5): B -> bB
-> aaabb production (4): B -> e
因此,在您的情况下,我们希望创建一种语法,该语法最后生成1
的{{1}}两倍,而所有0
则在前面0
个。为此,我们需要确保任何添加1
的作品都将其添加在前面,而恰好在后面添加两个0
。这样的生产是:
1
现在,仅凭此制作,我们将永远无法摆脱S -> 0S11
。我们需要通过添加一个用不引用非终结符的东西代替S
的产生来摆脱S
。一种选择是空字符串S
:
e
但是,我们可以看到它通过生成S -> 0S11
S -> e
生成了空字符串,它不是所需语言(其中S -> e
)中的字符串。因此,我们必须尝试另一种生产方式。我们语言中最短的字符串是n >= 1
,因此我们可以尝试
011
片刻的反思应该使您相信这可能是一种生成我们想要的语言的语法。
答案 1 :(得分:0)
S->0S11|011
这是因为每个0代表2个1,而最小值(n> = 1)为011。 因此,可以是:
0S11
00S1111
000S111111
...
直到获得011(退出循环):
000011111111