UA MATH577 逻辑与可计算性1 递归函数

写在前面

这个系列是我上课的笔记,这个课是Jan Wehr老教授的Logic and Computation,用的教材是Boolos,Burgess,Jeffrey的Computability and Logic。Jan的研究领域是随机微分方程和数学物理,对具体的算法并不熟悉,再加上这是一个topic course,不是regular course,所以不会严格按照教材的叙述进行。这个课程的主要目标是阐述Goedel不完备定理的证明,为此需要先引入三种可计算性的定义:Turing机与Turing可计算性、Abacus可计算性与递归可计算性,以及两套形式逻辑系统:一阶逻辑与二阶逻辑。在完成这个主要目标后,会介绍一些计算理论的其他专题,比如算法复杂性、P/NP问题等。

我们先从递归可计算性开始,这一讲介绍递归函数。第一个概念是effectively computable function,这类函数指的是有明确的计算规则、表达式的函数,既然计算规则都可以明确写出来,那么这类函数当然是可计算的。基于这种函数定义可计算性的话就太狭隘了,因为并不是所有不能写出表达式、计算规则的函数都是不能计算的。所以Church用递归的思想扩展了effectively computable function的概念,定义递归函数(recursive function),这是递归可计算性(recursive computability)的基础。Church是Turing的老师,他们二人是计算理论最重要的奠基人。下面我们介绍Church定义递归函数的思路。


三种基础函数

Church在定义递归函数的时候,首先定义了三种基础函数。

第一个基础函数是zero function,记为 z ( x ) z(x) z(x),不论什么输入 x ∈ N ∪ { 0 } x \in \mathbb{N} \cup \{0\} xN{ 0},输出都是0,即
z ( x ) = 0 , ∀ x z(x)=0,\forall x z(x)=0,x

需要注意的是这里的自然数公理体系是Peano公理下的自然数的序数理论体系。自然数有两种公理系统,基数理论序数理论

第二个基础函数是successor function,记为 s ( x ) s(x) s(x)
s ( x ) = x + , ∀ x ∈ N ∪ { 0 } s(x)=x^+,\forall x \in \mathbb{N} \cup \{0\} s(x)=x+,xN{ 0}

上标 + ^+ +的含义是后继,这是Peano公理引入的一个运算,它表示某个自然数的下一个自然数,比如 1 + = 2 1^+=2 1+=2 2 + = 3 2^+=3 2+=3,但函数 s ( x ) s(x) s(x)的定义域是自然数集加0,所以我们额外再定义 0 + = 1 0^+=1 0+=1

第三个基础函数是identity function,记为 i d i n id^n_i idin,它满足
i d i n ( x 1 , ⋯   , x n ) = x i id^n_i(x_1,\cdots,x_n)=x_i idin(x1,,xn)=xi

这个函数也叫projection function;这三个函数叫基础函数,因为他们都只需要一次运算就能得到结果。

三类创造可计算的新函数的方法

上面三种基础函数的作用是与现在要介绍的函数操作一起用于扩展effectively computable function。

复合函数

复合是我们非常熟悉的函数操作,它可以用我们熟悉的函数合成新的函数。如果用effectively computable function通过复合组成新的函数,那么新的函数也是可计算的。我们用下面的记号表示复合,
h = C n [ f , g 1 , ⋯   , g m ] h=Cn[f,g_1,\cdots,g_m] h=Cn[f,g1,,gm]

它的含义是
h ( x 1 , ⋯   , x n ) = f ( g 1 ( x 1 , ⋯   , x n ) , ⋯   , g m ( x 1 , ⋯   , x n ) ) h(x_1,\cdots,x_n)=f(g_1(x_1,\cdots,x_n),\cdots,g_m(x_1,\cdots,x_n)) h(x1,,xn)=f(g1(x1,,xn),,gm(x1,,xn))

