我想为以下语言设计一个无上下文语法:
L = {w e {(,)} * | w是平衡的}
我提出了以下语法:
S - > (S)S | ë
而讲座中提出的解决方案是:
S - > (S)| SS | ë
我无法弄清楚,我的解决方案可能会出现什么问题。 我为各种情况运行了语法,例如:
(()()),()()()和(())()
并且CFG都接受这些字符串。
有人可以帮忙,我的CFG不会涵盖哪些情况。或者它们都是等价的。或者达到最终状态所需的转换次数也不同。
答案 0 :(得分:2)
两种语法都生成相同的语言,因此两者都不正确。
我更喜欢你的,因为它是明确的,但这不是要求的一部分。许多人似乎发现其他答案更容易理解,但这也不是要求的部分,而且这是一个非常主观的标准。
答案 1 :(得分:1)
rici是正确的。要显示语法是等效的(它们生成相同的语言),您可以显示一个语句能够复制另一个语法,从而生成相同的字符串。
例如,建议的语法可以生成(S)S
和E
,如下所示:
`S => SS => (S)S` and `S => E`.
您的语法可以复制其他语法如下:
`S => (S)S => (S)`
`S => E`
对于S => SS
,您实际上无法复制该语法或讲座中语法可以使用的任何其他S^n
。没关系,因为只要覆盖了一串终端,就不需要覆盖所有这些。对于这一点,请注意S^n
最终必须将其S
的所有内容更改为(S)
(另一条规则),然后从左侧开始工作:
`S => (S)S => (S)(S)S => ... => (S)^n S => (S)^n`
现在你已经完成了。
你也可以通过显示(a)你的语法生成的每个字符串都在L
来证明它; (b)如果一个字符串在L
中,那么你的语法就会生成它。您可以通过引导来完成此操作,例如,括号对的数量。
基本情况:对于n = 0
,字符串为E
,此内容位于L
。 n = 0
唯一的字符串是E
,它是由我们的语法生成的。
归纳假设:由我们的语法生成的包括k
个括号的所有字符串都在L
中,而L
中的所有字符串都包含{{1}我们的语法生成了一对括号。
归纳步骤:我们显示我们的语法生成的k
个括号对的所有字符串都在k+1
中,而L
中的所有字符串都带有L
个括号对由我们的语法生成。
假设我们的语法使用规则k+1
生成了带w
个括号的字符串k+1
。然后S => (S)S
=(x)y w
x where
y and
L are words in
k + 1 with fewer than
w pairs of parentheses. But then they are balanced by the induction hypothesis.
x { {1}}(x)is therefore balanced since
(x)y = w`也是。
假设is balanced, thus
个括号为is balanced and
的字符串w
位于k+1
。然后,根据L
的定义,L
是平衡的。平衡的括号字符串必须具有相同数量的左括号和右括号,并且必须至少具有与任何前缀中的右括号一样多的左括号(因此它们必须至少具有与任何后缀中的左括号一样多的右括号)。选择第一个左括号和第一个右括号,使前缀包含相同数量的左括号和右括号;这是w
的子字符串(x)
。在该子字符串之后必须具有与右括号相同数量的左括号,并且必须在任何前缀中具有至少与右括号一样多的左括号(这是为了满足w
平衡的条件);因此,之后发生的事情 - 我们称之为w
- 也必须是一个平衡的括号字符串。作为(正确的)子串,y
和x
必须短于y
(包含较少的括号对),并且它们必须均衡,因此两者都在{{1} }。但它们都是由语法生成的,语法生成w
,因为它包含生成L
。
QED