420 likes | 1.93k Views
計算機概論 第二版. Foundations of Computer Science Chapter 17 計算理論. 17.1 簡易語言. 我們定義一個僅有三種敘述的程式語言: 遞增敘述 ( increment statement )、 遞減敘述 ( decrement statement )及 迴圈敘述 ( loop statement )(圖 17.1 ),在這程式語言當中,我們只使用非負整數資料型態。. 圖 17.1 簡易語言中的敘述. p.404. 遞增敘述
E N D
計算機概論 第二版 Foundations of Computer Science Chapter 17 計算理論
17.1 簡易語言 • 我們定義一個僅有三種敘述的程式語言:遞增敘述(increment statement)、遞減敘述(decrement statement)及迴圈敘述(loop statement)(圖 17.1),在這程式語言當中,我們只使用非負整數資料型態。 圖 17.1簡易語言中的敘述 p.404
遞增敘述 • 遞增敘述(increment statement)將變數值加 1,敘述格式如演算法 17.1 所示。 遞減敘述 • 遞減敘述(decrement statement)將變數值減 1,敘述格式如演算法 17.2 所示。 演算法 17.1 遞增敘述 incr (X) 演算法 17.2 遞減敘述 decr (X) p.404
迴圈敘述 • 迴圈敘述(loop statement)在變數值不為 0 時,會重複一個動作(或一連串動作),敘述格式如演算法 17.3 所示。 演算法 17.3 迴圈敘述 while (X) { decr (X) Body of the loop } p.405
簡易語言的能力 • 我們可以證明這種僅有三種敘述的簡易程式語言即使不如現今使用的其他複雜程式語言(例如:C 語言)那麼有效率,但也具備了相同的能力。 簡易語言中的巨集 • 巨集〔巨大指令(macroinstruction)的簡寫〕是在高階語言中的指令等同於該種程式語言的一或多個正常指令的特定組合。 p.405
第一巨集:X ← 0 • 演算法 17.4 顯示如何使用簡易語言中的敘述將 0 設定給變數X,有時候稱此巨集為清除變數。 演算法 17.4 巨集 X ← 0 while (X) { decr (X) } p.405
第二巨集:X ← n • 演算法 17.5 顯示如何使用簡易語言中的敘述將正整數 n 設定給變數 X,首先將變數 X 清除,再將 X 遞增 n 次。 演算法 17.5 巨集 X ← n X ← 0 incr (X) incr (X) … incr (X) //重複n次incr(X) p.406
第三巨集:Y ← X • 演算法 17.6 模擬簡易語言巨集 Y ← X。請注意,我們可以額外使用一行指令來還原 X 的值。 演算法 17.6 巨集 Y ← X Y ← 0 while (X) { decr (X) incr (Y) } p.406
第四巨集:Y ← Y + X • 演算法 17.7 模擬簡易語言巨集 Y ← Y + X,我們可以再次使用額外的指令來還原 X 的值。 演算法 17.7 巨集 Y ← Y + X while (X) { decr (X) incr (Y) } p.406
第五巨集:Y ← Y × X • 演算法 17.8 模擬簡易語言巨集 Y ← Y × X,我們可以使用加法巨集,因為整數乘法可用重複的加法來模擬。注意我們必須儲存 X 的值在暫時變數中,因為在每次加法我們需要將 X 的原始值與 Y 相加。 演算法 17.8 巨集 Y ← Y × X TEMP ← Y Y ← 0 while (X) { decr (X) Y ← Y + TEMP } p.406
第六巨集:Y ← YX • 演算法 17.9 模擬簡易語言巨集 Y ← YX,我們使用乘法巨集來模擬,因為整數的指數次方可用重複的乘法來模擬。 演算法 17.9 巨集 Y ← YX TEMP ← Y Y ← 1 while (X) { decr (X) Y ← Y × TEMP } p.407
第七巨集:if X then A • 演算法 17.10 模擬簡易語言的第七巨集,此巨集模擬現代程式語言的決策判斷(decision-making)敘述(if)。在這巨集中,變數 X 的值只能是 0 或 1,如果 X 的值不是 0,則 A(一個行動或者一系列行動)將被執行。 演算法 17.10 巨集 if X then A while (X) { decr (X) A } p.407
17.2 圖靈機器 • 圖靈機器(Turing machine)是在西元 1936 年由 Alan M. Turing 提出,用來解決可計算問題,它是現代電腦的基礎。 • 一部圖靈機器由三個元件所組成:磁帶(tape)、控制器(controller)和讀∕寫頭(read/write head)。 圖 17.2圖靈機器 p.408
磁帶 • 雖然現代電腦具有有限容量的隨機存取儲存設備,但我們假設圖靈機器的記憶體是無限的。磁帶(tape)在任何時間會保有機器所能接受的字元集中的一連串字元。 • 一元算術(unary arithmetic)表示法的正整數資料,在這種算術表示法中,正整數由 1 的個數來表示。 圖 17.3圖靈機器的磁帶 p.408
讀∕寫頭 • 讀∕寫頭(read/write head)隨時指向磁帶上的一個符號,我們把這個符號叫做目前的符號(current symbol)。 控制器 • 控制器(controller)是現代電腦的中央處理單元(CPU)的理論複製品,它是一個具有事先定義狀態個數並會依據輸入從一狀態移至另一狀態的有限狀態自動機器(finite state automaton)。在任何時間,此機器僅能停留在某一狀態(states)。 p.409
圖 17.4圖靈機器的狀態轉換圖 p.409
表 17.1轉換表 這些指令將每列的五個欄位值結合在一起,此基本機器只有六個指令: p.410
簡易語言的模擬 遞增敘述 • 控制器有四種狀態:S1到 S4。S1是開始狀態,S2是右移狀態,S3是左移狀態,S4是靜止狀態。如果機器到達靜止狀態將停止運作:沒有任何指令從此狀態出發。 圖 17.5圖靈機器的遞增敘述(incr X) p.410
遞減敘述 • 遞減敘述(decr X)與遞增敘述類似,圖 17.6 顯示圖靈機器的遞減敘述(decr X)及程式。 圖 17.6圖靈機器的遞減敘述(decr X) p.411
圖 17.7圖靈機器的 while 迴圈敘述 p.411
丘奇—圖靈論題 如果存在一演算法可執行符號處理工作,則存在一圖靈機器可完 成此一工作。 p.412
17.3 高第數字 • 在電腦科學理論,一個不具正負號的數字可以使用在任何程式語言寫成的程式中,這樣的數字稱為高第數字(Gödel number,以奧地利數學家 Kurt Gödel 命名)。 • 優點如下:首先,程式能夠被視為單一的資料項目輸入到其他程式。第二,程式能夠以它的整數代表型式被參照。第三,由於它能顯示出問題的總數遠大於所有能夠寫出的程式總數,因此這種數字能夠用來證明有些問題無法利用電腦解決。 p.412
表 17.2簡易語言的符號編碼 p.413
表示一個程式 • 使用表 17.2,我們可以一個正整數來表示任何使用簡易語言撰寫的程式,步驟如下: 1. 用表內的十六進位編碼取代對應的符號。 2. 將所得的十六進位數字以無正負號的整數來表示。 p.413
範例17.1 程式 incr X 的高第數字為何? 解答 用對應的十六進位編碼取代每一個符號。 所以這個程式就以 175 來表示。 incr X → (AF)16 → 175 p.413
解讀一個數字 • 要證明這種數字系統是唯一的,我們可以依照以下步驟來解讀一個高第數字: 1. 將數字轉換為十六進位。 2. 用表 17.2,將十六進位數字(hexadecimal digit)以對應的符號呈現出來(忽略 0)。 p.413
17.4 當機問題 一個古老的程式設計問題: 當機問題是無法解決的 • 電腦科學家對測試程式不存在且永遠不存在的取代說法是:「當機問題(halting problem)無法解決。」我們使用反證法(proof by contradiction)來證明,有以下三個步驟。 是否能夠寫出一個程式用來測出以高第數字呈現的程式是否會停止執行? p.414
步驟 1 • 我們假設存在一個稱為 Test 的程式,它能夠接受任何程式(例如以高第數字呈現的 P)做為它的輸入,並輸出 1 或 0。假如 P 可停止,那麼 Test 的輸出為 1。假如 P 無法停止,則Test 的輸出為 0(圖 17.8)。 圖 17.8證明步驟 1 p.414
步驟 2 假如P 停止,Strange 程式不停止。 假如P 不停止,Strange 程式停止。 圖 17.9證明步驟 2 p.415
步驟 3 • 現在有了 Strange 程式,我們使用程式本身作為輸入(即它的高第數字)對程式進行測試。這樣做是合法的,因為我們並未給予 P任何限制,圖 17.10 顯示這個情況。 圖 17.10證明步驟 3 p.416
17.5 問題複雜度 • 一般在電腦科學中,問題可以分成兩大類:可以解決的問題(solvable problems)和無法解決的問題(unsolvable problems)。可以解決的問題本身又分成兩類:多項式問題(polynomial problems)和非多項式問題(non-polynomial problems)。 圖 17.11問題的分類 p.416
可以解決的問題 • 電腦可以解決許多問題,但是我們經常想知道電腦要花多少時間解決某個問題,也就是說,某個程式的複雜度如何? • 程式的複雜度可以用不同的方式得知,例如執行所需時間、所需的記憶體等。一個方式是執行時間:執行一個程式要花費多長的時間? 大寫 O 符號 • 以今日的電腦速度而言,我們並不在意確切的數量,在意的是數量的等級。這種效率簡化稱為大寫 O 符號(big-O notation),要使用這個符號,並不需要深入瞭解其真正定義及計算過程。在這個符號裡,指令敘述的數量將是輸入數量的函數。 p.417
多項式問題 • 如果一個程式具有 O(log n)、O(n)、O(n2)、O(n3)、O(n4)、或O(nk)(k 為常數)的複雜度,則稱此程式為多項式(polynomial)。以今日的電腦速度而言,如果輸入數量是一個合理數字(例如:1000 至 1 百萬),我們可以解決多項式問題(polynomial problems)。 非多項式問題 • 如果程式的複雜度大於多項式,例如:O(10n) 或 O(n!),則只有在輸入數量很小(小於 100)時才能夠解決問題。如果輸入數量很大,則我們得坐在電腦前數個月,才可以得到非多項式問題(non-polynomial problems)的解決結果。 p.417