目录
一,公理系统、形式系统
1,公理系统
数学的一个个分支(领域),其实就是一个个公理系统。
公理系统由基本概念、派生概念、公理、定理组成。
概念是用来描述的最小单位,公理是无需证明也无法证明的命题,定理是从公理推导出的命题。
2,形式系统
使用形式语言描述的公理系统,就是形式公理系统,简称形式系统。
在形式系统中,概念(包括联结符)是Token(终结符),命题(包括公理和定理)是句子(非终结符),命题的推导就是形式语言的推导。
终结符是有限的,公理的数量可能是有限的也可能是无限的,命题一定是无限的,真命题就是定理,假命题不是定理。
3,形式系统的组成
形式系统包括形式语言、概念、公理的推导规则、定理的推导规则四个部分。
形式语言即token和文法,概念即数学概念和token的对应,通过概念加文法可以定义出所有命题,包括真理,定理,假命题。
公理如果是有限的可以直接列举,如果是无限的则需要用推导规则(也叫公理模式)来表述公理的集合。
4,形式系统的包含关系
形式系统间,包含关系是一种常见的关系。
例如,一般数学分支的形式系统,都会把谓词逻辑系统包含进去,这样,所有的命题都有对应的否命题。
5,形式系统的表达能力、完备性和一致性
谓词逻辑之所以是所有常见形式系统的基础,是因为谓词逻辑的表达能力很强。
如果一个形式系统表达能力不够,那么它就失去了作为一个研究工具的价值。
(1)一般来讲,选取合适的文法和概念集,使得所有命题都能表达出来是很容易的。
(2)需要根据实际情况,选择一部分命题作为公理,可能还有公理的推导规则,定义出所有公理。
(3)完美的表达能力,还需要形式系统具有完备性和一致性。
完备性:任意命题A,要么A可以证明,要么非A可以证明。
一致性:任意命题A,A和非A不可能同时被证明。
直觉上看,只要公理的定义没问题,就能满足一致性,只要公理足够且定理的推导规则足够,就能满足完备性?
6,希尔伯特纲领
罗素悖论引发了人们对于数学严谨性的担忧,于是希尔伯特提出用形式系统来表达数学体系,每一个数学分支,就是一个形式系统。
希尔伯特认为数学的形式系统需要满足3条性质:完备性、一致性、可判定性。
可判定性:对于任意一个命题,都能在有限步骤内完成判断是真命题还是假命题。
直觉上看,只要完备性满足,可判定性就一定满足?
二,WJU系统
对于包含谓词逻辑的形式系统,我们只需要关心如何推导出一个定理,而不用关心如何证明一个命题不是定理。
但对于不包含谓词逻辑的形式系统,可能就没有否命题的概念,那我们如何证明其中的一个命题不是定理呢?下面的WJU系统就是这样的一个形式系统。
1,WJU系统——自然数的同构
WJU系统中的WU谜题:
WJU系统有3个符号:W、J、U
公理只有一条:WJ
推理规则有4条:
(1)如果一个字符串以J结尾, 那么可以在最后追加一个U。
(2)如果字符串是Wx, 那么可以得到Wxx。这里的x是指代一个字符串。
(3)如果字符串中有JJJ,那么可以将JJJ替换为U。
(4)如果字符串中有UU, 那么可以将其删掉。
WU谜题就是,WU是定理吗?
答案是,WU并不是定理。
实际上,在公理WJ中有1个J,(1)(4)不会改变J的个数,(2)是将J的个数翻倍,(3)是J的个数减3。
这样,所有的定理中,J的个数都不是3的倍数,因为所有的定理都是从公理出发,经过4条推理规则得到的。
而WU中J的个数为0,是3的倍数,所以WU不是定理。
2,OJ实战
CSU 1929 01串
题目:
Description
对于一个01串,我们可以有如下操作:
-
将字符串中的“0”替换为“11”,或者将字符串中的“1”替换为“00”;
-
将字符串中的“000”或者“111”删除。
例如,将字符串“010”执行第一个操作,并选择了第一个字符“0”,那么字符串将变为“1110”。如果将字符串“1110000”执行第二个操作,并选择了最后三个字符“000”,那么字符串变为“1110”。
这些操作可以按任意顺序执行任意次数。
给出两个01串S和T,并且有q查询,每个查询四个整数ai,bi,ci,di。 对于每个查询,判断SaiSai + 1…Sbi(S的子串)是否可以被转换成TciTci + 1…Tdi(T的子串)。
Input
第一行一个整数K,表示样例个数 。(1<=K<=5)
对于每个样例:
第一行包括两个字符串,分别表示S,T 。(1≤|S|,|T|≤105)
第二行一个整数q,表示询问个数。(1<=q<=105)
接下来q行,每行四个整数ai,bi,ci,di。(1≤ai≤bi≤|S|,1≤ci≤di≤|T|)
Output
对于每个询问,如果可以转换,输出“YES”,否则输出“NO”。
Sample Input
1
BBBAAAABA
BBBBA
4
7 9 2 5
7 9 1 4
1 7 2 5
1 7 2 4
Sample Output
YES
NO
YES
NO
这就是一个形式系统,和著名的形式系统 WU谜题 差不多
代码:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
char s[100005], t[100005];
int ns[100005], nt[100005];
int main()
{
int k;
cin >> k;
while(k--)
{
scanf("%s%s", s+1, t+1);
int ls = strlen(s+1), lt = strlen(t+1);
ns[0] = nt[0] = 0;
for (int i = 1; i <= ls; i++)ns[i] = ns[i - 1] + (s[i] == 'A') * 2 - 1;
for (int i = 1; i <= lt; i++)nt[i] = nt[i - 1] + (t[i] == 'A') * 2 - 1;
int q, a, b, c, d;
cin >> q;
while (q--)
{
scanf("%d%d%d%d", &a, &b, &c, &d);
if ((ns[b] - ns[a - 1] - nt[d] + nt[c - 1]) % 3)printf("NO\n");
else printf("YES\n");
}
}
return 0;
}
三,形式系统的推导和判定
1,系统内外的推导
(1)系统内推导
如果只能在系统内进行推导,那么我们的方法就是枚举,即先枚举公理经过一次推导可以得到哪些定理,再枚举经过两次推导可以得到哪些定理,再枚举......这个步骤和BFS算法差不多。
对于这个判断方法,我们可以说,如果一个命题是定理,那么总会在某个时间被推导出来。如果永远无法被推导出来,那么它就不是定理。但是问题就在于,不保证在有限时间内结束判断过程。
(2)系统外推导
在上面推导“WU并不是定理”的过程中,我们使用的方法是系统外的,准确的说,是借助一个同构系统(自然数系统)来完成判断。
WJU系统和自然数系统的对应关系就是J的数量,3的倍数是假命题,非3的倍数是真命题。
2,形式系统的判定
如果有一个判断命题是不是定理的方法(无论系统内外),保证对于任意一个命题,都能在有限步骤内完成判断,那么这个判断方法称为形式系统的判定,称这个形式系统满足可判定性。
3,pq系统——加法的同构
pq系统是一种形式系统,有三个符号:字母p、字母q、和短杠-。
pq系统有无穷多条公理,列不完,所以下了个定义:
只要x仅由一串短杠组成,那么x-qxp-就是一条公理。不是这个形式的都不是公理。
pq系统只有1条生成规则:
假设x、y、z都是只包含-的特定的字符串,并且xqypz是定理,那么x-qypz-就是定理。
这个系统中,判定一个字符串是不是定理很容易。
当且仅当,字符串是xqypz的形式,其中x、y、z都是只包含-的特定的字符串,而且x的长度是y和z的长度的和的时候,这个字符串是定理。
这样,这个系统就是加法系统的同构了。
x equal y plus z
4,tq系统——乘法的同构
tq系统是一种形式系统,有三个符号:字母p、字母q、和短杠-。
tq系统有无穷多条公理,列不完,所以下了个定义:
只要x仅由一串短杠组成,那么xqxt-就是一条公理。不是这个形式的都不是公理。
tq系统只有1条生成规则:
假设x、y、z都是只包含-的特定的字符串,并且xqytz是定理,那么xyqytz-就是定理。
这个系统中,判定一个字符串是不是定理很容易。
当且仅当,字符串是xqytz的形式,其中x、y、z都是只包含-的特定的字符串,而且x的长度是y和z的长度的乘积的时候,这个字符串是定理。
要说明这一点,需要从2个方面说明。
第一,定理一定满足,x的长度是y和z的长度的乘积,这一点,从生成规则还是比较容易看出来的。
第二,满足x的长度是y和z的长度的乘积的xqytz的形式的字符串一定是定理。这个需要推导出定理。
推导:yqyt-是公理
所以yyqyt--是定理
所以yyyqyt---是定理
。。。。。。
这个过程不需要无限进行下去,只需要有限步就能推导出:
所以xqytz是定理
这样,这个系统就是乘法系统的同构了。
x equal y times z
四,哥德尔不完备性定理
哥德尔证明了希尔伯特纲领这个美好愿景,是无法实现的。
哥德尔在他的论文中写到:包含基础算术公理的所有一致的形式系统都包含有不可判定的命题。
我不太确定这里的基础算术公理的含义是什么,暂且理解为自然数系统+加法+乘法吧,而谓词逻辑更是必不可少的,谓词逻辑参考谓词逻辑,自然数系统参考皮亚诺公理,而加法和乘法既可以参考代数结构相关文章,也可以参考上一章的pq系统和tq系统。
PS:几何的形式系统,不包括算术公理,实际上它是完备的。
1,哥德尔编码
哥德尔编码:每一个由正整数构成的序列{x1,x2,......,xn}都可以映射成,其中p1=2,p2=3,p3=5......取自素数表的前n项。
哥德尔编码是一个函数,定义域是全体非空正整数序列,而值域是正整数集的一个非平凡子集。
实际上哥德尔编码编码可以有无数版本,我们需要的只是一些抽象性质,而不太关心具体的数值。
2,哥德尔数
(1)token的哥德尔数
对于一个包含谓词逻辑和代数运算的形式系统,把所有token进行编码,百度百科的版本如下:
这样,所有命题都可以表示成一个正整数序列。
同样的,这个token表也可以有很多版本,注意,这个表中有可能包含无限个token
在毕导的视频中,我看到另外一个版本:
为了偷懒,我就引用毕导的版本了。
因为有0和后继s,所以可以用s0,ss0,sss0......表示所有自然数。
因为质数是无限的,所以符号也是够用的。
(2)命题公式的哥德尔数
把命题公式表示成token的序列,比如0*x=0的序列就是{6,12,13,5,6}
运用哥德尔编码把这个序列转化成数,得到的就是命题公式的哥德尔数。
注意,这里的命题公式,可能是命题,如“0=0”,也可能不是命题,如“x=0”,需要指派x到底是多少,才能变成一个命题。
(3)证明过程的哥德尔数
证明“1是存在的”
证明过程就是一个关于命题的序列,先把每个命题的哥德尔数算出来:
然后再把这个序列转化成证明过程的哥德尔数:
3,稍微复杂点的例子
(1)关于质数的命题
其中,小于符号仍然可以用token表中的符号表示出来。
(2)关于命题公式的命题
在纯谓词逻辑中,是没有关于命题公式的命题的,但是在数论的系统中,因为哥德尔数建立了映射关系,所以借此可以定义关于命题的命题。
如,“0+1=2”这个命题的第二个符号是加号。
先把“0+1=2”的哥德尔数求出来,即20329326627106551586734838111167499873065000000
然后,“0+1=2”这个命题的第二个符号是加号,这个命题的哥德尔数就是:
(3)关于命题的证明过程的命题
“哥德巴赫猜想无法被证明出来”的哥德尔数:
有大佬在毕导的视频下面指出,这个说法不严谨,还需要有关于一个命题公式是不是公理的判定。
对于一些公理有无穷多的形式系统,这是不满足的。比如把Peano算数中所有真命题作为公理的形式系统,参见https://en.wikipedia.org/wiki/True_arithmetic
(4)关于命题公式的证明过程的命题公式
如何理解“可以在100步之内证明哥德尔数是y的命题”这句话呢?显然如果y不是一个命题的哥德尔数,而是一个非命题的命题公式的哥德尔数,甚至是其他更怪异的数,那么这句话并没有太多意义,可以说是一句语法错误的句子。
所以严格来讲应该这样表述:“存在一个不超过100步的证明过程,最后一步的命题的哥德尔数等于y”。
这样就变成了一个命题公式,无论y取多少,语法都是正确的。对于有些y的取值,这是一个真命题,对于有些y的取值,这是一个假命题。
对于更复杂的例子,可以把y换成一个命题公式,那么得到的仍然是一个命题公式。
4,哥德尔不完备定理
所有包含基础算术公理的一致的形式系统都包含有不可判定的命题。
术语约定:
token、命题、证明过程都可以和整数互相转换,虽然不是所有的整数都能对应上。
为了描述方便,我们默认token、命题、证明过程都是自然数的子集,其中的成员都是整数,就像c++里面的unsigned char其实也是一个自然数的一个子集。
证明:
(1)定义sub函数
这是一个定义域和值域都是哥德尔数的三元函数,sub(a,b,c)表示,找到哥德尔数为a的命题,用符号b替换其中的所有符号c,得到新的命题d,则sub(a,b,c)=d
例如,假设的哥德尔数是m,那么sub(m,m,17)表示的就是在m这个命题中用m替换y,即
的哥德尔数等于sub(m,m,17)
PS:是一个命题公式,不是命题,无论y取哪个自然数,这都是真命题。而m是具体的自然数,所以
是一个真命题。
(2)深入理解sub函数
准确的说,a的定义域是命题公式的哥德尔数,b和c的定义域是大于12的质数,即表示字母的token的哥德尔数。
所以,sub(a,b,c)是一个命题公式,不一定是命题。
如果a是一个命题,那么sub(a,b,c)是一个命题。
因为不确定m是不是命题,所以也不确定sub(m,m,17)是不是命题,只知道是一个命题公式。
如果m这个命题公式中,没有自由变量,或者只有y这一个自由变量,那么sub(m,m,17)就是命题。
如果m这个命题公式中,有除了y之外的自由变量,那么sub(m,m,17)就不是命题。
(3)系统内外
哥德尔数的定义,显然是系统之外的,sub函数更是系统之外的操作,所以不能和系统之内的一些变换进行混用。
(4)关于sub函数的命题公式
设“无法证明哥德尔数是sub(y,y,17)的命题”这个命题公式的哥德尔数是n
这里,sub(y,y,17)是一个命题公式,其中第一个y是自由变量,第二个y是token。
那么,“无法证明哥德尔数是sub(y,y,17)的命题”是一个命题公式,而n是这个命题公式的哥德尔数。
可以说n是一个具体的数,也可以说n是关于y的一个命题公式。
(5)不完备性
设“无法证明哥德尔数是sub(y,y,17)的命题”这个命题公式的哥德尔数是n,那么“无法证明哥德尔数是sub(n,n,17)的命题”这个命题的哥德尔数是sub(n,n,17),形成自我指涉。
如果sub(n,n,17)是假命题,即“无法证明哥德尔数是sub(n,n,17)的命题”是假命题,那么就可以证明哥德尔数是sub(n,n,17)的命题,那么sub(n,n,17)就是个真命题,矛盾。
所以,sub(n,n,17)是真命题,且无法证明哥德尔数是sub(n,n,17)的命题。
即我们已经构造出一个真命题,它是无法被证明的。
(6)深入理解关于不完备性的证明
首先的疑问肯定是,既然我们已经用反证法证明了sub(n,n,17)是真命题,那为什么又说无法证明哥德尔数是sub(n,n,17)的命题?
因为,我们说的“可以证明”、“无法证明”指的都是在系统内部能否证明。即利用形式系统中命题的推导规则进行证明。参考WJU系统,系统内部无法证明WU是真命题还是假命题,外部可以证明。
具体说来,我们用系统的一致性作为条件,用反证法证明了sub(n,n,17)是真命题,但是系统的一致性本身并不是公理,也不是定理。
其次的疑问肯定是,既然n是具体的数字,那n是多少?sub(n,n,17)又是多少?
n是一个具体的数字,应该可以求出来,但是sub(n,n,17)却求不出来。
sub(n,n,17)的哥德尔数不能简单的只用定义一步步推导出来。
(7)深入理解不完备性
WJU系统内部无法证明WU是真命题还是假命题,但是这并不让人担忧,因为这个系统太弱了。
而“包含强算术公理的所有一致的形式系统”是一个表达能力比较强,应用非常广泛的系统,它的不完备性揭示了目前我们所用的表达数学理论的方法是不完善的。
但也不用过于担心,因为不完备性只能说明存在命题在系统内部无法证明,却不代表在系统外部也无法证明。只能说想用一个简单的形式系统把一个数学分支完整的囊括进去,这样的美好愿景,是无法实现的,并不是所谓的数学有漏洞。
5,哥德尔第二不完备性定理
形式系统无法在内部证明自身具有一致性。
证明过程很简单,还是反证法。
如果系统内部证明自身具有一致性,再加上反证法即可证明sub(n,n,17)是真命题,这和sub(n,n,17)无法被证明是矛盾的,所以系统内部不可能证明自身具有一致性。
PS:这里面的2个反证法,都属于谓词逻辑,所以并没有超出系统的范畴。
五,形式系统的可判定性
图灵证明了,形式系统是不可判定的。
不可判定的实例有很多:
生命游戏的任意初始状态,判定最终状态是收敛还是发散。
王浩四色砖的任意给定砖,判定能否平铺。
图灵机的停机判定。