引言
考虑下面一个问题:
那大家是不是觉得这个语言是不可枚举的语言了?即给定一个属于该语言的句子比如b,如果按照字典序来枚举,先列a开头的,那么我们给定的字符串b永远也不会被列举出来,因为在该语言中,a开头的字符串有无数个。
但是:
至于图灵机被0,1编码是怎么回事,可以看文章图灵机的种类中的通用图灵机部分。
小结:
即上面的3步枚举过程一定可以在有限时间内枚举到你所指定的图灵机。
递归可枚举语言
例子
假设语言L=
a
n
b
n
,
n
>
0
a^nb^n,n>0
anbn,n>0,这个语言是否为递归可枚举语言?当然,根据定义,给定一个L中的字符串
w
=
a
m
b
m
,
m
>
0
w=a^mb^m,m>0
w=ambm,m>0,设计一个图灵机如下:
- 枚举ab
- 比较ab和w,相同则停机
- 不同则返回第一步,枚举下一个。
显然,这个图灵机可以在m步的时候接受w,但是我们发现这个图灵机有一个致命的缺点,就是对于w=a,一个不属于L中的句子,此图灵机将永不停机。
也许你会不爽,觉得是我图灵机设计得太差了,对于这个例子(L上下文无关语言)来说,这个图灵机确实不好。但是有些语言,你只能这么设计,因为你无法设计出更好得,甚至设计不出第二个!
再回过头来看看,是不是发现这个识别L的图灵机特别简单,谁都能想到,虽然有的时候不好用,但是也有的时候是最好且唯一的!
递归语言
这里一定要注意区别:
- 显然,递归语言是递归可枚举语言的一个子集。因为L是递归,那么存在M,使得接收L,所以递归可枚举。
- 反过来,L是递归可枚举,存在M,使得接收L,但不一定对不属于L的w停机,不符合递归语言定义,可能不递归。
进一步解释:L是递归语言,根据上面的定义,是说你随便给一个句子,L对应的图灵机可以确切的告诉你,这个是不是属于语言L,也就是说给定任意输入,图灵机一定停机并返回一个精确答案。L是递归可枚举语言,是说随便给一个句子,如果这个句子属于L,L对应的图灵机会告诉你。但是如果这个句子不属于L,那么有两种可能:
- 图灵机停下来了,告诉你这个不是L中的句子。
- 图灵机停不下来,还在一直枚举,并且这个过程永不结束,它试图告诉你答案。
结合我之前给的
a
n
b
n
a^nb^n
anbn的例子,我上面设计的图灵机就对于不属于L的语言永远停不下来,只可以成功判定属于L的语言,无法判定不属于L的语言。
小结:正如前面所说,对于那个例子,你可以设计好的图灵机,其相当于一个成员资格判定算法,但是可以证明有些语言,你无法设计出一个成员资格判定算法!
由于你平常见到的用数字字母表述的语言,全都是递归语言,我举不出一个非递归但是是递归可枚举的语言,因为如果我具体化的描述出来了,那么它肯定是个递归语言!
但是,我们可以用文字抽象地表述并构造1.递归可枚举但非递归的语言2.非递归可枚举语言。这个在最后会给出,慢慢看下去。
非递归可枚举语言:
引理
所有递归可枚举语言构成的集合是可数的。
证明:所有递归可枚举语言都可以映射到各自的图灵机编码,而文章开头证明过图灵机编码构成的集合是可数的。
定理
证明:由于
Σ
∗
\Sigma^*
Σ∗的子集的集合是不可数的,而
Σ
∗
\Sigma^*
Σ∗的一个子集其实就对应一个语言,换句话说就是,
Σ
\Sigma
Σ上所有语言的集合是不可数的。这和前面引理中的所有递归可枚举语言构成的集合是可数的是矛盾的。
结论:
存在
Σ
\Sigma
Σ上的一个语言它是非递归可枚举的,而且
Σ
\Sigma
Σ上非递归可枚举的语言要比递归可枚举的语言多得多。
另外,作为结论的一部分,你可以看看下面的题目:
但是,我无法举一个非递归可枚举语言的具体例子出来,因为能写出具体形式来的都是递归可枚举语言。
后两种语言的构造
下面依次构造
- 非递归可枚举语言
- 递归可枚举但非递归的语言
1.可以构造一个非递归可枚举语言,虽然不是那么直接。
定理:
定理:
2.构造递归可枚举但非递归的语言
定理
补充
结尾
大家慢慢看,必会所有收获,但是可能会需要一些可数无穷和不可数无穷的基础知识。