考虑以下对无上下文语法的扩展,该语法允许规则在左侧,非终端右侧的一个(或多个)终端。也就是说,形式的规则:
A b -> ...
右侧可能是任何东西,就像在无上下文的语法中一样。特别是,不要求,右侧将在末尾具有完全相同的终端符号。在这种情况下,此扩展将是上下文相关的。但终端不仅仅是一个背景。有时,这个终端被称为“后推”。
显然,这不再是CFG(类型-2)。它包括类型1。但它是什么?真的输入0了吗?
Prolog中的Definite Clause Grammars dcg允许使用此特定扩展名。 (为了避免误解,我在这里不考虑Prolog的完整扩展。即我假设终端来自有限的字母而不是任意的术语,我也不认为Prolog在DCG中允许的其他参数,这些参数也属于类型 - 0已经。)
编辑:这是描述扩展名的更简单方法:添加到表单
的CFG规则A b -> <epsilon>
答案 0 :(得分:6)
以下是部分答案:
语法在类型0内。context-sensitive grammar
(类型1)具有wAx -> wBx
形式的规则,其中w和x是终端和非终端的串,并且B不是空的。请注意,由于B不为空,|wAx| <= |wBx|
。您的语法具有Ax -> z
形式的规则,其中z是一串终端和非终端,并且可以为空,并且可以删除x。这违反了CSG的两个原则。
不满意的是,我没有回答两件事:
语言是recursive吗?这很重要,因为如果是这样,语言是可判定的(不会遇到暂停问题)。
我目前正在尝试第二点的证明,但这可能超出了我的能力。
答案 1 :(得分:2)
是的,我认为它是0型。前3种类型(3,2和1)的原则是那些不能进行还原的原则。这些只是生成类型。
在这里,您可以将终端转换为epsilon,因此它的类型为0。
答案 2 :(得分:2)
为了回答关于Prolog的DCG形式主义的问题,这个扩展名现在被称为 semicontext 。见N253 DIN Draft for DCGs 2014-04-08 - ISO/IEC WDTR 13211-3:2014-04-08
鉴于
a1, [b] --> ... .
a2, [b,b] --> ... .
终端序列[b]
现在是半同步文本,以及终端序列[b,b]
。
现在相同的终端序列会出现在规则的末尾,我们会有一个上下文:
a3, [b,b] --> ..., [b,b].
所以“半”在这里意味着“一半” - 类似于一个半群的代数性质的一半半群。