递归函数(九):最小不动点定理

递归函数(一):开篇
递归函数(二):编写递归函数的思路和技巧
递归函数(三):归纳原理
递归函数(四):全函数与计算的可终止性
递归函数(五):递归集与递归可枚举集
递归函数(六):最多有多少个程序
递归函数(七):不动点算子
递归函数(八):偏序结构
递归函数(九):最小不动点定理

    • -

回顾

上文我们讨论了集合上的偏序结构,之所以谈论它们是因为,
完全偏序集上的连续函数具有最小不动点,这称之为最小不动点定理,
除了集合论的一些知识之外,我们还要讨论到底什么是连续函数,以及什么是完全偏序集。

有向子集与完全偏序

偏序集\((D,leqslant )\)的非空子集\(Ssubseteq D\)叫做有向子集(directed subset),
当且仅当,对于\(S\)中的任意元素\(a,bin S\),
存在\(S\)中的一个元素\(c\),有\(aleqslant c\)且\(bleqslant c\)。

如果一个偏序集\((D,leqslant )\)的每个有向子集\(Ssubseteq D\)都有上确界(记为\(bigvee S\))
就称它是一个有向完全偏序集,
此外,如果它还有最小元,就称它是一个完全偏序集。

注意,完全偏序集并不是每一个子集都有上确界,
而是它的每一个有向子集都有上确界。

连续函数

假设\((D,leqslant )\)与\((E,leqslant )\)是完全偏序集,
\(f:Drightarrow E\)是集合上定义的一个函数,
如果,\(Ssubseteq D\),则\(f(S)\)为\(E\)的子集,
其中\(f(S)=lbrace f(d)| din S rbrace\)。

