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

  • 三种基础函数
  • 三类创造可计算的新函数的方法
    • 复合函数
    • Primitive Recursive
    • Minimization

写在前面

这个系列是我上课的笔记,这个课是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\}x∈N∪{0},输出都是0,即
z(x)=0,∀xz(x)=0,\forall xz(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+,∀x∈N∪{0}

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

第三个基础函数是identity function,记为idinid^n_iidin​,它满足
idin(x1,⋯,xn)=xiid^n_i(x_1,\cdots,x_n)=x_iidin​(x1​,⋯,xn​)=xi​

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

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

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

复合函数

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

它的含义是
h(x1,⋯,xn)=f(g1(x1,⋯,xn),⋯,gm(x1,⋯,xn))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 常值函数
用constn(x)=nconst_n(x)=nconstn​(x)=n表示常值函数,它把任意输入xxx映射为nnn,我们可以用复合的思路说明所有常值函数是可计算的:
const0=zconst1=Cn[s,z]⋯constn+1=Cn[s,constn]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​]

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

我们验证一下最后一个等式,
Cn[s,constn]=s(constn)=n+=n+1Cn[s,const_n]=s(const_n)=n^+=n+1Cn[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=Pr[f,g]h=Pr[f,g]h=Pr[f,g]。可以用Primitive Recursive得到和、积、阶乘等运算:

例2 Primitive Recursive的应用

  1. sum=Pr[id11,Cn[s,id33]]sum=Pr[id_1^1,Cn[s,id_3^3]]sum=Pr[id11​,Cn[s,id33​]]
  2. prod=Pr[z,Cn[sum,id13,id33]]prod=Pr[z,Cn[sum,id^3_1,id_3^3]]prod=Pr[z,Cn[sum,id13​,id33​]]
  3. fac=Cn[Pr[const1,Cn[prod,id33,id23]],id,id]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=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)+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+aa \cdot 1=a,a \cdot b^+=a \cdot b+aa⋅1=a,a⋅b+=a⋅b+a,这里的自然数包含了0,所以我们需要额外说明a⋅0=0a \cdot 0=0a⋅0=0,所以要验证第二个等式只需要说明它满足这三个方程:
a⋅0=prod(a,0)=z(a)=0a⋅1=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)=aa⋅b+=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+a⋅ba \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 ba⋅0=prod(a,0)=z(a)=0a⋅1=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)=aa⋅b+=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+a⋅b

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

即可。

Minimization

Minimization的作用是减少输入的个数,假设fff是一个有n+1n+1n+1个输入的函数,记h=Mn[f]h=Mn[f]h=Mn[f],其中
h(x1,⋯,xn)={y,iff(x1,⋯,xn,y)=0or∀t<y,∃f(x1,⋯,xn,t)≠0undefined,ifnosuchyh(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 or∀t<y,∃f(x1​,⋯,xn​,t)​=0undefined, if no such y​

如果fff可计算,那么hhh是可计算的。

UA MATH577 逻辑与可计算性1 递归函数相关推荐

  1. 计算理论是研究用计算机解决,可计算性理论

    可计算性理论(Computability theory)作为计算理论的一个分支,研究在不同的计算模型下哪些算法问题能够被解决.相对应的,计算理论的另一块主要内容,计算复杂性理论考虑一个问题怎样才能被有 ...

  2. python递归函数定义_python中递归函数

    python之递归函数 一.递归函数定义 什么是递归: 在一个函数里在调用这个函数本身 最大递归层数是:997 最大递归层数可以修改,建议不要去修改 (如果997层数递归都没解决你的问题那只有两个原因 ...

  3. 智源大师讲座丨以色列科学与人文科学院院长David Harel: Combining Modeling and AI

    以色列科学与人文科学院院长David Harel于2021年12月16日正式加盟智源学术顾问委员会(BAAI Academic Advisory Committee),他将于2022年1月18日19: ...

  4. python函数(三)

    一.函数定义 定义:def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 例如: def my_abs(x): ifx >=0 ...

  5. 图灵的秘密:他的生平、思想及论文解读pdf

    下载地址:网盘下载 图灵的秘密:他的生平.思想及论文解读 内容简介: 图灵机是英国数学家阿兰·图灵提出的一种抽象计算模型,佩措尔德编 著的<图灵的秘密:他的生平.思想及论文解读>深入剖析了 ...

  6. 一篇带你搞透回溯算法

    回溯算法应用场合 回溯算法和递归算法一般同时出现,一般递归算法的下面就是回溯的逻辑. 一般说递归函数,其实就是回溯函数.回溯一般不会单独出现. 回溯法其实是一个纯暴力的搜索算法.有些问题用for循环搜 ...

  7. python基础篇总结

    (1)初学python     name=raw_input()  输入变量值(返回值是字符串) name=raw_input("please enter your name") ...

  8. AT89C51-科技外文文献

    信息与控制 英文原文 Description The AT89C51 is a low-power, high-performance CMOS 8-bit microcomputer with 4K ...

  9. 二叉树公共祖先问题-代码随想录-刷题笔记

    236. 二叉树的最近公共祖先 递归三部曲: 1)确定递归函数返回值以及参数 需要递归函数返回值,来告诉我们是否找到节点q或者p,那么返回值为bool类型就可以了.但我们还要返回最近公共节点,可以利用 ...

最新文章

  1. java 绑定事件_Javascripts事件基础和事件绑定
  2. Tom Clancy's Splinter Cell: Double Agent
  3. oracle 优化之批量处理bulk correct 和 forall
  4. 验证整数 Double 转 int 两种写法
  5. 前端学习(3024):vue+element今日头条管理-关于默认子路由的问题
  6. Linux 基础 (1) - 在Win10上使用Hyper-v虚拟机安装CentOS7
  7. 身为“月光族”的电视选择之道
  8. java有哪些技术_Java程序员,最常用的20%技术有哪些?
  9. 关于APKsmail中加入代码报错All register args must fit in 4 bits
  10. [渝粤教育] 中国地质大学 审计学 复习题 (2)
  11. thinkphp 捕捉错误
  12. 简单明了的分类算法:OneR。
  13. linux 终端隐藏光标,如何在gnome-terminal中禁用闪烁的光标?
  14. 2022年必刷前端高频面试题
  15. 机器人皮肤:气球和废纸都能有生命!万物皆有成为生命的可能!
  16. 【Paper】A Review of Data-Driven Building Energy Consumption Prediction Studies
  17. 计算机网络(严伟 潘爱民)通过课后题总结学习网络 --持续更新
  18. 怎么进入命令提示符(cmd)管理员
  19. 选择CDN服务商的综合因素
  20. 【神经网络】神经网络的单元格和层

热门文章

  1. 模拟浏览器自动化测试工具Selenium之一eclipse集成开发部署篇
  2. SQL优化—— 优化insert语句
  3. Create an Apex class that returns contacts based on incoming parameters
  4. Java的知识点24——多线程技术理论——程序、进程、线程
  5. 测试工具 - Postman接口测试入门使用手册,Postman如何进行数据关联、自动更新cookies、简单编程
  6. Python 套接字-判断socket服务端有没有关闭的方法实例演示,查看socket运行状态
  7. 子类继承父类,并重写父类方法
  8. 判断二进制数1的个数
  9. Harris算子的运用 用于图像配准
  10. php mysql 开发微博_3款php+mysql国产微博程序推荐