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