自动机理论,语言和计算导论1.5节翻译

来源:互联网 发布:域名续费怎么续 编辑:程序博客网 时间:2024/04/29 18:06

由于公式无法显示,乱码的地方请参考原文

1.5状态机核心概念

 

      本节介绍遍布于状态机理论当中的一些核心概念,这些概念主要包括”字符集合”(即符号集合),”字符串”(由符号集合当中的符号构成的列表),和”语言”(由同一个符号集合构成的字符串集合)。

1.5.1 字符集合

    一个alphabes是一个有限的,非空的符号集合构成的。通常情况下,我们使用符号Σ来代表字符集合,通常的alphabes集合如下:
1.∑= {0,1} ,即二进制集合
2.∑={a,b,…,z},即由所有小写字母所组成的集合
3.所有ASCII码组成的集合,或所有可打印的ASCII码组成的字符集合

1.5.2 字符串


    一个字符串集合(有些时候是单词)是一个从字符集合当中选择的符号所组成的符号序列,如01101是一个由二进制符号集合∑= {0,1} 所构成的二进制字符串,字符串111是该集合下的另一种字符串
空字符串
空字符串是一个带有0个符号的字符串,这类字符串通常用符号ε来表示;该字符串可以是从任何字符集合当中所组成的字符串。
字符串的长度
通常可以通过字符串的长度来区分字符串,即在字符串当中的字符数,如01101有5个长度。通常情况下说一个字符串的长度可以直接说成在字符串当中的”字符数”,在平时这么说是可以接受的,但严格意义上来讲,并不是很正确的。因为这里仅有两个符号即0和1,在字符串01101中,却有5个字符位置并且长度是5,也就是说只有当你知道字符数代表的是位置数时,你这么说才有实际意义。
    字符串的长度的注释方法是:字符串ω的长度是|ω|,如|011|=3 而|ε|=0。
字符集的乘方
如果Σ是一个字符集合,我们能够表示出该字符集合在某一长度下所能构成的所有字符串,通过采用一种额外的标记方法,我们定义Σ^k为长度k的字符串,并且其每一个字符均在字符集Σ当中。
例1.24:标记Σ^0={ε},这个时候就没有必要关心Σ是什么,也就是说ε是唯一的一个长度为0的字符串。    如果∑?〖= {0,1} 〗,那么Σ^1={0,1},Σ^2={00,01,10,11},Σ^3={000,001,010,011,100,101,110,111}等等诸如此类的运算。或许你会在Σ和Σ^1之间产生一些迷惑。前者是一个字符的集合,它有0,1两个集合元素,而后者表示的是一个字符串集合,分别是字符串0和字符串1,每个字符串的长度都是1。我们不会尝试对这两种集合采用独立的表示方法,通常读者可以通过上下文来区分{0,1}是字符集合还是字符串集合。

    所有由字符集合Σ构成的字符串集合通常用Σ^*来表示,如〖{0,1}〗^*={ε,0,1,00,01,10,11,000,…}.或者另外一种表示方式,如下:
Σ^*=Σ^0?Σ^1 〖?Σ〗^2…
    有些时候,我们希望把空字符串排除在字符串集合之外,由字符集Σ构成的非空字符串集合用Σ^+来表示。进而我们可以得出两个恰当的表示方法
Σ^+=Σ^1 〖?Σ〗^2 〖?Σ〗^3…
Σ^*=Σ^+?{ε}
字符串串接
如果x,y代表的是字符串,那么xy代表的就是这两个字符串的串接,,也就是说该字符串是由x的一个拷贝后跟一个y的拷贝构成的。更精确一点的说法是,如果x是一个由i个字符构成的话,即x=a_1 a_2…a_i, y是由j个字符构成的即:y=b_1 b_2…b_j那么字符串xy是由长度为i+j的字符串xy=a_1 a_2…a_i b_1 b_2…b_j构成的.
例1.25:使x=01101,y=110.则xy=01101110而yx=11001101。对于所有的字符串w,有等式w?=?w=w恒成立。也就是说?与任何字符串串接结果都是那个串接字符串自身的值。

1.5.3语言


