我遇到了两个截然不同的答案。
有人说:
是的,{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是相对于这两个值中的任何一个的值,因此应用相同的推理。
是否正确?非常感谢!
答案 0 :(得分:3)
由于语法存在且您可以非常清楚地检查它是否与整个语言匹配,因此语言必须是无上下文的。所以矛盾的证明是错误的。但为什么呢?
证明假定机器必须是确定性的。但是你需要一个非确定性的下推自动机来识别一些无上下文的语法。因此,所有第二个证明证明(如果它是正确的)语言不是确定性的无上下文语言,但它并不表明它不是无上下文的语言。
实际上,如果你让机器不具有确定性,那么基本上你会推送i 0s,然后对于堆栈中的每个0,不确定地弹出1或2 1s。如果字符串是语言,则其中一个计算将接受。