最近準備一些教材,讀了 Roland Backhouse 的 Program Construction: Calculating Implementations from Specifications 一書,其中有兩章講「演算邏輯 (calculational logic)」。¹ 覺得這是很有趣的資料,可惜沒有早點學到。
演算邏輯是另一種形式化的古典邏輯,先後由 Edsger Dijkstra, Carel Scholten (因此被稱作 Dijkstra-Scholten 邏輯), David Gries, Wim H.J. Feijen, Netty van Gasteren, 和 Backhouse 等人提倡。Gries 說,邏輯學家發展形式邏輯是為了研究邏輯本身,而演算邏輯則是設計來解決問題的。我想這裡要加個但書:演算邏輯熟悉後確實很好用,但就和其他數學演算一樣,仍是要花點功夫去學,才能得心應手的。
以下的內容來自 Backhouse。
若且唯若
Backhouse 提到,在數學發展史中,不少重要的觀念往往很晚才被發現。「零」是個經典例子,希臘人甚至不把「一」當作數字,更別說零。「等於」的觀念更晚成型,=
符號到了 1557 年才由 Robert Recorde 在 The Whetstone of Witte 一書中採用。
一個概念往往要到有了符號後才成為可談論的東西。「等於」用符號 =
表示後,一些性質也比較容易表達。我們知道 =
滿足交換律(若 a = b
成立,b = a
也成立)和遞移律(若 a = b
, b = c
, 則 a = c
)。既然 =
滿足遞移律,一般我們常寫「a = b = c
」同時表達三件事情。 這種用法精簡地表達了很多性質,已經成為習慣,也有其方便性。
但另一種看法是把 =
當作傳回布林值的運算元:3 = 3
是 true
, 3 = 5
是 false
。很多人不知道這個意義下的 =
其實還滿足結合律:如果 (p = q) = r
為真,p = (q = r)
也為真,反之亦然。當然這時 p
, q
, r
都必須是布林值。讀者不妨代幾個布林值試試看,例如:(true = false) = false
成立,true = (false = false)
也成立。Backhouse 說,許多數學家都不知道這個性質,更別說計算科學家了。
為了區分這兩種用法,我們把第二種意義的「等於」(也是邏輯上的「若且唯若」)寫成 ≡
。既然滿足結合律,≡
連續出現時可不用加括號。算式 true ≡ false ≡ false
是成立的, true = false = false
則否。Backhouse 建議把 p ≡ q
念成 “p
equivals q
” . 至於中文該怎麼念… 請大家提供想法囉。
運算元 ≡
和其結合律讓我們用精簡的符號承載大量的資訊。例如以下的式子:
even (m + n) ≡ even m ≡ even n
若讀成even (m + n) ≡ (even m ≡ even n)
,我們知道如果 m
和 n
的奇偶同位相同,m+n
是偶數;反之 m+n
是奇數。如果讀成 (even (m + n) ≡ even m) ≡ even n
,我們知道把 m
加上一個偶數(n
)不會改變其奇偶性質。
在其他形式邏輯中,同樣的性質可能會用許多個狀況分析來證明:檢查一下 even m
且 even n
的情況、even m
且 odd n
的情況… 等等。當變數多、狀況更多,演算就難了。盡量使用結合律,避免使用狀況分析,是演算邏輯的主要風格。
參考資料
- Roland Backhouse, Program Construction: Calculating Implementations from Specifications.
- Edsger Dijkstra, Carel Scholten. Predicate calculus and program semantics.
- David Gries 的 Calculational Logic 簡介與參考資料。
calculus台湾翻译是什么?大陆把calculus译为演算(在数学中被特定译为微积分),arithmetics译为算术或运算,algorithm译为算法。
啊,其實差不多。講極限的那個 calculus 也是譯成「微積分」。至於 λ calculus 一般習慣是不翻譯,知道「λ演算」是什麼的人不多。我剛剛查一下發現 arithmetics 翻譯成「算術」的也不少。
Calculation 翻譯成演算不知好不好,和 calculus 撞詞也是個問題。話說回來,很多字典仍不把 “calculational” 當作一個字。可見這東西還真是小眾呀…
又,我後來才知道大陸不說「若且唯若」,而是「當且僅當」。 🙂
calculate确实不好翻译,大陆也是译为计算。为了区别,calculator译为计算器,computer译为计算机。
試著直覺理解四槓算子為何有結合律還沒有成果,好像一涉及 true & false 的 case analysis 就變得不太直覺,但這 case analysis 卻又是 classical logic 的重要特質(排中律?)。不過倒證明了 intuitionistic logic 上沒有
((p ↔ q) ↔ r) ↔ (p ↔ (q ↔ r))
這個性質(其中p ↔ q
是(p → q) ∧ (q → p)
的縮寫)─ 由此式可導出 Pierce’s law。但整個推導也就純粹是 natural deduction 硬做出來的,看不太出意義…愈來愈感受 intuitionistic logic 的直觀呀!XD
唔,似乎用不同字體看會變成三槓算子或四槓算子 XD。
對這三槓四槓我有一樣的疑問 囧…
想說要 google 四槓,結果貼出去變三槓
查了一下,U+2263 應該是四槓沒錯?怪哉
啊,我想要的是三槓的耶。跟 Algebra of Programming 裡面用的一樣。等下我改改看好了…
我也不知道有什麼「直覺理解」的方法。
p ≡ (q ≡ r)
可以想成是p
代表q
和r
是否是一樣的。但要牽連到(p ≡ q) ≡ r
除了分別討論一下p
是 true 或 false(也就等於是在看真值表了)之外好像也沒什麼好解釋。古典邏輯咩,要從語意上去理解的話就只有看真值表囉。
從
((p ↔ q) ↔ r) ↔ (p ↔ (q ↔ r))
到 Pierce’s Law 那個,有空寫給大家看吧?直覺邏輯是以簡御繁,每個 connective 就一到兩條 introduction 和 elimination rules. 演算邏輯規則可多了。但應用範圍不太一樣。例如
p1 ≡ p2 ≡ p3 ... ≡ pn
中,任何變數若出現奇數次就可以拿到只剩下一個,出現偶數次就變成 true,這種東西用演算邏輯就很容易看出來。其實我主要有興趣的原因是演算邏輯的許多規則和做 relational program derivation 用的規則是一樣的。例如
p ⇒ q
的定義是p ≡ p ∧ q
. 把⇒
換成⊆
,∧
換成∪
, 就是一條每次出現時我都覺得「怎麼會想到」的規則。於是我想如果我當初早點學會這個的話,後者可能會學得比較好…我寫了一份在這裡 (pdf)。因為 derivation trees 太寬了只好用橫式 A4… 雖然最終解釋應該不太可能避開真值表,但我另外導了一個看起來比較單純的等價式子,看看會不會比較容易解釋?
然後我發現我把 Peirce’s law 拼錯了 XD。
我相信 \wedge 是換成 \cap? 🙂
Oops.. 對!應該是
∩
.把
p, q, r
分別替換成A, ⊥, ⊥
呢?那會變成 ¬¬A ↔ A 嗎?(所以這是看出直覺邏輯的 ↔ 不應該滿足結合律的比較快的方法囉?)
Indeed!