指令系統

[拼音]:LISP yuyan

[英文]:LISP

為非數值符號運算而設計的表處理語言。LISP是英文LIST PROCESSING(表處理)的縮寫。 LISP語言是1960年J.麥卡錫在遞迴函式論基礎上首先設計出來的。LISP語言的形式化程度高,表達力強,適合於描述各種知識和編寫問題求解的程式,因此一直是用來研究人工智慧的一種基本語言。

資料結構

自然語言中詞可以認為是能單獨用來構成句子的最小單元,由詞可以構成片語,由片語可以構成更復雜的片語或句子。LISP語言的“詞”稱為原子,如15(數值原子)、IFAC(非數值原子)。LISP語言的“片語”就是由一組原子構成的有一定形式的表,如(A-KIND-OF FEDERATION)。表和原子可以組成更復雜的表稱為符號表達式(相當於複雜片語)如 (IFAC(A-KIND-OF FEDERATION))。

程式結構

符號表達式不但是LISP語言的資料結構形式而且也是它的程式結構形式,也就是說符號表達式可以代表一個語句,即一段程式。這種資料結構和程式結構在格式上的一致性是LISP語言的顯著特點。從語義角度考慮:對符號表達式求值的函式稱為EVAL。求值也可用簡式表出,記為“符號表達式⇒值”。求值規則如下:

(1)數字、T(真)、NIL(假,空表)的值就是自身。

(2)如果符號表達式是表,且表的第一元素是函式,那麼首先求出其他元素的值,然後對函式求值,如(PLUS(TIMES3 5)2)⇒17。

(3)對以保留詞形式出現的函式,其值完全取決於保留詞的意義。如 (SETQ X (PLUS 15 1))即對X賦予16的值(SETQ是對原子賦值的意思)。

(4)如果符號表達式是一原子,那麼其值就是最近賦予的值。

符號表達式的基本操作

如果符號表達式是一個複雜的表,對其操作可歸結為取、刪、添、並、組合等。為了防止EVAL將所有表的第一元素都看成函式,引入符號“”,表示對緊隨“”後的表或其他符號表達式不求值。也可用函式QUOTE來實現同樣的目的。例如:

(CAR(ABC))⇒A

CAR表示取表的首元素

(CDR(ABC))⇒(BC)

CDR表示刪去表的首元素

(CONSA(BC))⇒(ABC)

CONS表示在表中添入新的首元素

(APPEND(AB)(CD))⇒(ABCD)

APPEND表示將兩表合併為一

(LISTAB(CD))⇒A(AB(CD))

LIST表示將各元素列入表中作為簡例,下面給出用LISP語言寫的求表 L中各數之和的程式,例如L=(7,5,3,0),則SUM(和)之值為15。

PROG (SUM)

(SETQ SUMφ)

LOOP (COND ((NULL L)(RETURN SUM)))

(SETQ SUM (PLUS SUM (CAR L)))

(SETQ L (CDR L))

(GO LOOP)

這段程式的含義是:用PROG引入分程式,它的區域性變元是SUM,賦予SUM的初值是零(φ),迴圈:條件是,如果L等於空表,則返回SUM的值,

否則

將SUM原來值與表L首元素值之和賦予SUM,

將表L刪去首元素後的值賦予表L,

繼續迴圈

使用者自定義函式

LISP語言的使用者自定義函式常用LAMBDA表示式給出,其一般形式為(LAMBDA(atom 1,atom2,…,atom k)e),LAMBDA 之後是一形式引數表,e是有待求值表示式的LISP形式。函式呼叫時,對所有形式引數賦予實在引數的值,然後對函式體 e求值。函式定義的 LAMBDA記法是 J.麥卡錫根據 A.丘奇的 λ演算理論引入程式設計語言的。LAMBDA是希臘字母λ的英語拼音。這種記法有助於函式定義精確化,是LISP語言中定義非基本函式的普遍方法。例如使用者可自行定義一新函式 EXCHANGE(交換):EXCHANGE=(LAMBDA(Y)(LIST(CADR Y)(CAR Y)))。這樣(EXCHANGE(AB))的值便是(BA),定義中CADR為先作CDR後作CAR兩次函式運算的簡寫形式。因此,LISP程式的執行可歸結為函式求值,LISP語言是一種函式型程式設計語言。這是70年代發展起來的新型程式設計語言。LISP語言的函式定義方式允許被定義函式間相互呼叫,也允許直接或間接地呼叫自身(稱為遞迴)。下面是一個定義階乘(!)函式的遞迴程式例子。FACTORIAL:(LAMBDA (N) (COND (EQUAL N 1)1)

(T (TIMESN

(FACTORIAL

(SUB1 N)))))

由於在函式體中出現被定義函式 FACTORIAL,所以這個定義是遞迴的。LISP語言兼有遞迴和迭代(見上例PROG)的功能,具有較強的表達力和較大的靈活性。LISP還可用於邏輯程式設計。用於邏輯程式設計的、擴充套件的LISP語言稱為LOGLISP,它的功能與PROLOG等價。

LISP語言有很多變種,但最基本的是LISP1.5,比較著名的還有MACLISP,INTERLISP等。

參考書目

Winston,Horn著,黃昌寧、陸玉昌譯:《LISP程式設計》,清華大學出版社,北京,1983。(P.H.Winston and B.K.P.Horn,Lisp,Addison-Wesley Publ. Co.,Reading,Mass.,1981.)