如何证明语法是明确的?


25

我的问题是如何证明语法是明确的?我有以下语法:

Sstatementif expression then Sif expression then S else S

并使其成为明确的语法,我认为它是正确的:

  • SS1S2

  • S1if expression then Sif expression then S2 else S1

  • S2if expression then S2 else S2statement

我知道明确的语法每个术语都有一个解析树。

Answers:


20

有(至少)一种方法可以证明语言L的语法是唯一的。它包括两个步骤:G=(N,T,δ,S)L

  1. 证明LL(G)
  2. 证明[zn]SG(z)=|Ln|

第一步非常清楚:表明语法至少会生成您想要的单词,这就是正确性。

第二步显示,具有作为长度的话许多语法树Ñ大号具有长度的话ñ -与1,这意味着不模糊。它使用G的结构函数,该函数可以追溯到Chomsky和Schützenberger[1],即GnLnG

SG(z)=n=0tnzn

,对于长度为n的单词,语法树G的数量。当然,您需要| L n | 为此工作。tn=[zn]SG(z)Gn|Ln|

的好处是,(通常)易于获得上下文无关语言,虽然发现对于一个封闭的形式Ñ可能是困难的。将G转换为方程组,每个非终端具有一个变量:SGtnG

[A(z)=(A,a0ak)δ i=0k τ(ai) :AN] with τ(a)={a(z),aNz,aT.

这可能看起来很艰巨,但实际上仅是语法上的转换,如示例中所示。这个想法是,生成的终端符号在的指数计数并且因为该系统具有相同的形式ģž Ñ如经常发生在总和Ñ端子可以通过生成ģ。有关详细信息,请参见Kuich [2]。zGznnG

求解该方程组(计算机代数!),得出 ; 现在,您“仅”必须拉出系数(以封闭的常规形式)。该TCS小抄计算机代数往往可以这样做。S(z)=SG(z)


考虑带有规则的简单语法G

SaSabSbε

很显然,(步骤1中,通过感应证明)。有2 nL(G)={wwRw{a,b}}如果n是偶数,则 2个长度为n的回文,否则为02n2nn0

设置方程系统产量

S(z)=2z2S(z)+1

谁的解决方案是

SG(z)=112z2

的系数与回文数一致,因此G毫无疑问。SG G


  1. 乔姆斯基,舒岑贝格(1963),上下文无关语言的代数理论
  2. Kuich(1970)关于上下文无关语言的熵

3
如您所知,@ Raphael不确定性是不可决定的,因此您的步骤中至少有一个不能机械化。知道哪个吗?获得的封闭式?tn
Martin Berger

2
如果度数太高,则方程组在算法上可能无法求解,并且将精确系数从生成函数中拉出可能会(太)困难。不过,在“练习”中,通常会处理小“度”的语法-请注意,例如乔姆斯基范式会导致小度的方程组-并且有一些方法至少可以获取系数的渐近性。 ; 这可能足以确定歧义。注意,为了证明含糊不清,仅显示S Lz = S Gz 而没有拉系数就足够了。但是,证明这种身份可能很困难。SL(z)=SG(z)
拉斐尔

谢谢@Raphael。您是否知道任何详细发展的文本,即使使用例如Chomsky范式,不确定性也会如何发挥作用?(我无法找到Kuich。)
Martin Berger

@MartinBerger我刚刚在待办事项列表中重新发现了您的评论;抱歉,长期以来一直保持沉默。有三个步骤,其中(我认为)是不可计算一般:1)确定。2)计算| L n | 。3)确定[ z n ] S gz 。特别是,用于2)的L的哪种表示形式?SG|Ln|[zn]Sg(z)L
拉斐尔

为什么用表示是一个问题?例如,我们可以使用多种方式来表示编译器的CFG。也许您是说如何表示L nLLn
Martin Berger 2014年

6

这是一个很好的问题,但有些谷歌搜索人员会告诉您,没有通用的方法来确定歧义,因此您需要使问题更具体。


2
OP要求提供证明技术,而不是算法。
拉斐尔

我也这么认为; 它可能会在问题中提到。
reinierpost 2012年

1
谷歌不是事实的预言,因为知识不是民主的,谷歌的结果是。在这种情况下,我不会指望Google,因为人们经常在不检查所复制内容的正确性的情况下相互复制。如果不出示证明,则可能是错误的。
SasQ 2012年

5
@SasQ:您太字面意思地读了我的话。Google给我的是解释情况的书房网址。
reinierpost,2012年

4

对于某些语法,可以通过归纳证明(整个单词长度)。


GΣ={a,b}

SaSabSbε

1L(G)ε

nnN

w=w1wwnL(G)Σnn>0w1Σw1=aSaSaw1=bSbSbww


如果这变得更加困难

  • 有多个非终端,
  • 语法不是线性的,和/或
  • 语法是左递归的。

它可能有助于加强对所有句子形式(如果语法没有非生产性非终结词)和“根”非终结词的主张。

认为向Greibach范式的转换保持()模糊性,首先应用此步骤可能会很好地解决左递归问题。

关键是要识别每个词的一个特征(至少(一个))。其余的归纳。


3

基本上,这是子代问题。从第一个表达式开始,并生成它的子代....继续递归(DFS),经过多次迭代,看看是否可以从两个不同的子代生成相同的扩展表达式。如果您能够做到这一点,那就很模棱两可了。但是,无法确定此算法的运行时间。假定它是安全的,可能会产生30个等级的孩子:)(当然,它可能在31日炸弹)


1
OP要求提供证明技术,而不是算法。
拉斐尔

2
这不可能是一个办法来证明,如果语法不明确或没有。事实上,轰炸何时发生还无法确定。
Sнаđошƒаӽ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.