[Algorithm] 计算机算法在数学证明中都是可推导的吗?

0. 背景

题主是计算机小白,近期开始对算法产生兴趣。数学因为其极强的自洽性而成为现代科学的主流叙事语言,但是现代数学本身仍旧有很多定理和猜想尚需纯粹的理论证明。
而计算机科学正像其他科学一样,肯定有很多未知的领域尚需探索,但是有些规律尽管尚未被解释清楚,却有可能已经被用以实现经济价值。

有没有可能,目前有些算法无法被数学原理彻底解释清楚,但是已经被采用以解决实际问题?如果有,那么这种以算法完成工程学目标的做法是否可以用来进行纯理论数学研究推导,从而逆向解决当前的某些数学问题,比如说某些无穷举的证明问题。

1. 正文

从题目表述来看, 这里是在问是不是每个程序的正确性是可以证明的。如果从工程的角度来说,明确的回答,不是不是,而是不需要。

为什么呢?过于复杂的程序系统进行正确性证明是非常难的,不同于科研论文中对于某一算法精确的描述,确定的输入输出,这涉及到大量的不同的call path,不同的子系统互相调用。这就是为什么我们有个东西叫做测试。

如果你去过几家大公司呆过,就会明白只要测试写的好,代码就是写的稀烂,也是可以保证正常工作的。大部分程序只有有限的输入,很多时候,我们不需要证明,只要将每一个结果测试一下就好了。

这样对于该程序,至少在需要的一个测试集里,是正确的。对于工程来说,这样就足够了。但是你问这个程序能不能被证明正确性呢,其实也是可以的,只是从工程的角度来说,这就是在浪费时间,我们的系统,只要满足设计要求即可,并不需要得到一个广泛的,一般性的解。

举个例子:比如我们要写一个+1的程序,要求的输入集是确定的1~5整数,那么对于这个问题其实以下两个程序是都是正确的:int plus_one_1(int n) {return n+1;}
int plus_one_2(int n) {
switch(n){
case 1: return 2;
case 2: return 3;
case 3: return 4;
case 4: return 5;
case 5: return 6;
default: return -1;
}
}
显然对于plus_one_1 可以有一个普遍性的正确性证明,但是对于plus_one_2只能保证在测试集[1,5]的正确性,然而如果实际问题是我们只有[1,5]的输入,那么对于这两个程序都是正确的。

因此,再设计程序的时候,只要明确了输入范围,明确了测试集,那么就算你的code写的稀烂如plus_one_2又有什么关系呢,反正可以得到符合设计的正确结果。

而且这里没有任何的形式化证明,我们只是把每个输入试了一下看看对还是不对罢了。当系统足够复杂的时候,系统里的逻辑就会慢慢变成一个又一个if去把当初没有cover的测试集去cover,这就是当今很多大型系统的德行,所谓的business logic很多就是在做这个按情况分类。

比如1,5给这个函数,6,10给那个函数,听起来很蠢,但是当系统足够复杂的时候,能把这些情况按照一定条件分类就已经非常不容易了。

最后,算法是什么呢,对于图灵机来说,它就是一个图灵机的状态转移矩阵,我们要做的就是在几个初始状态和几个终结状态之间这样一个状态转移矩阵。如果你懂状态机,就会更加理解为什么测试是行之有效的正确性保证的手段了。

因此,很多时候不是算法不能证明正确性,而是实际的工程是不会那么做的,现代的软件工程是测试驱动的,测试就是正确性的保证。

转载链接,知乎回答:

https://www.zhihu.com/question/59671403/answer/173617873

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值