从字符串集合Σ^*当中选择的所有字符串所组成的集合,叫做语言,其中Σ是一个字符集合,表示成L?Σ^*,这里L是建立在Σ上的语言。有一点需要注意就是,如果L是建立在Σ上的语言上的话,L并不需要包含Σ构成的所有的字符串。所以一旦我们在Σ上建立语言L,我们也知道了该语言包含了字符集合Σ的一个超集。
    在这里术语”语言”的选择可能会使人感觉到一些奇怪。尽管在通常情况下,语言可以被看成字符串的集合,像英语就是由所有由字母组成的合法单词所组成的字符串汇集成的。另外的一个例子是C语言及其它所有的计算机编程语言。这些语言的特点是由在该字符集中所有字母组合中最合理的字符串所组成。该字符集往往是ASCII字符集的一个子集。严格意义上说不同的编程语言在字符集上可能表现得有所不同,主要体现在大小写字符,数字,连接符及数学运算符号上。
    但是,当我们研究自动机时我们所说的语言可能和我们上面所提到的语言可能有所不同。这里给出一些抽象的例子,如下所示:
    所有由n个0后跟n个1的语言,如n≥0:{?,01,0011,000111,…}
    含有相同个数的0和1的语言,如{?,01,10,0011,0101,1001,…}
    二进制数结果是一个素数的语言,如{10,11,101,111,1011,…}
    Σ^* 对于任何的Σ都是一种语言
    ?表示空语言,该语言是可以构建在任何字符集下的语言
    {?},是仅包含空字符串的语言,当然也是构筑在任何字符集上的语言。但是请注意?≠{?};前者不包含任何字符串,而后者包含一个空串。
对于语言来说,其唯一的一个重要约束就是构成语言的所有字符必须是有限的字符,虽然他们可以有无限个字符串。即构成该语言的字符串当中的字符必须来自于固定且有限的字符集合当中的字母。
(译者注:集合形式定义语言表格略)

1.5.4问题


在自动机的理论当中,问题是对一个给定的字符串判断它是否属于某个语言成员。正如我们所理解的,问题和语言用一种关系来进行表示。精确的或者理论上的说法是,如果Σ是一个字符集,L是一种建立在Σ上的语言,那么问题L就是:
给定一个在Σ^* 中的字符串w;判断它是否在语言L当中
例1.26:判断一个由二进制数构成的全部的二进制字符串所构成的一个语言L_p的素性问题
    既是说给定一个由多个0和多个1所组成的字符串,如果该字符串的二进制值是素数的话,那么则回答yes否则回答no。对一些字符串,显然这个决策是非常简单的,如0011101不能代表一个素数。一般情况下,二进制数据除了0以外,其它的数据多以1开始。然而对于字符串11101判断其是否属于L_p并不是非常之观的,通常情况下我们需要使用一些明确的计算资源来进行计算:即时间和/或空间资源。
    一个潜在的不太令人满意的地方是我们对问题的定义,通常不像我们考虑问题的决策那样简单(即回答yes还是no).而通常是我们需要对输入进行转换。如C编译器中解析器的作用,可以被认为是我们对问题这个概念的一个典型过程。当我们给定一个ASCII字符串,判断它是否属于语言L_c的时候,L_c这里代表合理的C程序集合。然而通常情况下,编译器并不仅仅就做出结论,通常会先产生一个解析树,进入一个符号表而且可能会比这些做的还要多。更糟的是,编译器需要将整个C程序翻译成针对具体平台的目标代码,这明显与只需要简单回答该程序是否是个有效程序的”yes”或者”no”的决策过程相去甚远。
    然而,作为语言当中问题的定义是建立在对复杂理论的重要问题的合理解决方式上的。在这个理论当中,我们对推论复杂问题的边界的过程感兴趣。尤其是证明那些某一问题在有限的时间以内无法求解问题的重要技术感兴趣。而且在某些程度上判断一个问题和解决一个问题,二者近乎一样的困难。

    也就是说,如果我们能证明对于决策一个给定的字符串是否属于某一个语言的过程是非常困难的,那么它也会很难被翻译成针对该语言的目标代码。因此如果它能容易的被生成目标代码的话,那么我们运行转换器,当转换器成功的将其转换成目标代码的时候,我们就可以说,该字符串是该语言的一个有效元素。一般情况下最后一步判断该字符串是否是该语言的有效成员的过程并不困难,我们能使用非常快的算法来产生目标代码进而判断该语言和该字符串的隶属关系。注意”测试隶属关系是困难的,并不代表编译该语言也是困难的”。
    这种通过说明一个已知的有效的方法去解决特定的问题困难来推断另外一个问题解决起来也同样困难的方法叫做第二个问题对第一个问题的”归纳”。是研究复杂问题的一种非常有效的工具,在我们的观点看来,它是一种非常有效的机制来说明问题是在语言当中的隶属关系问题,而不是其它的。

原创粉丝点击