是否存在{0 ^ i1 ^ j的无上下文语法,使得1< = i< = j< = 2i}?

时间:2015-05-07 21:00:23

标签: math context-free-grammar context-free-language

我遇到了两个截然不同的答案。

有人说:

是的,{0i1j | 1≤i≤j≤2i}确实存在无上下文语法,以下语法确保存在1的一半或更小0:

S -> 0S11 | 0S1 |  01

另一个: 不,矛盾证明:

案例1:

假设您将i 0推入堆栈。

弹出j 1s。

您无法确定j< = 2i。

案例2:

假设您将2i 0推入堆栈。

弹出j 1s。

您无法确定j> = i。

在堆栈上推送的任何其他值不等于i或2i是相对于这两个值中的任何一个的值,因此应用相同的推理。

是否正确?非常感谢!

1 个答案:

答案 0 :(得分:3)

由于语法存在且您可以非常清楚地检查它是否与整个语言匹配,因此语言必须是无上下文的。所以矛盾的证明是错误的。但为什么呢?

证明假定机器必须是确定性的。但是你需要一个非确定性的下推自动机来识别一些无上下文的语法。因此,所有第二个证明证明(如果它是正确的)语言不是确定性的无上下文语言,但它并不表明它不是无上下文的语言。

实际上,如果你让机器不具有确定性,那么基本上你会推送i 0s,然后对于堆栈中的每个0,不确定地弹出1或2 1s。如果字符串是语言,则其中一个计算将接受。