樹莓 λ 者程式探源

《鹿柴》詩意圖(吳子玉繪)

王維
鹿柴
空山不見人,
但聞人語響。
返景入深林,
復照青苔上。

一件事如果沒有它發生之理,那它能夠發生的嗎?假使那事果然都不發生,又如何能夠得到那個發生之理?這就是『事、理不二』的道理,發生之事蘊有發生之理,發生之理緣起發生之事。那『空山樹倒』是否是發生了一件事呢?假使有人砍了你的『櫻桃樹』又是不是發生了一件事的呢??也許『世間事』的『聞問與否』,決之於『關不關心』,通常愈在意卻愈心煩意亂!!

220px-Babbages_difference_engine_1832

240px-Analytical_Engine_(2290032530)

200px-Ada_lovelace

英國數學家、發明家兼機械工程師查爾斯‧巴貝奇 Charles Babbage 曾在劍橋大學擔任『盧卡斯數學教授席位』。一八三七年提出了『差分機』和『分析機』的設計概念,是一種『機械式通用計算機』,被視為是電腦先驅。巴貝奇最初的嘗試是『差分機』,用來計算對數與三角函數,以及求解多項式的近似值。由於他意識到需要一種更加『通用的』機器,於是便開始了『分析機』的設計︰

分析機由蒸汽機驅動,大約有三十米長十米寬。使用打孔紙帶作為輸入,採取十進位計數制。它的『記憶體』大約可以儲一千個五十位數的十進制數值。它有一個『算術單元』可以進行四則運算、比較大小和求平方根之操作。巴貝奇為這台機器設計的語言類似於現今的『組合語言』,並且被認為具有『圖靈完備性』。
英國大詩人拜倫的女兒愛達‧勒芙蕾絲 Ada Lovelace 曾設計了巴貝奇分析機上計算『伯努利數』──
B_n =_{df} \sum_{k=0}^{m-1} k^n = 0^n + 1^n + 2^n + \cdots + {(m-1)}^n,其中 n 是自然數。
── 的程式。她為此還建立了『迴圈』和『子程式』的『開創性』概念。由於她在程式設計上的作為,後人稱為『世界上第一位程式設計師』。

到底『程式』是什麼呢?假使『廣義』的講是恰當的話,所謂的『食譜』就是『做菜的程式』。因此寫的『』的食譜,也就是『表達清晰』、『步驟清楚』而且『程序簡潔』,使得人們能夠『依樣畫葫蘆』之程式章法。即使將『程式』限定在『計算機』裡,使用特定的『程式語言』,上面的說法依然適用。也就是說『樹莓 λ 者』只能使用『純 λ 語言』來表達『一切概念』,故而『面對問題』將之『程式化』時,會有多個『思考階段』──

分析問題,提出方法
如何用 λ 表達式表徵這個解法
資料與資料結構編解方式
寫作 λ 程式
測試與除錯 λ 程式
建立好的概念庫藏,以利重複使用
… 或心有靈犀

俗話說︰巧婦難為『無米之炊』;大廚能作『雜碎之炒』。講的就是『程式心法』,所謂『功深,藝自成』。將要如何能夠『水到渠成』的呢?祇在平日『功夫深』又有『源泉活水來』!!這就像是講『應用程式』和『程式學理』難到不該是『一車雙輪』與『一體兩面』缺一不可的嗎??

ENCODE_logo
基因編碼計畫

HandBrake
開源影音轉碼程式

ASCII_Code_Chart-Quick_ref_card
ASCII 字元編碼表

現今使用的  ASCII American Standard Code for Information Interchange 美國資訊交換標準代碼,最早發布於一九六七年,是基於拉丁字母的一套電腦編碼系統。然而為什麼需要編碼的呢?由於人類的語言就是大自然中人事物的『符號』,也就是一種編碼。那麼要如何將這些『符號』用『數位計算機』的 01 的序列 010010  \cdots 001 來『表達』的呢?假使說沒有一種『約定』,那麼『0』是指『自然數‧ 0』、『邏輯‧假』還是『沒有錯誤‧代碼』的呢??因此 ASCII 用『八位元』可有二百五十六個『可能編碼』來規定二十六個基本『拉丁字母』 、『阿拉伯數字』、『英文標點符號』和『終端機 ESC 控制碼』,至今一共定義了一百二十八個碼,卻連英語『重音符號』都沒有!!其中『符號‧0』的編碼是 0011 0000;『符號‧1』的編碼是 0011 0001

因為『 ASCII 』碼的『美語侷限性』,現今逐漸轉向使用『萬國碼』Unicode 的時代。當然『編碼概念』遠大於此,比方說『音樂的 mp3 編碼』原先的目的是『壓縮聲音檔案大小』,減少儲存所需要的空間,由於播放結果不會『感覺失真』,彷彿『原音重現』 ,以至於反倒『成了標準』!與之對應的『 mp3 解碼播放器』因此也就『大行其道』的了!!無怪乎老子有言︰無名天地之始,有名萬物之母

假使我們規定『大於十』的邱奇自然數,當作『變數編碼』,這裡有這一小段的 Lambda Calculator 字典定義︰

十 [SUCC 9] = \f.\x.f (f (f [f (f (f {f (f (f [f x]))}))]))
x [SUCC 十] = \f.\x.f (f (f [f (f (f {f (f (f [f (f x)]))}))]))
y [SUCC x] = \f.\x.f (f (f [f (f (f {f (f (f [f (f (f x))]))}))]))
z [SUCC y] = \f.\x.f (f (f [f (f (f {f (f (f [f (f (f {f x}))]))}))]))
VAR? [\n. > n 十] = \n.n (\g.\h.h (g [\i0.\i1.i1 (i0 (\i2.\i3.i3 {i2 (\i4.\i5.i5 (i4 [\i6.\i7.i7 (i6 (\i8.\i9.i9 {i8 (\i10.\i11.i11 (i10 [\i12.\i13.i13 (i12 (\i14.\i15.i15 {i14 (\i16.\i17.i17 ( … ))]))]))])

VAR?x

VAR?9

VAR? \ n』是問 n 是『變數』的嗎?請參考左圖的化約。那麼在這個想法上,假使用著『有序對(變數,賦值),是否能夠發展『變數 := 賦值』的系統呢?

雖然『 λ』不是『黏巴達』,然而何紡有時 Lambda Lambda 一下,作一作『頭腦體操』,玩味玩味『寫程式』的『甘苦』 ,以及解決問題之『樂趣』!!