第 十一 章 lisp 程式語言
DESCRIPTION
第 十一 章 LISP 程式語言. 陳維魁 博士 [email protected] 儒林圖書公司. 大綱. 簡介 劍橋波蘭式 常見的函數 自定函式 控制結構 精選習題. 簡介. LISP(LISt Processing language) 發展於 1950 年代末期 主要是應用在人工智慧 (artificial intelligence) 的領域,又稱為人工智慧的低階語言 LISP 語言是以解譯器 (interpreter) 來處理其程式 - PowerPoint PPT PresentationTRANSCRIPT
2
大綱
簡介 劍橋波蘭式 常見的函數 自定函式 控制結構 精選習題
3
簡介 LISP(LISt Processing language) 發展於 1950 年代末期 主要是應用在人工智慧 (artificial intelligence) 的領域,又
稱為人工智慧的低階語言 LISP 語言是以解譯器 (interpreter) 來處理其程式 基本的資料結構是 S- 運算式 (S-expression) ,其中 S- 運算
式又可區分為串列 (list) 與原子 (atom) 二種 採垃圾收集法 (garbage collection) 管理記憶體
垃圾收集法指的是系統會主動地收集程式中不再使用的記憶體空間
優點是減輕了程式設計師的負擔 缺點則是每次系統收集不再使用的記憶體往往費時過長,而
且不知何時會開始進行收集的動作 函數式程式語言
4
劍橋波蘭式
LISP 運算式的表示法採劍橋波蘭式 (Cambridge-polish form) ,即前置式加上括號
5
常見的函數 quote
對引數不作任何的處理,直接傳回引數的內容 setq
指定變數的值 set
指定變數的值 算術函數:
加法: plus ( + ) 減法: difference (-) 除法: quotient (/) 乘法: times (*)
6
常見的函數 car
(1) 作用:傳回引數的第一個元素 (2) 限制:引數必須是串列 (list) 且引數僅有一個 (3) 實例
(car ′(Pascal Prolog PL/1)) = Pascal 【注意:傳回的結果可能是原子或串列】
cdr (1) 作用:除去引數的第一個元素後,傳回剩下的串列 (2) 限制:引數必須是串列且引數僅有一個。 (3) 實例
(cdr ′(Pascal Prolog PL/1)) = (Prolog PL/1) 【注意:傳回的結果是一串列】
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 對二個參數作求值的動作,結果是把第一個引數加入
第二個引數中以形成新串列
8
常見的函數
length 計算參數的長度 (length '(A B C))=3
reverse 將參數反轉
9
自定函式 LISP 語言提供了使用者以
“ defun” 來自行定義函式。 自行定義的函式,結構包
含三個部分: (1) 函式名稱 (2) 型式參數串列 (3) 程式段
(defun 函式名稱 ( 型式參數串列 ) ( 程式段 ))
defun 提供的功能是將上述 (1) , (2) , (3) 連接在一起提供給使用者使用,並不會對 (1) , (2) , (3)中之任何一者作求值的動作
10
述句 LISP 語言測試條件的結構稱為述句 (predicate) LISP 語言常見的述句
atom :判斷參數是否為原子 (atom) listp :判斷參數是否為串列 (list) equal (e1 e2) :比較 e1 與 e2 member (e1 e2) :
限制: e2 必須是串列 (list) 。 作用:檢查 e1 是否為 e2 的一部分。 member 函數具有二個引數。其中第二個引數被限定為必須是個串列(list) 。 member 函數的功能是檢查第二個引數中是否出現第一個引數。若結果為真,則傳回在第二個引數中第一個引數出現的位置以後的部份,若結果為假,則傳回 nil
11
述句
LISP 語言常見的述句 plusp :判斷參數的值是否大於 0 minusp :判斷參數的值是否小於 0 zerop :判斷參數的值是否為 0 numberp : 判斷參數是否為數值 null :判斷參數是否為 nil greaterp e1 e2
若 e1>e2 ,則 t 若 e1<=e2 ,則 nil
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
13
LISP 語言的條件式
LISP 語言的條件式即為 cond 結構 cond 結構可以處理任意數目的參數,這些參數即稱為 cond 子句
每個 cond 子句由一連串的 S 運算式所組成 cond 子句由二個部份所組成
第一個部份是要測試的條件 第二個部份則是測試的條件成立時必須執行之部份
14
LISP 語言的條件式
語法 ( cond
( 條件 1 Exp1) ( 條件 2 Exp2) ( 條件 3 Exp3) ....... ( 條件 n Expn))
15
精選習題
LISP 程式如下,其作用為何? (defun xxx(S))
(cond ((null S) 0) ((atom S) 1) (t (plus (xxx (car S)) (xxx (cdr S))))))
16
精選習題
試簡述下列 LISP 函數 f 的功能,並舉例說明之
(defun f(lst) (cond ((null lst) nil) ((atom lst)(list lst)) (t(append(f(car lst))(f(cdr lst)))))
17
精選習題
試簡述下列 LISP 函數 g 的功能,並舉例說明之
(defun g(list) (cond ((null list)nil) (t (append (g(cdr list)) ((cons(car list)nil))))))
18
精選習題
試簡述下列 LISP 函數 STRANGE 的功能,並舉例說明之
(defun STRANGE(L) (cond ((null L) nil) ((atom L) L) (t (cons (STRANGE (car L)) (STRANGE (CDR L))))))