在我的一个cs类中,他们提到无上下文语法和上下文敏感语法之间的区别在于CSG,然后生产规则的左侧必须小于或等于右侧。
因此,他们给出的一个例子是,上下文敏感的语法不能有空字符串,因为第一条规则不会被满足。
但是,我已经理解常规语法包含在无上下文中,无上下文包含在上下文相关中,并且上下文相关包含在递归可枚举语法中。
因此,例如,如果语法是递归可枚举的,那么也是类型上下文敏感,无上下文和常规的类型。
问题在于,如果发生这种情况,那么如果我有一个包含空字符串的无上下文语法,那么它就不能满足将规则视为上下文敏感的规则,但是会发生矛盾,因为每个上下文敏感是无上下文的。
答案 0 :(得分:1)
空制作(“lambda制作”,所谓的因为λ通常用于指代空字符串)可以从任何无上下文语法中机械地消除,除了可能的顶级制作S → λ
。这样做的算法很好地呈现在形式语言理论的每一个文本中。
因此对于任何具有lambda产生的CFG,都有一个等效的CFG,没有lambda产生,它产生相同的语言,并且也是一个上下文敏感的语法。因此,禁止在CSG中签订合同规则不会影响语言的层次结构:任何无上下文的语言都是一种上下文相关的语言。
乔姆斯基对上下文敏感语法的原始定义没有指定非契约属性,而是更具限制性的属性:每个生产都必须是αAβ→αγβ
形式,其中A
是单一的符号和γ
不为空。这组语法生成与非签约语法相同的语言集(Chomsky也证明了这一点),但它不是同一组。此外,他的无上下文语法确实是上下文敏感语法的一个子集,因为根据他对CFG的原始定义,lambda产品被禁止。 (1959年的论文可在线获取;请参阅Wikipedia article on the Chomsky hierarchy以获取参考链接。)
正是存在一个非空的上下文 - α
和β
- 这导致名称“上下文敏感”和“无上下文”;对于诸如 AB→BA
之类的任意非约束规则而言,“上下文敏感”可能意味着什么更为清晰。 (注1)
简而言之,鉴于您的问题中引用的CFG和CSG的常见现代用法,“每个CFG都是CSG”的说法在技术上并不正确。但这只是一个技术性问题:带有lambda产生的CFG可以进行机械转换,就像非契约语法可以机械地转换成符合Chomsky对上下文敏感的定义的语法(参见Wikipedia article on non-contracting grammars)。 p>
(通过向CFG和CSG定义添加规则S→λ
的例外,允许上下文敏感语言和无上下文语言包含空字符串也很常见。)
AB → BA
的结果描述为一个解析树,这一点并不明显,尽管在例如a A b → B
的情况下很明显。