Haskell 学习笔记-19:函数式编程与过程式编程的本质性区别

函数式编程本质性问题的困惑

这些天不断在练习的过程中思考这个问题,函数式编程和传统的过程式编程的本质区别是什么呢?我觉得什么函数是第一类对象、匿名函数、 λ λ 函数、闭包等等,都不是这个问题的关键。

图灵机模型

事实上,传统的过程式程序设计模式,源自图灵机。图灵为了确定某些问题是否可解,发明了图灵机的概念,把数学题的求解过程后归结为几个简单的机械动作。如果问题能在有限个动作之内求出,则可以认为问题可解,否则认为不可解。

图灵机模型能涵盖人类的解题能力吗?

当然了,一个问题不能利用图灵机在有限步骤内给出答案,就一定是不可解的吗?用其他模型也一定不可借吗?我觉得未必,当然了,说到这个地方有些尴尬,我也没能力证明我自己的想法。但是,图灵机模型不一定是解决问题唯一的机器模型。

图灵机与数学公理体系

图灵机的发明打着深深的时代烙印,伟大的发明和发现往往是水到渠成的结果。自从欧几里得的《几何原本》问世以来,很多人都在尝试用类似的方法,为他们的研究建立公理化体系。笛卡尔曾经打算用公理体系研究哲学,据说他的哲学体系的第一条公理就是”我思故我在”。

近代,随着罗素悖论等一系列和数学基础相关的问题提出,近代数学基础研究方面也出现了好几个流派,例如罗素的逻辑主义数学、布劳威尔的直觉主义数学、希尔伯特的形式主义数学流派。其中希尔伯特发起的数学公理化运动影响很大。

图灵机,事实上是一种数学公理体系图灵认为一切数学问题都可以借助图灵机的几个机械动作实现。其实这与希尔伯特的公理化思想是一脉相承的。图灵机的发明,与数学基础的研究进展是分不开的。

风诺依曼计算机体系

图灵机给出了一个很好的示范。图灵把形形色色的数学解题方法,归结为几个简单机械动作,然后冯诺依曼借助这一模型,建立了现代计算机硬件架构体系,一直到今天仍然屹立不倒。

从罗素到希尔伯特、从希尔伯特到图灵,从图灵到冯诺依曼,人类的知识就是这样一代一代传承发展。

哥德尔定理——人工智能是否可以超越人类的问题

刚参加工作的时候,一位哲学专业的同事在北京进修写毕业论文,题目就是人工智能是否可以超过人类。有一天我们就这个话题争执得不可开交。

我认为如果人脑是物质的,并且人脑是逐步进化而来的,就必然会存在一种物质形态,能超越人脑的能力。不能把人工智能载体局限为晶体管、集成电路这样的无机形态。

我的同事则认为,依靠人脑创造超越人脑能力的机器,就像想抓住自己的头发把自己提起来一样,是不可能的事情。

现在回想起来,感觉这场争执有些太 low。在希尔伯特的公理化运动中,有一项非常璀璨的成果,就是著名的哥德尔定理。哥德尔定理证明了,任何公理化体系都不可能同时满足相容性和完备性。

实际上,这等于说,建立在图灵机模型上的任何智能系统,都必然存在其无法辨识真假的命题。换句话讲,基于图灵机的系统,是不具备创造性的,从而无法在创造力方面超越人类的思维。

图灵机与过程化程序设计

图灵机把问题求解的方法规约为一组简单的机械动作,于是产生了数据存储、指令执行、条件判断、指令跳转等 CPU 的基本要素。所以,每一名程序员在第一次接触到程序设计时,都要面对一次脱胎换骨式的思维转换,抛弃传统套用公式、定理的思维方法,用一系列赋值、条件判断、循环等指令给出问题求解方法——这就是过程化程序设计思维。

图灵机模型可以求解很多数学问题,但是其解决方法和传统格格不入。我记得当年有同学学习 Algol 程序设计的时候,补考多次都不及格,可是人家数学学得很不错哦。

现在早已习惯了过程化程序设计思维的我们,需要开始反思这个过程的必要性?程序真的必须这样来写吗?

函数式编程的思维

Haskell 的发明者们在考虑这样一个问题,电脑出现之前的千百年来,人们不知道何为赋值、条件判断、循环、数据存储、参数传递等概念,不也是解决了一个又一个难题?程序设计能否回归到传统的数学思维中来?用传统的数学思维方式,把解决问题的方法说明白?让计算机能按照数学风格的叙述去工作?

前面我做过鸡兔同笼的问题,过程式解法如下:

#include< stdio. h>
int main() { 
    int a, b, n, m; 
    scanf("% d% d", &n, &m); 
    a = (4 * n - m)/ 2; 
    b = n- a; 
    if( m % 2 == 1 || a < 0 || b < 0) 
        printf(" No answer\ n"); 
    else 
        printf("% d %d\ n", a, b); 
    return 0;
}

换成函数式解法,是不是和数学解题过程差不多?

qh m n = [(a,b)|a <- [0.. m], b <- [m-a], 2*a + 4*b == n]  

我觉得,函数式编程需要一个数学基础,证明数学问题求解可以归约为一组函数式原子操作,或者证明这组函数是原子操作与图灵机的等价性问题。不知道 Haskell 的作者们是否证明了 Haskell 提供的机制能够解决哪些类型的问题?能否覆盖图灵机的能力范围?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

许野平

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值