邏輯角度理解程序1 -- 形式邏輯
個人觀點,歡迎指正。
本文探討我所理解的邏輯,形式邏輯以及其在程序中的體現,以及如何從邏輯角度去理解、編寫程序。
理解邏輯
不同人對於邏輯有不同的定義。
黑格爾認為,邏輯的對象即思維,或更確切地說,概念的思維,基本上是在邏輯之內來研究的;思維的概念是在邏輯發展過程中自己產生的,因而不能在事先提出。
個人覺得,這句話還是有不少道理的,邏輯是需要建立在思維,建立在概念之上的。他將邏輯看做是一個不斷發展,不斷完善的過程,而不是本來就存在在這個世界上的。因為邏輯的產生、發展依賴于思維,而思維思考是一個過程,而思考的過程是需要時間的,進而我們可以發現一些概念在某個時間點之前是不存在的,而在那個時間點之後則開始發展。(比如,「人工智慧」這個概念在3000多年前是不存在的,而是在歷史中、在人類思維構成思維路上逐漸產生的)
說這些概念性的東西有何用?理解該角度定義的邏輯,能夠讓你更加明白邏輯的某方面的本質,從而讓你理解該「邏輯」概念背後所蘊含的世界觀:人的思維是邏輯的載體。
而我更喜歡從集合角度來定義邏輯:
邏輯,思維中的概念、規則集合。
與普通的集合不同,該集合有一些獨特的性質,概念可以生成新概念,規則也可以演化。
為了幫助理解此處,舉一個簡單的例子:
一個公司發現了某種市場需求,需要創造一定的產品來滿足這種市場需求。這裡的產品就是邏輯的產物,為何這麼說呢?當你知道需求之後,你需要指定一定的產品規則、概念來適配這些需求,比如用戶想要購物,你需要將購物的相關的規則邏輯納入到產品體系中來。用戶想要方便進行分享,你得嘗試把分享的規則加入到產品中來。(很多時候,你不需要重新從0開始演化規則、概念,發展邏輯,因為現實中有很多成熟的邏輯規則)。但是,你的邏輯規則並不是一程不變的,而是不斷再演化的,向著某個方向演化(比如,讓用戶更加便捷)。
明白了邏輯的演化特性,就更加容易接受產品在發展過程中存在某個不成熟的時刻了。
現在所說的商業模式,本質也是邏輯演化的產物,不斷發展而來的,當「某種邏輯」面向對象是多變的時候(比如人,對於最初喜歡的東西,會習慣、厭倦),那麼這些邏輯演化的速度,也是很快的,這就是現在的商業模式如此變化多樣的原因。
相對而言,數學這個學科的邏輯是相對穩定的,其嚴格符號規定性決定了它的變化是較小的,(比如在某些數學體系下,1+1=2這個規則是非常穩定,經過幾千年也不會有變化)。這裡的數學規則變化較小,指的是它已有的規則變化是較小的,並不是指其知識(新規則)發展的速度慢。
邏輯分類
在生活、工作、科研中,我們能夠接觸到各種不同的小範圍的邏輯體系,比如公司A的邏輯體系種是不允許員工遲到,遲到扣100;而在公司B中的邏輯是,遲到後,通過加班可以彌補。
這麼多邏輯體系,多到你數不清,每個家庭、每個村莊、每個國家都有一套與別人不多的邏輯規則體系,這些多的邏輯,需要進行抽象、歸類。
於是便產生了高層次的邏輯分類,比如形式邏輯(普通邏輯)、數理邏輯、哲學邏輯、模糊邏輯、非形式邏輯、辯證邏輯、制約邏輯等。
(這裡我們不再討論具體討論各個邏輯體系的內容)
程序邏輯
所以你覺得程序邏輯是多變的還是穩定的?
程序邏輯是一些邏輯的結合的產物。它可能反映著現實中的業務邏輯(解決某個現實事務的邏輯,比如付款失敗後的邏輯,是應該立馬提示,還是應該先顯示成功,然後事後再進行處理);同時它也反映著計算機世界的邏輯(如,圖靈機(高層抽象邏輯,定義了計算機世界的基本規則)、字元串轉成整型、數組、鏈表、磁碟等等),還有數理邏輯(比如,加減乘除以及一些複雜的積分等計算)等等。
個人覺得,研究程序邏輯的時候,要學會把程序分解成不同的邏輯,然後分別進行研究、探討,然後再對其綜合。程序邏輯中的構成中的任何主要邏輯體系,都不能編出好的程序。(業務邏輯、演算法數據結構設計都很重要)
形式邏輯
此處探討一下形式邏輯,因為它是一個能夠規範你思考方式的邏輯工具,使用這種邏輯工具能夠讓你的思維更加嚴謹,更加具有完備性,進而設計出健全、嚴謹的程序。
(ps:
形式邏輯研究的推理中的前提和結論之間的關係,是由作為前提和結論的命題的邏輯形式決定的,而命題的邏輯形式(簡稱命題形式)的邏輯性質則是由邏輯常項決定的。)
形式邏輯,可以看作是從不同領域對象中抽象出來的邏輯結構形式,具有一定的普遍性。
例如,數學中的具體思維,就涉及數量與圖形這些特定對象;物理學中的具體思維,就涉及聲、光、電、力……這些特定的對象;政治經濟學中的具體思維,就涉及生產關係、商品、價值……這些特定的對象。各個不同領域中的具體思維所涉及的對象是不相同的。但是,在各個不同領域的具體思維中,又存在著一些共同的因素。例如,在各個不同領域的具體思維中,都要應用「所有……都是……」、「如果……那麼……」這些思維因素。各個不同領域的具體思維都需要應用的共同思維因素,就是具體思維的形式,或者說,就是思維形式。各個不同領域的具體思維所涉及的特殊對象,就是具體思維的內容,或者說,就是思維內容。(來自百度百科)
邏輯結構(形式),如「如果...那麼...」、「所有 ...都是...」等,是幾乎普遍適用於各個領域、各個邏輯體系的。形式邏輯研究的便是這種普遍性的邏輯結構。
我們可以通過幾個例子具體地加以說明(百度百科)。
(1)所有商品都是有價值的。
(2)所有金屬都是有光澤的。
(3)所有帝國主義都是要侵略的。
上面是三個判斷。
判斷(1)是屬於政治經濟學領域的具體思維,它涉及「商品」和「有價值的」這些特殊的對象。
判斷(2)是屬於物理學領域的具體思維,它涉及「金屬」與「有光澤的」這些特殊對象。
判斷(3)是屬於政治領域的具體思維,它涉及「帝國主義」與「要侵略的」這些特殊的對象。
這三個判斷所涉及的特殊對象,就分別地是這三個判斷的思維內容。
我們用「S」與「P」來分別地代表「所有」後面的「……」與「都是」後面的「……」。「S」與「P」都是變項,「S」叫做主項,「P」叫做謂項,我們可以用任何的具體概念去代換它們。這樣,上面三個判斷所具有的思維形式就是,所有S都是P。
形式邏輯的表達方式
接下來,我們將看看形式邏輯中涉及的一些抽象結構。
形式邏輯的規則:同一律、矛盾律、排中律和理由充足律。這四條規律要求思維必須具備確定性、無矛盾性、一貫性和論證性。下面給出形式化表示:
-- 同一律
同一思維過程中,必須在同一意義上使用概念和判斷,不能在不同意義上使用概念和判斷。
在程序中的體現:
【變數】程序中的變數可理解為這裡所說的概念,變數在承擔的職責應該是一致的,比如我定義了一個變數a,用於計數,計錄物品A的數量, 但是在某個階段卻又用來記錄物品B的數量(脫離了其本來的職責),造成的後果是,最終記錄在變數a中的值,你無法判斷A有多少,B有多少。
(該思想又可以推廣到,數據結構,類等)
-- 矛盾律
要求在同一思維過程中,對同一對象不能同時作出兩個矛盾的判斷,即不能既肯定它,又否定它。在傳統邏輯里 ,矛盾律首先是作為事物規律提出來的,意為任一事物不能同時既具有某屬性又不具有某屬性。它作為思維規律,則是任一命題不能既真又不真。
或
在程序中的體現:
if( condition){
}else{
}
這裡else的含義是:!condition。
程序不可能同時進入if中,同時又進入else中。
-- 排中律
排中律指同一個思維過程中,兩個相互矛盾的思想不能同假,必有一真,即「要麼A要麼非A」。形式化如下:
在程序中的體現:
if( condition || !condition){
}else{
}
在上面的if語句中,是衡為真,意味著總會進入到if語句中,而不會進入else語句中。
如果你在程序中設計的控制邏輯,不能覆蓋所有的分支,那麼這樣的程序就需要注意了,可能會疏忽一些問題。如下面語句:
if(condition1){
}else if(condition2){
}
-- 理由充足律
任何一件事如果是真實的﹐或實在的﹐任何一個陳述如果是真的﹐就必須有一個為什麼這樣而不那樣的充足理由﹐雖然這些理由常常總是不能為我們所知道的。
(在這方面,不同的學者有不同的說明)
(在程序中的體現,待進一步探討)
推薦閱讀:
※服務發現
※HTTP協議幾個版本的比較
※校園訪問(零):前言
※迷你圍棋之奧妙(一):二路圍棋
※破解數據存儲難題,復旦學者開創第三類存儲技術 | 中國發現