|
LISP是最早和最重要的符號處理編程語言之一,它于1958年由美國的J. McCarthy提出,并于1960年發(fā)表了他的第一篇關(guān)于LISP的論文。之后,LISP很快受到人工智能工作者的歡迎,獲得廣泛應(yīng)用。LISP是LISt Processing(表處理)的縮寫。 10.2.1 LISP的特點和數(shù)據(jù)結(jié)構(gòu) 1.LISP語言具有下列特點: (1)主要數(shù)據(jù)結(jié)構(gòu)是表(符號表達式),而不是作為算術(shù)運算對象的數(shù)。 (2)特性表簡單,便于進行表處理。 (3)最主要的控制結(jié)構(gòu)為遞歸,適于過程描述和問題求解。 (4)LISP程序內(nèi)外一致,全部數(shù)據(jù)均以表形式表示。 (5)能夠產(chǎn)生更復雜的函數(shù)和解釋程序。 (6)對大多數(shù)事物的約束發(fā)生在盡可能晚的時刻。 (7)數(shù)據(jù)和過程都可以表示成表使得程序可能構(gòu)成一個過程并執(zhí)行這個過程。 (8)大多數(shù)LISP系統(tǒng)可以交互方式運行,便于開發(fā)各類程序,包括交互程序。 2.數(shù)據(jù)結(jié)構(gòu) 在基本LISP中,僅有一種數(shù)據(jù)類型,即表結(jié)構(gòu)。大多數(shù)LISP程序設(shè)計中,數(shù)據(jù)是以表或者原子為專門形式。 原子:原子是LISP中最小的符號單位。原子有標識符,諸如I AM A STUDENT,3,XYZ,或者NIL等。它們沒有組合部分,各種性質(zhì)或?qū)傩钥筛郊拥絾蝹€原子上。 一個原子最重要的屬性除其名字外是值,這與變量有值同義。一些原子有標準值:原子NIL的值是NIL,T的值是T。任何數(shù)字原子,其相應(yīng)的整數(shù)或浮點數(shù)是它的值。這里要注意,原子不是"類型",任何原子,除常數(shù)外,可以給予任意值。 表:一個表遞歸地定義為括號內(nèi)零個或n個元素的序列: (元素1 … 元素n) 其中每一個元素是一個原子或是一個表。零或者空表寫成(),或者NIL。NIL既是原子又是表。表的固有遞歸結(jié)構(gòu)非常靈活,便于表示各種信號。例如: (4 6 7 9 14 17 20 24 76)一組數(shù) ((-B)+(SQRT((B*B)-(4*A*C))))代數(shù)表達式 (I(know((that(gasoline can))explode)))語法分析句子 (YELLOW TABLE)斷言 (AND(ON A B)(ON A C)(NOT(TOUCH B C)))合取子句 表的數(shù)據(jù)結(jié)構(gòu):LISP表的內(nèi)部表示是由稱為CONS單元的基元構(gòu)成。每個CONS單元是一個地址,它包括一對指針,每個指針指到一個原子,或者指到另一個CONS單元。 LISP的表結(jié)構(gòu)可以用來使任何數(shù)據(jù)結(jié)構(gòu)模型化。例如,二維數(shù)組可以表示為由許多行組成的一張表,每行又是一張元素表。當然,對于許多目的,這種數(shù)組的實現(xiàn)是相當?shù)托У摹?BR> 控制結(jié)構(gòu):LISP是函數(shù)式程序語言,LISP的控制結(jié)構(gòu)主要是應(yīng)用函數(shù)指導控制流,其中變元又可以是應(yīng)用函數(shù)。這點與大多數(shù)程序設(shè)計語言的順序控制結(jié)構(gòu)不同,在那里分離的句子是一句接一句地執(zhí)行。在LISP中,語句與表達式?jīng)]有區(qū)別,過程與函數(shù)也沒有區(qū)別。每個函數(shù),不管是否是一個語言原語,或是由用戶定義的,都以指向一個表結(jié)構(gòu)的形式返回一個單值。 3.變量約束及其轄域 在LISP中有3種主要的賦予符號含義的方法。這里我們將介紹其中最常用的2種:把變量約束到值上和建立函數(shù)。 變量約束到值上:變量本身并無什么含義,它只是一個符號。通過這個符號可以"達到"這個值。變量本身只不過是具有當前值的原子名稱而已。當把此名稱輸入到LISP去時,LISP通過告訴原子的當前值,作為回答。這個名稱與原子當前具有的值之間的聯(lián)系稱為約束,例如可把x約束到5。每當您在程序中引用x時,LISP都理解為5。以后您可以重新把x約束到pen,這就破壞了原來的聯(lián)系而代之以x和pen之間的聯(lián)系,在這以后,當引用x時,LISP把它理解為pen。x值還可能是一般復雜數(shù)據(jù)。可以自由地用任意數(shù)據(jù)段約束任何一個任意選擇的符號。在最簡單的情況下,變量就是某個對象的名字,變量的值就是對象本身。因此,我們可以發(fā)明一些名詞寫入到程序中去,并對這些名詞賦予含義。我們還可以改變這些含義。 建立函數(shù):我們希望能夠建立函數(shù),以對名詞進行運算,產(chǎn)生新的名詞。建立函數(shù)的方法與用值約束符號的方法相同。不過,這時的值不是事實,而是要做的事情。在完成這些之后,再把符號正確地輸入到LISP中去,LISP不象以前那樣理解對象,而是把對象理解為需要完成的某件事。當把有關(guān)的符號約束到"含義"上時,就規(guī)定了這件事。 轄域:如前所述,當一個值約束一個變量時,約束一直有效,直到使用者改變它為止。當約束來自最高層即來自鍵盤時,這總是對的。來自函數(shù)內(nèi)部所建立的約束可以是永久性的,但當函數(shù)完成時,這些約束往往就消失,變量的名字將成為無約束的。如果在整個程序執(zhí)行過程中始終保持變量的約束,那么變量被認為是全程變量。如果變量的約束是建立在單個函數(shù)的內(nèi)部,而且當函數(shù)約束時,約束就消失,那么這是該函數(shù)的局部變量。當然,這二者之間有各種狀態(tài):你可能希望在程序的某一點被賦值的變量在執(zhí)行若干個子程序的過程中保持它的值,然后再失掉這些值。 值得指出,如果局部變量已能解決問題,就不需要建立全程變量。不然的話,就會浪費計算機內(nèi)存。
|
|
|