例1 常值函数
c o n s t n ( x ) = n const_n(x)=n constn(x)=n表示常值函数,它把任意输入 x x x映射为 n n n,我们可以用复合的思路说明所有常值函数是可计算的:
c o n s t 0 = z c o n s t 1 = C n [ s , z ] ⋯ c o n s t n + 1 = C n [ s , c o n s t n ] const_0=z \\ const_1 = Cn[s,z] \\ \cdots \\ const_{n+1} = Cn[s,const_n] const0=zconst1=Cn[s,z]constn+1=Cn[s,constn]

第一个等式非常直接,我们验证一下第二个等式,
C n [ s , z ] = s ( z ) = s ( 0 ) = 0 + = 1 C_n[s,z]=s(z)=s(0)=0^+=1 Cn[s,z]=s(z)=s(0)=0+=1

我们验证一下最后一个等式,
C n [ s , c o n s t n ] = s ( c o n s t n ) = n + = n + 1 Cn[s,const_n]=s(const_n)=n^+=n+1 Cn[s,constn]=s(constn)=n+=n+1

于是通过复合的手段,我们可以用基础函数说明常值函数可计算。

Primitive Recursive

Primitive Recursion指的是下面的递归过程:
h ( x , 0 ) = f ( x ) h ( x , y + ) = g ( x , y , h ( x , y ) ) h(x,0)=f(x) \\ h(x,y^+)=g(x,y,h(x,y)) h(x,0)=f(x)h(x,y+)=g(x,y,h(x,y))

我们记 h = P r [ f , g ] h=Pr[f,g] h=Pr[f,g]。可以用Primitive Recursive得到和、积、阶乘等运算:

例2 Primitive Recursive的应用

  1. s u m = P r [ i d 1 1 , C n [ s , i d 3 3 ] ] sum=Pr[id_1^1,Cn[s,id_3^3]] sum=Pr[id11,Cn[s,id33]]
  2. p r o d = P r [ z , C n [ s u m , i d 1 3 , i d 3 3 ] ] prod=Pr[z,Cn[sum,id^3_1,id_3^3]] prod=Pr[z,Cn[sum,id13,id33]]
  3. f a c = C n [ P r [ c o n s t 1 , C n [ p r o d , i d 3 3 , i d 2 3 ] ] , i d , i d ] fac=Cn[Pr[const_1,Cn[prod,id_3^3,id_2^3]],id,id] fac=Cn[Pr[const1,Cn[prod,id33,id23]],id,id]

证明
1、在序数理论中,定义加法的思路是引入两个方程: a + 1 = a + , a + b + = ( a + b ) + a+1=a^+,a+b^+=(a+b)^+ a+1=a+,a+b+=(a+b)+,这里的自然数包含了0,因此定义加法需要 a + 0 = a , a + b + = ( a + b ) + a+0=a,a+b^+=(a+b)^+ a+0=a,a+b+=(a+b)+,所以要验证第一个等式只需要验证加法对这两个等式成立:
a + 0 = s u m ( a , 0 ) = i d 1 1 ( a ) = a a + b + = s u m ( a , b + ) = C n [ s , i d 3 3 ] ( a , b , s u m ( a , b ) ) = s ( i d 3 3 ( a , b , s u m ( a , b ) ) ) = s ( s u m ( a , b ) ) = s ( a + b ) = ( a + b ) + a+0=sum(a,0)=id_1^1(a)=a \\ a+b^+=sum(a,b^+)=Cn[s,id_3^3](a,b,sum(a,b)) \\=s(id_3^3(a,b,sum(a,b))) =s(sum(a,b))=s(a+b)=(a+b)^+ a+0=sum(a,0)=id11(a)=aa+b+=sum(a,b+)=Cn[s,id33](a,b,sum(a,b))=s(id33(a,b,sum(a,b)))=s(sum(a,b))=s(a+b)=(a+b)+

