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

Math {0^i1^j是否存在上下文无关语法,使得1<;=i<;=j<;=2i}?,math,context-free-grammar,context-free-language,Math,Context Free Grammar,Context Free Language,我遇到了两个完全不同的答案 有人说: 是的,{0i1j|1确实存在上下文无关语法≤我≤J≤2i},以下语法确保存在的1可以有一半或更少的0: S -> 0S11 | 0S1 | 01 另一个: 不,矛盾证明: 案例1: 假设您将I0s推到堆栈上 弹开j 1s 你不能确定j=i 堆栈上推送的任何其他不等于i或2i的值都是相对于这两个值中任何一个的值,因此同样的推理适用 两者中有一个是正确的?非常感谢 由于语法存在,并且您可以非常清楚地检查它是否与整个语言匹配,因此该语言必须与上下文无

我遇到了两个完全不同的答案

有人说:

是的,
{0i1j|1确实存在上下文无关语法≤我≤J≤2i}
,以下语法确保存在的1可以有一半或更少的0:

S -> 0S11 | 0S1 |  01

另一个: 不,矛盾证明:

案例1:

假设您将I0s推到堆栈上

弹开j 1s

你不能确定j=i

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



两者中有一个是正确的?非常感谢

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

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

事实上,如果你让机器是不确定的,那么基本上你推10,然后对于堆栈上的每个0,不确定地弹出1或21。如果字符串使用该语言,则其中一个计算将被接受