扩展到CFG,它是什么?

时间:2012-08-22 11:20:44

标签: prolog context-free-grammar dcg iso-prolog dcg-semicontext

考虑以下对无上下文语法的扩展,该语法允许规则在左侧,非终端右侧的一个(或多个)终端。也就是说,形式的规则:

A b -> ...

右侧可能是任何东西,就像在无上下文的语法中一样。特别是,要求,右侧将在末尾具有完全相同的终端符号。在这种情况下,此扩展将是上下文相关的。但终端不仅仅是一个背景。有时,这个终端被称为“后推”。

显然,这不再是CFG(类型-2)。它包括类型1。但它是什么?真的输入0了吗?

Prolog中的Definite Clause Grammars 允许使用此特定扩展名。 (为了避免误解,我在这里不考虑Prolog的完整扩展。即我假设终端来自有限的字母而不是任意的术语,我也不认为Prolog在DCG中允许的其他参数,这些参数也属于类型 - 0已经。)


编辑:这是描述扩展名的更简单方法:添加到表单

的CFG规则
A b -> <epsilon>

3 个答案:

答案 0 :(得分:6)

以下是部分答案:

语法在类型0内。context-sensitive grammar (类型1)具有wAx -> wBx形式的规则,其中w和x是终端和非终端的串,并且B不是空的。请注意,由于B不为空,|wAx| <= |wBx|。您的语法具有Ax -> z形式的规则,其中z是一串终端和非终端,并且可以为空,并且可以删除x。这违反了CSG的两个原则。

不满意的是,我没有回答两件事:

  • 您的语法类型-1生成语言吗?语法是type-0,但这并不意味着语言不能是type-1。例如,常规语言(类型-3)可以由CFG(类型-2)描述。
  • 语言是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].

所以“半”在这里意味着“一半” - 类似于一个半群的代数性质的一半半群。