对于任意的\(d,d'in D\),如果\(dleqslant d'\)就有\(f(d)leqslant f(d')\),
我们就说\(f\)是单调的。
可以看出,如果\(f\)是单调的,且\(S\)是\(D\)的有向子集,那么\(f(S)\)也是\(E\)的有向子集。

如果\(f\)是单调的,且对于任意有向子集\(Ssubseteq D\),
有\(f(bigvee S)=bigvee f(S)\),就称\(f\)是连续的。

连续函数集上的偏序结构

完全偏序集\((D,leqslant )\)和\((E,leqslant )\)上的连续也可以定义偏序结构,
我们称\(fleqslant g\),当且仅当对于每一个\(din D\),我们有\(f(d)leqslant g(d)\)。
这样我们就得到了一个元素为连续函数的偏序集,\((Drightarrow E,leqslant )\)。
可以证明,\((Drightarrow E,leqslant )\)也是一个完全偏序集。(证略

最小不动点定理

如果\((D,leqslant )\)是一个完全偏序集,且\(f:Drightarrow D\)是连续的,
则\(f\)有最小不动点,\(fix_D f=bigvee lbrace f^n(perp )| ngeqslant 0 rbrace \)。

因为\(perp \)是\(D\)中的最小元,且\(f(perp )in D\),所以,\(perp leqslant f(perp )\),
因为\(f\)是连续的,所以\(f\)也一定是单调的,所以,\(f(perp )leqslant f^2(perp )\),
继而,\(f^n(perp )leqslant f^{n+1}(perp )\),对于任意的\(ngeqslant 0\)都成立。

\(lbrace f^n(perp )| ngeqslant 0 rbrace\)构成了一个全序集,
所以,它是完全偏序集\((Drightarrow E,leqslant)\)的一个有向子集,必有上确界。

设\(a\)是上确界,\(a=bigvee lbrace f^n(perp )| ngeqslant 0 rbrace \),
首先\(a\)是\(f\)的不动点,因为,由\(f\)的连续性,
\(f(a)=f(bigvee lbrace f^n(perp )| ngeqslant 0 rbrace )\)
\(f(a)=bigvee lbrace f^{(n+1)}(perp )| ngeqslant 0 rbrace \),
但是由于\(lbrace f^n(perp ) rbrace\)与\(lbrace f^{(n+1)}(perp ) rbrace\),有同样的上确界,
所以,\(f(a)=a\)。

其次,\(a\)是\(f\)的最小不动点,
假设\(b=f(b)\)是\(f\)的任意不动点,因为\(perp leqslant b\),所以\(f(perp )leqslant f(b)\),
类似的,对于任意的\(ngeqslant 0\),\(f^n(perp )leqslant f^n(b)\)。
但是,由于\(b\)是\(f\)的不动点,所以\(f^n(b)=b\),
因此\(b\)是集合\(lbrace f^n(perp )| ngeqslant 0 rbrace\)的上界。
由于集合的最小上界是\(a\),所以有\(aleqslant b\)。

后继函数的不动点

succ :: Int -> Int
succ n = n+1

在第七篇中,我们说fix可以得到任意函数的不动点,
那么这个succ函数呢?它有没有不动点?
fix succ是什么?

现在我们有了最小不动点定理,
就得验证succ所指称的数学函数,是不是一个完全偏序集上的连续函数,
如果是的话,它就有不动点。

在第四篇为了表示计算的不可终止性,我们对自然数集进行了扩充,\(Ncup lbrace perp rbrace\),
然后用这个集合作为程序中Int类型的值的解释。

然而,\(Ncup lbrace perp rbrace\)不是一个完全偏序集,原因是它没有上界,
如果我们额外加入一个比其他的自然都大的元素\(+infty \),
则我们就得到了一个完全偏序集,\(Ncup lbrace perp rbracecup lbrace +infty rbrace\)。

然后,我们看succ连续吗?
首先,它是单调的,如果我们再定义\(succ(+infty )=+infty \),
就有\(succ(bigvee N)=bigvee succ(N)\),
因此,succ是一个连续函数。

根据最小不动点定理,succ的最小不动点是,\(fix succ=bigvee lbrace succ^n(perp )| ngeqslant 0 rbrace \)。

由于\(succ(perp )=perp \),即对于非终止的输入succ的计算也不会终止,
所以\(succ^n(perp )=perp \),
因此,\(fix succ=bigvee lbrace succ^n(perp )| ngeqslant 0 rbrace =perp \),
即,succ的最小不动点是\(perp \),fix succ的计算不会终止。

求解阶乘函数

上一篇中,我们证明了阶乘函数fact是以下函数的不动点,fact = fix g

g :: (Int -> Int) -> Int -> Int
g f n = case n of1 -> 1_ -> n * f (n-1)

现在我们来看一下,如何运用最小不动点定理来得到这个答案。
为了避免篇幅过长,关于g函数的连续性证明暂略,
我们直接使用公式,
\(fix g=bigvee lbrace g^n(perp )| ngeqslant 0 rbrace \),
即,g函数的最小不动点,就是集合\(D=lbrace g^n(perp )| ngeqslant 0 rbrace\)的上确界。

我们先来看一下这个集合\(D\)中有哪些元素,
其中,\(g(perp )in D\),我们将\(perp \)传入\(g\)中,看看会得到什么,

f1 = \n -> case n of1 -> 1_ -> ...

这个函数能计算f1 1,但是不能计算f1 2,恰好是fact函数有限展开的一阶项。

我们再来看\(g^2(perp )in D\),它等于\(g(f1)\),

f2 = \n -> case n of1 -> 1_ -> n * f1 (n-1)

这个函数能计算f2 1以及f2 2,但是不能计算f2 3,恰好是fact函数展开的二阶项。

由此,我们看出了规律,
\(g^n(perp )in D\)就是fact函数有限展开的第\(n\)阶项。
上一篇中,我们已经证明了,当\(nrightarrow infty\)时,它就是fact函数,
考虑到\(f1,f2,cdots\)这些函数的序关系,
因此,我们有\(fact=bigvee lbrace g^n(perp )| ngeqslant 0 rbrace \)。

即,fact函数就是g函数的最小不动点。

总结

到此为止,我想这个系列的文章已经讨论完了,
本系列文章一直围绕着递归函数和不动点进行分析,
在内容上可以分为两个部分,前半部分主要与可计算性理论有关,
后半部分与不动点定理有关,希望对大家有所帮助。

参考

有向集合
完全偏序
Kleene fixed-point theorem
Foundations for Programming Languages

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259322.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html中单选框颜色怎么改,如何更改单选按钮的颜色?

侃侃无极一种快速的解决方法是使用来覆盖单选按钮的输入样式:after,但是创建自己的自定义工具箱可能是更好的做法。 input[typeradio]:after { width: 15px; height: 15px; border-radius: 15px; top: -2px; left: -1px; …

如何先执行input (checkbox,radio)再执行函数

2019独角兽企业重金招聘Python工程师标准>>> 遇到一个问题,当input type"checkbox"点击时,没有立即执行勾选或去勾,而是先执行函数,如下代码 $(".sidebar_cart .cart_list ul").on("click&qu…

Linux服务器上监控网络带宽的18个常用命令

本文介绍了一些可以用来监控网络使用情况的Linux命令行工具。这些工具可以监控通过网络接口传输的数据,并测量目前哪些数据所传输的速度。入站流量和出站流量分开来显示。 作者:布加迪编译来源:51CTO.com|2014-04-11 10:10移动端收藏分享【51…

[转]Windows Phone 7程序设计”完全版电子书可以免费下载了

本文转自:http://www.cnblogs.com/salam/archive/2010/10/29/1864246.html 现在学习Windows Phone 7开发资料十分有限,除了MSDN的官方开发文档外和一些博客外,几无其他的学习渠道。幸运地是美国的资深程序员兼作家Charles Petzold为大家免费放…

linux-redhat替换yum网络源为centos网络源

2019独角兽企业重金招聘Python工程师标准>>> 1.为什么要替换 redhat系统使用yum命令安装软件时会出现This system is not registered with RHN. RHN support will be disabled. 原因是redhat的yum安装软件需要注册,是收费的。而centos的yum源是免费的。这…

计算机如何打开无线网络适配器,win7系统下网络适配器打不开怎么解决

通常情况下我们的电脑中都会有一个网络适配器,这是计算机联网的设备,不过最近有深度技术win7旗舰版系统用户却遇到了网络适配器打不开的情况,该怎么办呢,接下来系统城小编就给大家分享一下win7系统下网络适配器打不开的具体解决方…

【Intellij Idea】设置JDK

1,File-->Project Structure 说明:可以设置整个工程的JDK,也设置每个modules的JDK,但是一般整个工程的JDK. 2,或者通过快捷键:ctrlaltshifts 转载于:https://www.cnblogs.com/august-shi/p/6655469.html

绘图用计算机配置要求,绘图笔记本电脑基本配置要求 绘图笔记本推荐

现在很多工业图、工程图都需要用电脑来话,比如CAD、PS、三维画图这些软件对电脑的配置要求还是比较高的,还有一些对色彩要求高的动画软件,那就更加需要配置了,下面小编就来简单说说绘图笔记本电脑最基本的配置要求以及绘图笔记本推…

计算机无法正常更新,无法完成更新正在撤销更改请不要关闭你的计算机如何修复...

我们电脑开机的时候可能会遇到各种问题,比如就有用户发现电脑开机的时候,一直提示无法完成更新正在撤销更改请不要关闭你的计算机,等待了很长时间也进不去系统,遇到这样的问题该怎么办呢?不用担心小编给大家支招&#…

自媒体和计算机相关吗,做自媒体,台式电脑跟笔记本电脑用哪个好呢?

四阿哥fly回答数:143 | 被采纳数:162019-06-29 12:16:21作为去年折腾了一年自媒体,各种情况遇到过,分享下台式电脑和笔记本到底哪个好?好在哪里?如果真的要选择,个人还是推荐用台式比较好。工…

React进阶—性能优化

React性能优化思路 软件的性能优化思路就像生活中去看病,大致是这样的: 使用工具来分析性能瓶颈(找病根)尝试使用优化技巧解决这些问题(服药)使用工具测试性能是否确实有提升(疗效确认&#xff…

Supervised Descent Method and its Applications to Face Alignment

广播说明: 进入深度学习时代,如下的方法已经失去可比性,且我们的代码实现地很粗糙,如果坚持要用,推荐如下代码 https://github.com/wanglin193/SupervisedDescentMethod (看起来作者对sdm实现的不错&…

国外计算机课程lab,计算机系统实验之bomblab

今天刚刚验收CSAPP实验3,趁着余温,记录一下这个实验,顺便回顾下CSAPP课程的相关知识。实验目的1.使用gdb工具反汇编出汇编代码,结合c语言文件找到每个关卡的入口函数。然后分析汇编代码,分析得到每一关的通关密码。2.熟…

SDM For Face Alignment 流程介绍及Matlab代码实现之预处理篇

SDM全称为 Supervised Descent Method,是一种机器学习的方法,可以被用来做Face Alignment. 下面我们将通过matlab代码来梳理整个实现的过程。 预处理阶段 Input: ../data/lfpw/trainset (811张图片) Output: mean_…

分享25个新鲜出炉的 Photoshop 高级教程

网络上众多优秀的 Photoshop 实例教程是提高 Photoshop 技能的最佳学习途径。今天,我向大家分享25个新鲜出炉的 Photoshop 高级教程,提高你的设计技巧,制作时尚的图片效果。这些教程可以帮助把你的想法变成现实,并创造新的东西。 …

SDM For Face Alignment 流程介绍及Matlab代码实现之训练篇

SDM 训练阶段的任务如下: 载入标准化的数据(包括400*400的正脸及特征点)对每一张标准化的图片,模拟人脸检测仪,产生10个扰动的人脸框及相应的初始特征点x0。求解Δx,Φ,其中Δxx∗−x0,x∗表示true shape,Φ表示每个特…

Hibernate5-多对1(n:1)-fetch=join

1.创建项目,项目名称hibernatedemo26,目录结构如图所示2.在项目中创建lib目录存储jar文件,目录结构如图所示3.在src目录中创建实体类Forum,包名(com.mycompany.demo.bean),如图所示4.实体类Forum的内容如下package com.mycompany.demo.bean;import java.util.Set;public class …

如何使用固定二级子域名公网访问多个本地Windows Web网站

文章目录 1. 下载windows版Nginx2. 配置Nginx3. 测试局域网访问4. cpolar内网穿透5. 测试公网访问6. 配置固定二级子域名7. 测试访问公网固定二级子域名 1. 下载windows版Nginx 进入官方网站(http://nginx.org/en/download.html)下载windows版的nginx 下载好后解压进入nginx目…

实验 6 数组1

//输入n个整数&#xff0c;将它们存入数组a中。输出最大值和它所对应的下标。 #include<stdio.h> int main(void) {int n,i,x;int a[10];x0;printf("enter n:");scanf("%d",&n);for(i0;i<n;i){printf("enter :");scanf("%d&qu…

初中计算机职称答辩,晋升中学语文高级教师职称答辩内容举例

晋升中学语文高级教师职称答辩内容举例 晋升中学语文高级教师职称答辩秘籍 最重要的一点&#xff1a;你要对课本上的重点篇目非常熟悉&#xff01;对于现代文来说作者、题材、课文重点、重点句子词语、中心思想等你都要明了。对于文言文来说&#xff0c;要求学生掌握的&#xf…