2、在叙述理论中,定义乘法的思路是引入两个方程: a ⋅ 1 = a , a ⋅ b + = a ⋅ b + a a \cdot 1=a,a \cdot b^+=a \cdot b+a a1=a,ab+=ab+a,这里的自然数包含了0,所以我们需要额外说明 a ⋅ 0 = 0 a \cdot 0=0 a0=0,所以要验证第二个等式只需要说明它满足这三个方程:
a ⋅ 0 = p r o d ( a , 0 ) = z ( a ) = 0 a ⋅ 1 = p r o d ( a , 1 ) = C n [ s u m , i d 1 3 , i d 3 3 ] ( a , 0 , p r o d ( a , 0 ) ) = C n [ s u m , i d 1 3 , i d 3 3 ] ( a , 0 , 0 ) = s u m ( i d 1 3 ( a , 0 , 0 ) , i d 3 3 ( a , 0 , 0 ) ) = s u m ( a , 0 ) = a a ⋅ b + = p r o d ( a , b + ) = C n [ s u m , i d 1 3 , i d 3 3 ] ( a , b , p r o d ( a , b ) ) = s u m ( i d 1 3 ( a , b , p r o d ( a , b ) ) , i d 3 3 ( a , b , p r o d ( a , b ) ) ) = s u m ( a , p r o d ( a , b ) ) = a + a ⋅ b a \cdot 0=prod(a,0)=z(a)=0 \\ a \cdot 1 = prod(a,1)=Cn[sum,id^3_1,id_3^3](a,0,prod(a,0)) \\ = Cn[sum,id^3_1,id_3^3](a,0,0)=sum(id_1^3(a,0,0),id_3^3(a,0,0)) \\ = sum(a,0)=a \\ a \cdot b^+ = prod(a,b^+)=Cn[sum,id^3_1,id_3^3](a,b,prod(a,b)) \\ = sum(id_1^3(a,b,prod(a,b)),id_3^3(a,b,prod(a,b))) \\ = sum(a,prod(a,b))=a+a \cdot b a0=prod(a,0)=z(a)=0a1=prod(a,1)=Cn[sum,id13,id33](a,0,prod(a,0))=Cn[sum,id13,id33](a,0,0)=sum(id13(a,0,0),id33(a,0,0))=sum(a,0)=aab+=prod(a,b+)=Cn[sum,id13,id33](a,b,prod(a,b))=sum(id13(a,b,prod(a,b)),id33(a,b,prod(a,b)))=sum(a,prod(a,b))=a+ab

阶乘的构造就留给读者自行证明了,需要只需要按定义说明:
0 ! = f a c ( 0 ) = 1 n ! = f a c ( n ) = n ⋅ ( n − 1 ) ! 0!=fac(0)=1 \\ n! = fac(n)=n \cdot (n-1)! 0!=fac(0)=1n!=fac(n)=n(n1)!

即可。

Minimization

Minimization的作用是减少输入的个数,假设 f f f是一个有 n + 1 n+1 n+1个输入的函数,记 h = M n [ f ] h=Mn[f] h=Mn[f],其中
h ( x 1 , ⋯   , x n ) = { y ,   i f   f ( x 1 , ⋯   , x n , y ) = 0   o r ∀ t < y , ∃ f ( x 1 , ⋯   , x n , t ) ≠ 0 u n d e f i n e d ,   i f   n o   s u c h   y h(x_1,\cdots,x_n)=\begin{cases} y,\ if\ f(x_1,\cdots,x_n,y)=0\ or\\ \forall t<y,\exists f(x_1,\cdots,x_n,t) \ne 0 \\ \\ undefined,\ if \ no\ such\ y \end{cases} h(x1,,xn)=y, if f(x1,,xn,y)=0 ort<y,f(x1,,xn,t)=0undefined, if no such y

如果 f f f可计算,那么 h h h是可计算的。

猜你喜欢

转载自blog.csdn.net/weixin_44207974/article/details/112646544