反证法(归谬法):先假设命题的否定形式成立,然后再进行推理,引出矛盾。 矛盾:命题P和它的否定形式非P都成。 examples:证明不存在最大的整数、质数是无穷的。
可数(countable/enumerable):集合的元素是有限的,或者集合中的所有元素都与正整数一一对应(即元素可一一列出)。
可数集合examples: 1)有限集合是可数的; 2)0以上的所有偶数的集合是可数的; 3)所有整数的集合是可数的(正负数交互编号); 4)所有有理数的集合是可数的; 5)程序(符合编程语言语法的有限字符的排列)的集合是可数的;
不可数集合:元素不能与1以上的整数(1,2,3….)一一对应的集合; 无论采用什么对应规则,总会有遗漏的元素。
不可数集合examples: 1)“所有整数数列(无穷个整数的排列)的集合”是不可数的;[对角论证法,康托尔] 2)“所有实数的集合”…. 3)“所有函数的集合”….
处理无穷集合的“个数”使用一一对应方法,因为一一对应是既无“遗漏”也无“重复”的对应。
不可解问题:”原则上不能用程序来解决的问题“
关于存在不可解问题的讨论: ”输入1以上的整数时,输出一个整数的函数“的集合不可数; 所有程序的集合可数; 二者不能一一对应(函数“个数”比程序“个数”多) 故,在输入1以上的整数时,输出一个整数的函数中,存在无法用程序表达的函数。
对角论证运用不当的例子: “所有能用程序生成的整数数列的集合”是可数的。[图灵] (虽然可以用对角论证法做出一个整数数列不包含在表中,但不能保证此数列是“能用程序生成的”,正如证明“有理数是可数的”一样,不能保证做出的肯定是有理数) 注:有理数是整数和分数的集合,整数也可看做是分母为一的分数。 有理数的小数部分是有限或为无限循环的数。不是有理数的实数称为无理数,即无理数的小数部分是无限不循环的数。
停机问题 程序的行为有两种:Data->Program->1)Result;2)永不结束运行。 程序本质是计算机存储设备上的数据。 “处理程序的程序”examples: 1)compiler(转换程序的程序) 2)source code checker(读取程序的程序) 3)debugger(调试程序的程序) 停机问题(Halting Problem):判断“某程序在给定数据下,是否能在有限时间内结束运行”的问题。
判断程序是否会结束运行的程序HaltChecker: 1)必须准确判断给定的程序会如何运行; 2)还可能需要根据给定的数据模拟程序的运行; 3)它自身必须要在有限时间内结束运行。 根据以上条件,不能通过实际运行 对象程序来进行判断。(因为若是对象程序永不结束,则判断程序也永远得不出判断结果)
停机问题是不可解的,能普遍解决停机问题的程序不存在。[反证法]
SelfLoop(p) { halts=HaltChecker(p,p); if(halts){ while(1>0){ } } }当程序作为数据输入,例如 假设SelfLoop(SelfLoop)会结束 => halts=false =>HaltChecker(SelfLoop,SelfLoop)=false => SelfLoop(SelfLoop)不会结束,矛盾!
