运用形式逻辑去分析解决问题的方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了运用形式逻辑去分析解决问题的方法相关的知识,希望对你有一定的参考价值。
作为一名软件工程师,大部分的工作时间都在处理各种各样的问题。这些问题发生在不同的技术领域,不同的技术方向,不同的模块,甚至不同的环境下,不一而足,就像数学中的自然数可数无穷一样,我们可以一个个遍历它,但是无法穷尽所有的问题。这多少有点悲观,难道我们就没有办法了么? 不是这样的,问题有无数种,但是解决问题的通用思考方法却是有的,我们从一个数学概念讲起。
必要条件和充分条件
再进一步讨论之前,先来复习一下什么是必要条件和充分条件,这个概念应该是初中数学讲述的,并不陌生,但是真正能够掌握其确切定义的人却很少,如果用机械的方式加以定义,就是:
“当命题 ‘若p则q’ 为真,则p为充分条件,q为必要条件"
如果不结合具体的示例,可能很少有人会理解这句话,我们再分析的详细一点:
必要条件:对某事件的成立来说(至少)必要的条件。
充分条件:对某事件的成立来说(足够)充分的条件。
用这样得到方式解释好像还是不够清楚,举个例子:
居住在广东是居住在珠海的必要条件,居住在珠海市是居住在广东省的充分条件。
一个人如果居住在广东省,就有可能居住在珠海,而一个人如果居住在珠海,就一定居住在广东。根据这样的定义,如果我们把充分条件和必要条件联想成:
必要条件=宽松的条件
充分条件=严格的条件
或许会比较容易理解了。欧拉图一般用来表示两个概念外延之间的一种关系,我们用欧拉图表示如下:
类似的例子可以举很多,比如,考察一场考试年级第一和班级第一的关系。
如果同学A考了班级第一,那么他不一定是全级第一,但是如果这位同学考的是全年纪第一,那么它一定是班级第一,用图形表示就是:
绿色部分就是那些班级考试第一,但是并不是全年级第一的同学,班级第一每个班都有一个,但是全年级第一只有一个。
根据上面两个例子,我们可以把必要条件和充分条件分别视为:
必要条件=大范围,充分条件=小范围
将上述内容整理后,就会是:
必要条件=宽松的条件 = 大范围
充分条件= 严格的条件=小范围
当逐渐缩小必要条件的范围,缩小到和充分条件重合的时候,我们就认为,我们找到了充要条件,从形式逻辑的角度,两个概念互为充要条件,说明了两个概念的外延完全重合,属于同一关系。
逻辑关系矩阵
为了更好的利用逻辑规律,人们总结了一张逻辑关系矩阵图,如下图所示,在这种张图中可以看到,充要条件就是那种正命题和逆命题同时成立的命题。
如何解决问题
解决问题一般的过程是根据现象找原因,我们要根据必要条件去寻找充分条件。
但是,通常一个问题可能会有多种现象,有些现象是观察到的,有些现象是待发现的。
这个时候,如果我们一味的从现象入手,拘泥于某个个别现象去寻找问题,很可能会陷入死胡同无法自拔,更何况现象空间是未知的,可能随时会有新的现象或者规律被发现,当这些现象和规律全部摆到你的面前的时候,处理的复杂性大大增加。
这个时候,我们总的方向是从各种现象入手,寻找这些现象背后的规律和联系,从中寻找最大公约,并且逐渐缩小这个公约范围直到它既能覆盖所有的现象,也能从逻辑上演绎出最后的问题。
所以,分析过程开始就要搜集各种各样的信息,在这个阶段要把工作做足做细,搜集信息尽量符合MACE原则,个别现象一开始不理解没有关系,先把数据拿到,后面随着分析的深入,不相关的现象之间会逐渐串联起来,建立联系。有些看似无关的现象可能会在分析过程中的某个阶段发挥关键的作用。
从现象归纳到最大公约量的时候,我们用的是归纳的方式,这其中甚至会包含一些大胆的假设和猜测,但是我们基本定位到这个最大公约的范围之后,就可以大胆的使用演绎推理了,直到你发现,你演绎结果恰好是这个问题本身,这个时候,我们就找到了这个问题的rootcause.
如何打补丁
在芯片领域有一个流行的观点,如果硬件部署后出了BUG,那么问题也就成了feature.,一般需要用软件打补丁的方式去解决。一个好的补丁,一定是满足充分必要条件的补丁。
分析了这么多,都是在纸上谈兵,针对具体问题该如何找切入点呢?解决问题的第一步从寻找规律入手,没有规律也是一种规律,有些奇葩问题的特征就是毫无规律.这里点到为止,日常工作中可以持续问题进行总结分类,无需太多笔墨。
扩展,C++基类和子类
熟悉C++的人应该知道,多态性要求所有的子类对象都可以被基类指针引用,但反之则不然,也就是说,所有的子类都可以看成基类,但是基类却并不属于子类,基类的外延包含所有子类的外延,是所有子类外延的超集,例如会飞的动物和麻雀的关系,所有的麻雀都属于会飞的动物,但是会飞的动物不仅限于麻雀。我们用欧拉图表示:
当我们证明的一个结论的时候,一般思维目标是找到强条件,强条件就是更严格的条件,也就是更充分的条件。例如上面的例子,如果我要证明一种动物是鸟,我们只要证明它是麻雀,或者鸽子,或者其它任何属于鸟类的物种,自然而然它就是鸟了,也就是从充分条件找必要条件。如果万一我们找到一只从没见过的鸟,那有可能丰富鸟类的内涵,改变鸟类的外延,从而将新的物种其包括或者剔除出鸟类。进而证明或者证否。
但是当我们选择的时候,我们一般从充分条件开始选择,比如和家人出去吃东西,首先确定这次聚餐是节约一点还是可以豪放一点,确定了再选择餐厅,到了餐厅再选择食物,逐渐缩小范围。也就是从必要条件找充分条件。
在逻辑学里,减少一个词项的内涵可以扩大它的外延,从而过渡到一个外延较广的词项,例如,把人扩大到生物,就要减少关于人的内涵,增加一个词项的内涵以缩小它的外延,从而过度到外延较窄的词项,叫做限制,例如把动物缩小到人,就要在动物内涵中增加人的内涵。内涵越多,条件越强,越严格,外延越多,条件越弱,越不严格。
如果把外延看成集合,则基类相当于超集,而子类则相当于真子集。所以C++基类的外延更大,包含所有的子类,子类的内涵更大,相应的外延就会小,从属于基类。可以按照分形的思路将每个子类作为基类继续向下继承。
从这个角度上讲,子类是充分条件,基类是必要条件。
总结:
把解决问题的过程当成一场战役来打,孙子兵法谋攻篇中讲到,上兵伐谋(统一思想),其次伐交(寻找规律),其下攻城(缩小范围,解决问题,找到RC)。颇有异曲同工之妙。
参考资料
javascript:void(0)
结束
以上是关于运用形式逻辑去分析解决问题的方法的主要内容,如果未能解决你的问题,请参考以下文章