UA MATH577 逻辑与可计算性1 递归函数
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的应用
- sum=Pr[id11,Cn[s,id33]]sum=Pr[id_1^1,Cn[s,id_3^3]]sum=Pr[id11,Cn[s,id33]]
- 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]]
- 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 递归函数相关推荐
- 计算理论是研究用计算机解决,可计算性理论
可计算性理论(Computability theory)作为计算理论的一个分支,研究在不同的计算模型下哪些算法问题能够被解决.相对应的,计算理论的另一块主要内容,计算复杂性理论考虑一个问题怎样才能被有 ...
- python递归函数定义_python中递归函数
python之递归函数 一.递归函数定义 什么是递归: 在一个函数里在调用这个函数本身 最大递归层数是:997 最大递归层数可以修改,建议不要去修改 (如果997层数递归都没解决你的问题那只有两个原因 ...
- 智源大师讲座丨以色列科学与人文科学院院长David Harel: Combining Modeling and AI
以色列科学与人文科学院院长David Harel于2021年12月16日正式加盟智源学术顾问委员会(BAAI Academic Advisory Committee),他将于2022年1月18日19: ...
- python函数(三)
一.函数定义 定义:def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 例如: def my_abs(x): ifx >=0 ...
- 图灵的秘密:他的生平、思想及论文解读pdf
下载地址:网盘下载 图灵的秘密:他的生平.思想及论文解读 内容简介: 图灵机是英国数学家阿兰·图灵提出的一种抽象计算模型,佩措尔德编 著的<图灵的秘密:他的生平.思想及论文解读>深入剖析了 ...
- 一篇带你搞透回溯算法
回溯算法应用场合 回溯算法和递归算法一般同时出现,一般递归算法的下面就是回溯的逻辑. 一般说递归函数,其实就是回溯函数.回溯一般不会单独出现. 回溯法其实是一个纯暴力的搜索算法.有些问题用for循环搜 ...
- python基础篇总结
(1)初学python name=raw_input() 输入变量值(返回值是字符串) name=raw_input("please enter your name") ...
- AT89C51-科技外文文献
信息与控制 英文原文 Description The AT89C51 is a low-power, high-performance CMOS 8-bit microcomputer with 4K ...
- 二叉树公共祖先问题-代码随想录-刷题笔记
236. 二叉树的最近公共祖先 递归三部曲: 1)确定递归函数返回值以及参数 需要递归函数返回值,来告诉我们是否找到节点q或者p,那么返回值为bool类型就可以了.但我们还要返回最近公共节点,可以利用 ...
最新文章
- java 绑定事件_Javascripts事件基础和事件绑定
- Tom Clancy's Splinter Cell: Double Agent
- oracle 优化之批量处理bulk correct 和 forall
- 验证整数 Double 转 int 两种写法
- 前端学习(3024):vue+element今日头条管理-关于默认子路由的问题
- Linux 基础 (1) - 在Win10上使用Hyper-v虚拟机安装CentOS7
- 身为“月光族”的电视选择之道
- java有哪些技术_Java程序员,最常用的20%技术有哪些?
- 关于APKsmail中加入代码报错All register args must fit in 4 bits
- [渝粤教育] 中国地质大学 审计学 复习题 (2)
- thinkphp 捕捉错误
- 简单明了的分类算法:OneR。
- linux 终端隐藏光标,如何在gnome-terminal中禁用闪烁的光标?
- 2022年必刷前端高频面试题
- 机器人皮肤:气球和废纸都能有生命!万物皆有成为生命的可能!
- 【Paper】A Review of Data-Driven Building Energy Consumption Prediction Studies
- 计算机网络(严伟 潘爱民)通过课后题总结学习网络 --持续更新
- 怎么进入命令提示符(cmd)管理员
- 选择CDN服务商的综合因素
- 【神经网络】神经网络的单元格和层
热门文章
- 模拟浏览器自动化测试工具Selenium之一eclipse集成开发部署篇
- SQL优化—— 优化insert语句
- Create an Apex class that returns contacts based on incoming parameters
- Java的知识点24——多线程技术理论——程序、进程、线程
- 测试工具 - Postman接口测试入门使用手册,Postman如何进行数据关联、自动更新cookies、简单编程
- Python 套接字-判断socket服务端有没有关闭的方法实例演示,查看socket运行状态
- 子类继承父类,并重写父类方法
- 判断二进制数1的个数
- Harris算子的运用 用于图像配准
- php mysql 开发微博_3款php+mysql国产微博程序推荐