第 十一 章 lisp 程式語言

18
1 LISP 十十十十 第第第 第第 [email protected] 第第第第第第

Upload: victoria-huber

Post on 30-Dec-2015

49 views

Category:

Documents


0 download

DESCRIPTION

第 十一 章 LISP 程式語言. 陳維魁 博士 [email protected] 儒林圖書公司. 大綱. 簡介 劍橋波蘭式 常見的函數 自定函式 控制結構 精選習題. 簡介. LISP(LISt Processing language) 發展於 1950 年代末期 主要是應用在人工智慧 (artificial intelligence) 的領域,又稱為人工智慧的低階語言 LISP 語言是以解譯器 (interpreter) 來處理其程式 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 十一 章  LISP  程式語言

1

第十一章 LISP 程式語言

陳維魁 博士[email protected]

儒林圖書公司

Page 2: 第 十一 章  LISP  程式語言

2

大綱

簡介 劍橋波蘭式 常見的函數 自定函式 控制結構 精選習題

Page 3: 第 十一 章  LISP  程式語言

3

簡介 LISP(LISt Processing language) 發展於 1950 年代末期 主要是應用在人工智慧 (artificial intelligence) 的領域,又

稱為人工智慧的低階語言 LISP 語言是以解譯器 (interpreter) 來處理其程式 基本的資料結構是 S- 運算式 (S-expression) ,其中 S- 運算

式又可區分為串列 (list) 與原子 (atom) 二種 採垃圾收集法 (garbage collection) 管理記憶體

垃圾收集法指的是系統會主動地收集程式中不再使用的記憶體空間

優點是減輕了程式設計師的負擔 缺點則是每次系統收集不再使用的記憶體往往費時過長,而

且不知何時會開始進行收集的動作 函數式程式語言

Page 4: 第 十一 章  LISP  程式語言

4

劍橋波蘭式

LISP 運算式的表示法採劍橋波蘭式 (Cambridge-polish form) ,即前置式加上括號

Page 5: 第 十一 章  LISP  程式語言

5

常見的函數 quote

對引數不作任何的處理,直接傳回引數的內容 setq

指定變數的值 set

指定變數的值 算術函數:

加法: plus ( + ) 減法: difference (-) 除法: quotient (/) 乘法: times (*)

Page 6: 第 十一 章  LISP  程式語言

6

常見的函數 car

(1) 作用:傳回引數的第一個元素 (2) 限制:引數必須是串列 (list) 且引數僅有一個 (3) 實例

(car ′(Pascal Prolog PL/1)) = Pascal 【注意:傳回的結果可能是原子或串列】

cdr (1) 作用:除去引數的第一個元素後,傳回剩下的串列 (2) 限制:引數必須是串列且引數僅有一個。 (3) 實例

(cdr ′(Pascal Prolog PL/1)) = (Prolog PL/1) 【注意:傳回的結果是一串列】

Page 7: 第 十一 章  LISP  程式語言

7

常見的函數 rplaca

將第一個引數的 car 以第二個引數的 car 替代 rplacd

將第一個引數的 cdr 以第二個引數的 cdr 替代 append

用法為 (append a1 a2 ... an) = (b1 b2 ... bn)其中 ai, 1 i n ,為串列 (list) ,而 bi, 1 i n ,則為 ai 去掉括號後之結果

cons 對二個參數作求值的動作,結果是把第一個引數加入

第二個引數中以形成新串列

Page 8: 第 十一 章  LISP  程式語言

8

常見的函數

length 計算參數的長度 (length '(A B C))=3

reverse 將參數反轉

Page 9: 第 十一 章  LISP  程式語言

9

自定函式 LISP 語言提供了使用者以

“ defun” 來自行定義函式。 自行定義的函式,結構包

含三個部分: (1) 函式名稱 (2) 型式參數串列 (3) 程式段

(defun 函式名稱 ( 型式參數串列 ) ( 程式段 ))

defun 提供的功能是將上述 (1) , (2) , (3) 連接在一起提供給使用者使用,並不會對 (1) , (2) , (3)中之任何一者作求值的動作

Page 10: 第 十一 章  LISP  程式語言

10

述句 LISP 語言測試條件的結構稱為述句 (predicate) LISP 語言常見的述句

atom :判斷參數是否為原子 (atom) listp :判斷參數是否為串列 (list) equal (e1 e2) :比較 e1 與 e2 member (e1 e2) :

限制: e2 必須是串列 (list) 。 作用:檢查 e1 是否為 e2 的一部分。 member 函數具有二個引數。其中第二個引數被限定為必須是個串列(list) 。 member 函數的功能是檢查第二個引數中是否出現第一個引數。若結果為真,則傳回在第二個引數中第一個引數出現的位置以後的部份,若結果為假,則傳回 nil

Page 11: 第 十一 章  LISP  程式語言

11

述句

LISP 語言常見的述句 plusp :判斷參數的值是否大於 0 minusp :判斷參數的值是否小於 0 zerop :判斷參數的值是否為 0 numberp : 判斷參數是否為數值 null :判斷參數是否為 nil greaterp e1 e2

若 e1>e2 ,則 t 若 e1<=e2 ,則 nil

Page 12: 第 十一 章  LISP  程式語言

12

述句

LISP 語言常見的述句 lessp e1 e2 :

若 e1<e2 ,則 t 若 e1>=e2 ,則 nil

and e1 e2 ... en :若 e1 、 e2 、 ... 、 en 全為 true ,則 t ,否則 nil

or e1 e2 ... en : e1 、 e2 、 ... 、 en 中若有一者為 true ,則 t ,否則 nil

not :若參數值為 nil 則結果為 t ,否則為 nil

Page 13: 第 十一 章  LISP  程式語言

13

LISP 語言的條件式

LISP 語言的條件式即為 cond 結構 cond 結構可以處理任意數目的參數,這些參數即稱為 cond 子句

每個 cond 子句由一連串的 S 運算式所組成 cond 子句由二個部份所組成

第一個部份是要測試的條件 第二個部份則是測試的條件成立時必須執行之部份

Page 14: 第 十一 章  LISP  程式語言

14

LISP 語言的條件式

語法 ( cond

( 條件 1 Exp1) ( 條件 2 Exp2) ( 條件 3 Exp3) ....... ( 條件 n Expn))

Page 15: 第 十一 章  LISP  程式語言

15

精選習題

LISP 程式如下,其作用為何? (defun xxx(S))

(cond ((null S) 0) ((atom S) 1) (t (plus (xxx (car S)) (xxx (cdr S))))))

Page 16: 第 十一 章  LISP  程式語言

16

精選習題

試簡述下列 LISP 函數 f 的功能,並舉例說明之

(defun f(lst) (cond ((null lst) nil) ((atom lst)(list lst)) (t(append(f(car lst))(f(cdr lst)))))

Page 17: 第 十一 章  LISP  程式語言

17

精選習題

試簡述下列 LISP 函數 g 的功能,並舉例說明之

(defun g(list) (cond ((null list)nil) (t (append (g(cdr list)) ((cons(car list)nil))))))

Page 18: 第 十一 章  LISP  程式語言

18

精選習題

試簡述下列 LISP 函數 STRANGE 的功能,並舉例說明之

(defun STRANGE(L) (cond ((null L) nil) ((atom L) L) (t (cons (STRANGE (car L)) (STRANGE (CDR L))))))