|
課程名稱 |
程式語言:命令程式設計 Programming Languages: Imperative Program Construction |
|
開課學期 |
113-1 |
|
授課對象 |
管理學院 資訊管理學系 |
|
授課教師 |
穆信成 |
|
課號 |
IM5065 |
|
課程識別碼 |
725EU3930 |
|
班次 |
|
|
學分 |
3.0 |
|
全/半年 |
半年 |
|
必/選修 |
選修 |
|
上課時間 |
星期四2,3,4(9:10~12:10) |
|
上課地點 |
管一101 |
|
備註 |
本課程以英語授課。 總人數上限:70人 外系人數限制:20人 |
|
|
|
|
課程簡介影片 |
|
|
核心能力關聯 |
本課程尚未建立核心能力關連 |
|
課程大綱
|
|
為確保您我的權利,請尊重智慧財產權及不得非法影印
|
|
課程概述 |
課程大綱、講義、習題等將於課程網頁更新:
https://scmu.github.io/plip/
===========
「命令」(imperative) 程式語言意指把程式視為「給電腦一個個指令」的語言。我們常用的 C, Python, Java 等語言都可歸屬在此類別下。這類程式語言中,該怎麼寫程式、該怎麼證明程式的正確性?
本課程為「程式語言(Programming Languages)」系列課程之一,著眼點並不是教特定程式語言,而是討論設計程式解決問題的思考方式、設計程式使用的數學與邏輯基礎、以及程式語言與形式符號在其中扮演的角色。本課程以命令程式為主角,其核心概念包括:
* 程式語言是一種形式語言,作為思考的工具。我們用程式語言表達概念,也用程式語言中的形式規則檢驗程式的正確性。
*「寫程式」不只是把程式碼生出來的動作 --- 我們還得確定程式是「對」的。而確定程式正確的唯一方法是證明。
* 「程式推導」:由問題的規格開始,一邊推導出解決該問題的程式,一邊做該程式為何正確的證明。
* 當我們不知一個程式該怎麼寫,「這個程式該怎麼證明」這件事可以反過來透露一些「這個程式該怎麼寫」的提示。
* 「寫程式」是一個數學行為。
* 為了討論使用指標的程式,我們發明了相對應的「分離邏輯」,藉以證明這類程式的正確性。
本課程將討論的具體工具包括
* Dijkstra 的 Guarded Command Language.
* 命題邏輯 (propositional logic)、一階邏輯 (first-order logic)
* Hoare Logic.
* The "weakest precondition" predicate transformer.
* Separation logic.
本課程與「程式語言:函數程式設計」有可呼應之處,但兩者都可獨立修習。本課程亦與「軟體規格與驗證(Software Specification and Verification)」非常相關:命題邏輯、Hoare Logic, predicate transformer 等都是兩堂課共同的元素。該課程談驗證 (verification), 本課程則較注重推導(derivation),有較多手動計算與演算法問題的推導,而不會嚴謹地談到語意、函數呼叫、concurrency 等課題。 |
|
課程目標 |
將嚴謹的、形式化的邏輯思考帶入程式設計中。訓練學生由問題的規格開始,一邊推導出解決該問題的程式,一邊做該程式為何正確的證明。由此培養對於程式正確性的要求、對於「程式設計是什麼」提出一個不同的觀點。 |
|
課程要求 |
本課程並非程式設計入門課程。適合選修本課程之學生應:
* 能以指令式語言(C, Java, Python... etc)撰寫簡單的程式,對此類語言的控制結構有基本熟悉度,
* 有基本數學能力,對用紙筆進行的算式演算不會恐懼,
* 對於以形式邏輯思考解決問題、用數學方法證明程式的正確性有興趣。 |
|
預期每週課前或/與課後學習時數 |
|
|
Office Hours |
另約時間 |
|
指定閱讀 |
待補 |
|
參考書目 |
Backhouse, Roland. Program Construction: Calculating Implementations from Specifications. Wiley, 2003.
Dijkstra, Edsger W. A Discipline of Programming. Prentice Hall, 1976.
Dijkstra, Edsger W. and Scholten, Carel S. Predicate Calculus and Program Semantics. Springer-Verlag, 1990.
Gries, David. The Science of Programming. Springer-Verlag, 1981.
Kaldewaij, Anne. Programming - the Derivation of Algorithms. Prentice Hall, 1990.
Morgan, Carroll. Programming from Specifications, Second Edition. Prentice Hall, 1994. |
|
評量方式 (僅供參考) |
|
No. |
項目 |
百分比 |
說明 |
|
1. |
期中、期末考 |
100% |
僅採計期中考、期末考成績,比率機動調整(例:高分者60%, 低分者40%)。 |
2. |
|
0% |
出席不計。
課堂中將發習題,但學生應為印證課堂內容而做習題,不計入學期分數。 |
|
|
週次 |
日期 |
單元主題 |
|
第1週 |
9/05 |
概論 Introduction
Guarded Command Language, Hoare Logic, and Weakest Precondition.
- 設值 Assignment.
|
|
第2週 |
9/12 |
Guarded Command Language, Hoare Logic, and Weakest Precondition.
- 條件判斷 Conditional Branching, 最弱前提 Weakest Precondition. |
|
第3週 |
9/19 |
命題邏輯 Propositional Logic. |
|
第4週 |
9/26 |
命題邏輯 Propositional Logic. |
|
第5週 |
10/03 |
量詞 Quantifications. |
|
第6週 |
10/10 |
(假日) |
|
第7週 |
10/17 |
迴圈與恆式 Loops and Loop Invariants. |
|
第8週 |
10/24 |
期中考 Mid-Term Exam. |
|
第9週 |
10/31 |
迴圈建構一般技巧 General Loop Construction.
- 合取拆恆式 Taking Conjuncts as Invariants
- 設值與代換 Assignment and Substitutions |
|
第10週 |
11/07 |
迴圈建構一般技巧 General Loop Construction.
- 常數換變數 Replacing Constants by Variables |
|
第11週 |
11/14 |
迴圈建構一般技巧 General Loop Construction.
- 增強恆式 Strengthening the Invariant |
|
第12週 |
11/21 |
迴圈建構一般技巧 General Loop Construction.
- 增強恆式 Strengthening the Invariant |
|
第13週 |
11/28 |
迴圈建構一般技巧 General Loop Construction.
- 利用結合律 Associative Invariants
Case Study.
- 快速除法 Fast Division.
- 二元搜尋 Binary Search. |
|
第14週 |
12/05 |
陣列操作 Array Manipulation.
陣列元素交換 Swaps in Arrays. |
|
第15週 |
12/12 |
分離邏輯 Separation Logic. |
|
第16週 |
12/19 |
期末考 Final Exam。 |
|