CLIPS中文手冊(cè).docx_第1頁
CLIPS中文手冊(cè).docx_第2頁
CLIPS中文手冊(cè).docx_第3頁
CLIPS中文手冊(cè).docx_第4頁
CLIPS中文手冊(cè).docx_第5頁
已閱讀5頁,還剩60頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第一章事實(shí)如果你忽視事實(shí),你將永遠(yuǎn)不會(huì)擔(dān)心自己的過錯(cuò)。本章將對(duì)專家系統(tǒng)的基本概念做簡單的介紹。你將會(huì)知道在CLIPS中怎樣插入和移出事實(shí)。如果你正在使用的機(jī)器是蘋果機(jī)或者是IBM(或可兼容)的CLIPS視窗版本,那么你可以通過鼠標(biāo)來選擇相關(guān)的命令來代替輸入命令行。鍵盤上的箭頭鍵也可以移動(dòng)光標(biāo)對(duì)菜單選項(xiàng)進(jìn)行選擇。序言CLIPS是一種被用來編寫專家系統(tǒng)應(yīng)用程序的計(jì)算機(jī)語言。專家系統(tǒng)是一組計(jì)算機(jī)程序,專門用來模仿人類專家的技能和知識(shí)。相比之下,一些普通的程序如報(bào)表程序,文本處理器,電子表格,電腦游戲等等,并沒有包含人類的技能和知識(shí)。(專家的定義之一:就是某人帶著他的公文包在離家50公里之外。)CLIPS之所以被稱之為專家系統(tǒng)工具,是因?yàn)樗且粋€(gè)開發(fā)專家系統(tǒng)的完整環(huán)境,包括一個(gè)整合版本和一個(gè)調(diào)試工具。殼這一詞被保留在CLIPS負(fù)責(zé)推理的部分中。CLIPS的殼提供了專家系統(tǒng)的基本元素:1.事實(shí)表和實(shí)例表:數(shù)據(jù)的全局存儲(chǔ)。2.數(shù)據(jù)庫:包括所有的規(guī)則和規(guī)則表。3.推理機(jī):控制所有規(guī)則的執(zhí)行。CLIPS的程序一般包含有規(guī)則,事實(shí)和對(duì)象。推理機(jī)決定了哪條規(guī)則應(yīng)該被執(zhí)行和在什么時(shí)候被執(zhí)行。一個(gè)用CLIPS寫成的基于規(guī)則庫的專家系統(tǒng)程序是一個(gè)數(shù)據(jù)-驅(qū)動(dòng)型程序,程序里的事實(shí),對(duì)象數(shù)據(jù)通過推理機(jī)的激活執(zhí)行。這里有一個(gè)例子可以幫助你知道CLIPS是如何與其他程序語言如Java,Ada,BASIC,F(xiàn)ORTRAN和C區(qū)別開來的。在程序語言中,執(zhí)行并不一定需要數(shù)據(jù),那是因?yàn)樵谀切┱Z言中的聲明已經(jīng)足夠引起執(zhí)行了。舉例說明,在BASIC語言中,PRINT 2+2的聲明會(huì)被立即執(zhí)行,該聲明是一個(gè)完整的聲明,并不需要額外的數(shù)據(jù)去驅(qū)動(dòng)執(zhí)行。然而,在CLIPS中,規(guī)則的執(zhí)行必需數(shù)據(jù)來驅(qū)動(dòng)。最初,CLIPS僅有表示規(guī)則和事實(shí)的能力,然而,在6.0版本中已經(jīng)允許規(guī)則與對(duì)象的匹配,與規(guī)則與事實(shí)匹配一樣。同時(shí),通過發(fā)送消息來應(yīng)用對(duì)象不必需要規(guī)則了,如果你僅僅只是用對(duì)象,那么推理機(jī)都可以不需要。在第一章到第七章中,我們將討論CLIPS的事實(shí)和規(guī)則,八到十二章中包含了CLIPS的對(duì)象特點(diǎn)。開始和結(jié)束你可以在你的系統(tǒng)中輸入相應(yīng)的運(yùn)行代碼來啟動(dòng)CLIPS,你將看到CLIPS的提示如下所示:CLIPS此時(shí),你可以開始在CLIPS中直接輸入命令,這種直接輸入命令的方式被稱之為最高階層。如果你擁有CLIPS的圖形界面版本(GUI),你也可以用鼠標(biāo)選擇相應(yīng)的菜單來代替輸入命令行。請(qǐng)參考CLIPS GUI版本的CLIPS界面向?qū)?,探討一下其里面的命令支持。在本書中,為了簡約和一致性,我們假設(shè)所有的命令均為輸入方式。離開CLIPS的一般方式是輸入exit命令,如下:(exit)按照CLIPS提示點(diǎn)擊返回鍵。建表與其他編程語言一樣,CLIPS也有關(guān)鍵字。舉個(gè)例子,如果你想在事實(shí)表中輸入數(shù)據(jù),你可以使用assert命令。作為一個(gè)assert實(shí)例,在CLIPS提示后面正確輸入下面的命令:CLIPS(assert (duck)這里,assert命令以(duck)作為其參數(shù)。記住點(diǎn)擊回車鍵將命令行發(fā)送到CLIPS。你將看到如下響應(yīng):這表示CLIPS已經(jīng)存儲(chǔ)了duck的事實(shí),并將其標(biāo)識(shí)為1。在CLIPS中,尖括弧被用來作為條目的分隔符。CLIPS會(huì)自動(dòng)的增加事實(shí)的編號(hào),隨著一個(gè)或更多的事實(shí)被添加,從最高事實(shí)-索引進(jìn)行列表。注意(assert)和它的參數(shù)(duck)均用圓括弧括住,像其他一些專家系統(tǒng)語言一樣,CLIPS采用LISP式樣語法,用圓括弧作為分隔符。雖然CLIPS并不是采用LISP語言編寫,但是LISP影響了CLIPS的發(fā)展。檢查兩遍假設(shè)你想查看一下事實(shí)表中的內(nèi)容,如果你的CLIPS支持GUI,你便可以在菜單中選擇相應(yīng)的命令,或者,你還可以通過鍵盤鍵入相應(yīng)的命令行。接下來,我們將來描述一下鍵盤命令。查看事實(shí)庫的鍵盤命令是facts命令。在CLIPS提示后輸入(facts),CLIPS響應(yīng)后會(huì)將事實(shí)表列出。一定記得將命令用圓括弧括住,否則CLIPS會(huì)不識(shí)別。在該實(shí)例中,(facts)命令的句法如下:CLIPS(facts)f-0 (initial-fact)f-1 (duck)For a total of 2 facts.CLIPSf-0和f-1為CLIPS對(duì)事實(shí)分配的事實(shí)標(biāo)識(shí)。每個(gè)事實(shí)被添加進(jìn)CLIPS,被分配唯一的事實(shí)標(biāo)識(shí),以“f”開頭,后面的數(shù)字為事實(shí)索引。當(dāng)啟動(dòng)CLIPS,輸入如clear或reset(隨后有詳細(xì)的探討)后,事實(shí)索引將會(huì)被歸零,然后隨著每個(gè)事實(shí)的添加(assert)逐步加一。(clear)和(reset)命令同時(shí)增加一個(gè)(initial-fact)事實(shí),編號(hào)為f-0。在CLIPS的早期版本中,該事實(shí)被CLIPS隱式用來初始化一些規(guī)則和被用戶顯式調(diào)用來使事實(shí)庫初始化,但是現(xiàn)在,該事實(shí)僅被用來提供向后兼容性。如果你將duck在事實(shí)表中輸入兩次,將會(huì)出現(xiàn)什么結(jié)果呢?讓我們?cè)囋嚳?,增加一個(gè)新事實(shí)(duck),然后調(diào)用(facts)命令如下所示:CLIPS(assert (duck)FALSECLIPS(facts)f-0 (initial-fact)f-1 (duck)For a total of 2 facts.CLIPSCLIPS返回FALSE消息,表示不可能執(zhí)行該條命令,且你將只能見到原始的事實(shí):“f-1 (duck)”。這說明CLIPS不能接受事實(shí)的復(fù)制輸入。然而,CLIPS中還有一個(gè)超越命令:set-fact-duplication,該命令允許事實(shí)的重復(fù)輸入。當(dāng)然,你可以輸入其他不同的事實(shí)。舉個(gè)例子,增加一個(gè)(quack)事實(shí),然后運(yùn)行(facts)命令,如下:CLIPS(assert (quack)CLIPS(facts)f-0 (initial-fact)f-1 (duck)f-2 (quack)For a total of 3 facts.CLIPS注意,(quack)事實(shí)已經(jīng)被添加到事實(shí)表中了。事實(shí)也會(huì)被移出和撤銷。當(dāng)一個(gè)事實(shí)被撤銷,其他的事實(shí)索引不會(huì)改變,因此會(huì)出現(xiàn)事實(shí)索引的“丟失”。類似于一個(gè)足球運(yùn)動(dòng)員離開球隊(duì)如果沒有被補(bǔ)充,其他隊(duì)員的號(hào)碼不會(huì)因?yàn)槿笔?hào)碼而發(fā)生調(diào)整(除非他們非常討厭這個(gè)離隊(duì)的家伙,想要忘掉他曾在隊(duì)中效力過)。清除所有事實(shí)Clear命令將所有的事實(shí)從內(nèi)存中移出,代碼如下所示:CLIPS(facts)f-0 (initial-fact)f-1 (duck)f-2 (quack)For a total of 3 facts.CLIPS(clear)CLIPS事實(shí)表中的所有事實(shí)被清除。(clear)命令實(shí)質(zhì)上將CLIPS恢復(fù)到起始啟動(dòng)狀態(tài),它清除了CLIPS的內(nèi)存空間,重置事實(shí)標(biāo)識(shí)為0和增加了一個(gè)(initial-fact)事實(shí)。增加(animal-is duck)事實(shí),然后查看事實(shí)表,會(huì)發(fā)現(xiàn)(animal-is duck)的事實(shí)標(biāo)識(shí)為f-1,這是因?yàn)?clear)命令重置了事實(shí)表的標(biāo)識(shí)。該命令事實(shí)上并不只是起清除所有事實(shí)的作用,除此之外,它還清除所有的規(guī)則,在下一章中你就會(huì)看到。下面的實(shí)例顯示了怎樣將三個(gè)事實(shí)加入到事實(shí)表,并用(facts)命令查看,然后(clear)命令將這三個(gè)事實(shí)從內(nèi)存中清除并重置事實(shí)標(biāo)識(shí)為f-0。CLIPS(clear)CLIPS(assert (a) (b) (c)CLIPS(facts)f-0 (initial-fact)f-1 (a)f-2 (b)f-3 (c)For a total of 4 facts.CLIPS(facts 0)f-0 (initial-fact)f-1 (a)f-2 (b)f-3 (c)For a total of 4 facts.CLIPS(facts 1)f-1 (a)f-2 (b)f-3 (c)For a total of 3 facts.CLIPS(facts 2)f-2 (b)f-3 (c)For a total of 2 facts.CLIPS(facts 1 2)f-0 (initial-fact)f-1 (a)f-2 (b)For a total of 2 facts.CLIPS(facts 1 3 2)f-0 (initial-fact)f-1 (a)f-2 (b)For a total of 2 facts.CLIPS注意,僅用一個(gè)(assert)便可以增加三個(gè)事實(shí):(a),(b)和(c)。最高索引為3,通過CLIPS的信息消息返回。也可以用每個(gè)命令增加一個(gè)事實(shí)的方式(那些這樣做的人也許是為了炫耀他們的打字速度)。注:(facts)命令的完整語法為:(facts ),表示顯示索引號(hào)大于等于的事實(shí),表示小于等于的事實(shí),表示顯示在和之間最多個(gè)事實(shí)。敏感字段和詳解事實(shí)(duck)和(quack)被稱之為單字段。一個(gè)字段就是一個(gè)占位符(命名或未命名),通常擁有一個(gè)值。一個(gè)簡單的類比,你可以將字段想像成一幅畫框,這個(gè)畫框能夠裝載一幅畫,也許畫中是你的寵物鴨(也許你會(huì)好奇怎樣用一幅畫表現(xiàn)“quack”,有兩個(gè)法子:(1)是弄一個(gè)示波器來顯示一只鴨子說“quack”的波形圖,信號(hào)的輸入來源于一個(gè)麥克風(fēng);(2)對(duì)于那些有科學(xué)主義傾向的人,也許還得對(duì)“quack”信號(hào)做一個(gè)傅立葉變換;(3)電視里那些叫賣神奇的祛皺,減肥廣告。等等)。只有用deftemplates才叫做占位符,將在第五章中進(jìn)行詳細(xì)的介紹。注:這里的(3)提到的電視廣告,意思是電視廣告里的廣告者會(huì)大呼小叫的對(duì)他們的產(chǎn)品爆發(fā)歡呼,聲音像鴨子叫一樣,諷刺幽默。(duck)事實(shí)是一個(gè)單獨(dú),未命名占位符的事實(shí),值為duck。下面有一個(gè)關(guān)于單字段事實(shí)的例子,一個(gè)字段即是一個(gè)值的占位符。類比想像一下字段,就像碟子(字段)盛食物(值)一樣的道理。未命名字段的順序非常重要。舉例,如果一個(gè)事實(shí)被定義為:(Brian duck)表示一個(gè)叫Brian的獵人射殺了一只鴨子,那么事實(shí):(duck Brian)則表示鴨子獵手射殺了一個(gè)叫Brian的獵人。與之相比,命名字段的順序是不重要的,稍后你將在deftemplate中看到。事實(shí)上,一個(gè)好的軟件工程應(yīng)該采用關(guān)系型表示法來表述字段,一個(gè)好的事實(shí)表示如下:(hunter-game duck Brian)表示第一個(gè)字段代表獵人,第二個(gè)字段代表游戲名稱?,F(xiàn)在,一些定義是必需的了。一個(gè)表是一組無內(nèi)在序列的項(xiàng)目集合。之所以稱一個(gè)表為有序的,意味著表中的位置是非常重要的。一個(gè)多字段是有序字段,每個(gè)字段都有一個(gè)值,特殊符號(hào)nil意思是無,通常作為一個(gè)占位符用在空字段中。舉例如下:(duck nil)可以表示獵人的捕鴨袋中今天一無所獲。注意,nil表示了一個(gè)占位符,雖然它沒有值。舉例,試想一個(gè)字段就是一個(gè)郵箱,沒有郵箱和郵箱中沒有信件是完全兩碼事。如果沒有nil,這個(gè)事實(shí)就是一個(gè)單字段事實(shí)(duck),如果一個(gè)規(guī)則依賴于兩字段激活,則該單字段事實(shí)不會(huì)被激活,稍后你會(huì)看到的。這里有許多不同有效的字段類型:float,integer,symbol,string,external-address,fact-address,instance-name和instance-address。這些字段類型用來存儲(chǔ)字段值的類型。未命名的字段中,值的類型由你的輸入決定。在deftemplates中,你可以顯式的聲明字段所包含值的類型。顯式的聲明加強(qiáng)了軟件工程的概念,是產(chǎn)生一個(gè)高效軟件的編程訓(xùn)練。Symbol是一類字段類型,該類型起始于一個(gè)可印刷的ASCII碼并被選擇性的加一個(gè)0或更多的可印刷字符。字段由空格或占位符被普通的分隔。舉例:(duck-shot Brian Gary Rey)有四個(gè)字段,指示了所有的殺鴨獵人。在這個(gè)事實(shí)中,字段被空格分隔,并由圓括弧括起來。事實(shí)中不能嵌入其他的事實(shí)。舉例,下面即是一個(gè)非法的事實(shí):(duck (shot Brian Gary Rey)然而,如果“shot”被當(dāng)作一個(gè)字段名,上面的事實(shí)可能是一個(gè)合法的deftemplate事實(shí)。后面的三個(gè)人名為該字段下的值。CLIPS區(qū)分大小寫。同樣,CLIPS中特定的符號(hào)有特殊的意義。 () &| ; ?$“&”,“|”和“”不會(huì)獨(dú)立的使用或作為符號(hào)的任何部分。一些字符的作用等同于分隔符以結(jié)束一個(gè)符號(hào)。下面的字符的作用等同于分隔符號(hào)。l所有的不可印刷的ASCII碼,包括空格,回車鍵,制表鍵和換行鍵。l雙引號(hào),“”l起始和結(jié)束圓括號(hào),()l&號(hào)l豎線,|l小于,float)CLIPS中的數(shù)字均為“l(fā)ong long”整型或雙精度浮點(diǎn)型。沒有小數(shù)點(diǎn)的數(shù)字即是整型,除非它們不屬于整型范圍。整型的范圍由數(shù)字的位數(shù)決定,N,用來表示整型如下所示:-2N-1 2N-1-1對(duì)于64位機(jī)器“l(fā)ong long”整型,符合該范圍的數(shù)字為:-9,223,372,036,854,775,808 9,223,372,036,854,775,807下面給出一些數(shù)字的例子,增加下面的數(shù)據(jù)到事實(shí)中,最后一個(gè)數(shù)字為指數(shù)表示法,用“e”或“E”代替乘以10。CLIPS(clear)CLIPS(facts)f-0 (initial-fact)For a total of 1 fact.CLIPS(assert (number 1)CLIPS(assert (x 1.5)CLIPS(assert (y -1)CLIPS(assert (z 65)CLIPS(assert (distance 3.5e5)CLIPS(assert (coordinates 1 2 3)CLIPS(assert (coordinates 1 3 2)CLIPS(facts)f-0 (initial-fact)f-1 (number 1)f-2 (x 1.5)f-3 (y -1)f-4 (z 65)f-5 (distance 350000.0)f-6 (coordinates 1 2 3)f-7 (coordinates 1 3 2)For a total of 8 facts.CLIPS如你所見,CLIPS將輸入的指數(shù)表示法轉(zhuǎn)換成數(shù)字350000.0,這是因?yàn)楫?dāng)數(shù)字足夠小,就會(huì)被從指數(shù)表示轉(zhuǎn)換到浮點(diǎn)型格式。注意上面的每個(gè)數(shù)字前面都有一個(gè)符號(hào)開頭,如“number”,“x”,“y”等。在CLIPS6.0版本以前,允許僅一個(gè)數(shù)字的事實(shí),然而,現(xiàn)在必需一個(gè)符號(hào)作為第一字段,同時(shí),CLIPS的一些專用字段不能用來作為第一字段,但是可以用來作為其他字段。舉個(gè)例子,專用關(guān)鍵字not用來指代否定模式,但是不能作為一個(gè)事實(shí)的第一字段。一個(gè)事實(shí)由一個(gè)或多個(gè)被圓括弧括住的字段組成。為了簡單化,我們?cè)谇懊嫫哒轮袑H僅討論事實(shí),但也有許多對(duì)模式匹配應(yīng)用于對(duì)象做了討論。例外的是,一些函數(shù)如assert和retract僅僅只能用于事實(shí),而不能用于對(duì)象。對(duì)對(duì)象相應(yīng)的處理方法將會(huì)在第八到第十二章中討論。一個(gè)事實(shí)可以是有序的,也可能是無序的。所有前面你已經(jīng)看到的事實(shí)都是有序事實(shí),因?yàn)樽侄蔚捻樞驔Q定了它們的不同。舉個(gè)例子,注意,CLIPS會(huì)自動(dòng)將包含相同數(shù)字“1”,“2”和“3”的事實(shí)區(qū)分開。f-6 (coordinates 1 2 3)f-7 (coordinates 1 3 2)有序事實(shí)必須用字段對(duì)位于其定義的數(shù)據(jù)。舉例說明,有序事實(shí)(duck Brian)有兩個(gè)字段,同樣(Brian duck)也有兩個(gè)字段,然而,CLIPS將其看作兩個(gè)不同的事實(shí),因?yàn)橛行蚴聦?shí)字段的值是不同的。相反,事實(shí)(duck-Brian)僅有一個(gè)字段,因?yàn)橛幸粋€(gè)“-”符號(hào)將兩個(gè)值連結(jié)。定義模板事實(shí)(Deftemplate facts),稍后會(huì)做詳細(xì)的表述,它是無序的,因?yàn)樗妹侄蝸矶x數(shù)據(jù)。這與在C和其他語言中應(yīng)用結(jié)構(gòu)體一樣。多字段通常被由一個(gè)或多個(gè)的空格,制表,回車或表格組成的空白隔離開來。舉例說明,輸入下面的例子,你將發(fā)現(xiàn)每個(gè)被存儲(chǔ)的事實(shí)都是一樣的。CLIPS(clear)CLIPS(assert (The duck says “Quack”)CLIPS(facts)f-0 (initial-fact)f-1 (The duck says “Quack”)For a total of 2 facts.CLIPS(clear)CLIPS(assert (Theducksays“Quack”)CLIPS(facts)f-0 (initial-fact)f-1 (The duck says “Quack”)For a total of 2 facts.CLIPS回車的使用是為增加可讀性。在下面的例子中,每個(gè)字段后加一個(gè)回車,增加的事實(shí)與將字段都寫在一行的效果是一樣的。CLIPS(clear)CLIPS(assert (Theducksays“Quack”)CLIPS(facts)f-0 (initial-fact)f-1 (The duck says “Quack”)For a total of 2 facts.CLIPS然而,當(dāng)你在輸入一個(gè)字符串的時(shí)候,要注意插入回車后的效果,例子如下:CLIPS(assert (Theducksays“Quack”)CLIPS(facts)f-0 (initial-fact)f-1 (The duck says “Quack”)f-2 (The duck says “Quack”)For a total of 3 facts.CLIPS如你所見,在雙引號(hào)中插入的回車在字符串輸出中會(huì)將雙引號(hào)的后半部分移到下一行。CLIPS會(huì)認(rèn)為f-1與f-2是兩個(gè)不同的事實(shí),這一點(diǎn)很重要。同樣,我們也注意到CLIPS會(huì)保存事實(shí)中字段里的大寫和小寫字母。也就是“The”中的“T”和“Quack”中的“Q”。CLIPS被認(rèn)為是區(qū)分大小寫的,因?yàn)樗鼘⒋髮懞托懽帜竻^(qū)別對(duì)待。舉例說明,增加事實(shí)(duck)和(Duck),然后調(diào)用(facts)命令,你會(huì)發(fā)現(xiàn)CLIPS增加了兩個(gè)不同的事實(shí)(duck)和(Duck),這正是因?yàn)镃LIPS是區(qū)分大小寫的緣故。下面的例子將更清楚的表現(xiàn)了回車應(yīng)用于表中,增加可讀性的作用。增加下面的事實(shí),使用空格和回車將字段合適的安排在行中。破折號(hào)和減號(hào)被使用來創(chuàng)建單字段,這樣,CLIPS就會(huì)將“fudge sauce”作為一個(gè)單字段了。CLIPS(clear)CLIPS(assert (grocery-listice-creamcookiescandyfudge-sauce)CLIPS(facts)f-0 (initial-fact)f-1 (grocery-list ice-cream cookie candy fudge-sauce)For a total of 2 facts.CLIPS如你所見,CLIPS將回車和制表置換為單空格。當(dāng)人們?cè)谧x一段程序時(shí),使用合適的空格會(huì)帶來許多方便,CLIPS會(huì)將其自動(dòng)置換為單空格。監(jiān)視事實(shí)CLIPS提供了一些幫助你調(diào)試程序的命令。其中一個(gè)命令可以幫助你連續(xù)監(jiān)視事實(shí)(watch facts)的增加和撤銷,這比你總是不斷輸入(facts)命令來查看事實(shí)表中的變化要方便得多。監(jiān)視事實(shí)是通過輸入(watch facts)命令來實(shí)現(xiàn)的,如下例子所示:CLIPS(clear)CLIPS(watch facts)CLIPS(assert (animal-is duck)=f-1(animal-is duck)CLIPS右雙箭頭符號(hào)=表示事實(shí)正在被添加到內(nèi)存中,左雙箭頭(reset)=f-0(initial-fact)f-0(initial-fact)CLIPS(assert (animal-is duck)=f-1(animal-is duck)CLIPS(retract 1)(facts)f-0 (initial-fact)For a total of 1 fact.CLIPS(watch facts)命令提供對(duì)事實(shí)表狀態(tài)的動(dòng)態(tài)顯示,(facts)命令顯示的是靜態(tài)的當(dāng)前事實(shí)表中所包含的事實(shí)。關(guān)閉監(jiān)視事實(shí)的命令為:(unwatch facts)。你可以監(jiān)視的項(xiàng)目有很多,下面列舉出來,在CLIPS參考指南中有詳細(xì)的表述。CLIPS中的注釋以分號(hào)開始,分號(hào)后面的內(nèi)容將會(huì)被CLIPS忽略。(watch facts)(watch instances);應(yīng)用于對(duì)象(watch slots);應(yīng)用于對(duì)象(watch rules)(watch activations)(watch messages);應(yīng)用于對(duì)象(watch message-handlers);應(yīng)用于對(duì)象(watch generic-functions)(watch methods);應(yīng)用于對(duì)象(watch deffunctions)(watch compilations) ;默認(rèn)的(watch statistics)(watch globals)(watch focus)(watch all);監(jiān)視所有項(xiàng)目隨著你使用到CLIPS的更多功能,你將發(fā)現(xiàn)(watch)命令在調(diào)試過程中非常的有用。通過輸入unwatch命令可以關(guān)閉監(jiān)視(watch)命令。舉例說明,如果要關(guān)閉監(jiān)視編譯,則輸入(unwatch compilations)即可。一點(diǎn)幫助CLIPS提供有效的在線幫助。獲得幫助只需輸入(help)命令然后回車即可。不久,你將會(huì)看到一個(gè)細(xì)目菜單。更多的關(guān)于(help)命令的信息,請(qǐng)參考HELP_USAGE幫助章節(jié)。退出幫助的方法是一直按回車鍵,直到CLIPS提示出現(xiàn)。如果出現(xiàn)錯(cuò)誤消息提示,則表明CLIPS沒有找到幫助文件:clips.hlp,你可以用(help-path)命令來找出CLIPS該文件的路徑。第二章規(guī)則如果你想你的生活碩果累累,那么別打破規(guī)則-而是去制定規(guī)則!在前面一章中的學(xué)習(xí)中,你已經(jīng)對(duì)事實(shí)有所了解了?,F(xiàn)在你將馬上看到專家系統(tǒng)的規(guī)則將怎樣利用事實(shí)驅(qū)動(dòng)程序執(zhí)行。構(gòu)造良好的規(guī)則完成一項(xiàng)有價(jià)值的工作,專家系統(tǒng)必須得有事實(shí)和規(guī)則。前面你已經(jīng)知道了事實(shí)的添加和撤銷,現(xiàn)在你將了解規(guī)則是怎樣工作的。一條規(guī)則與程序語言如Java,C或Ada中的IF THEN表述非常相似。IF THEN規(guī)則可以用自然語言與計(jì)算機(jī)語言來混合表示,如下所示:IF certain conditions are trueTHEN execute the following actions上述表述又被稱為偽代碼,偽代碼字面的意思是錯(cuò)誤的代碼。偽代碼不能被計(jì)算機(jī)識(shí)別和執(zhí)行,但是它對(duì)書寫可執(zhí)行代碼提供了有用的指南。偽代碼在文檔規(guī)則中也非常有用。如果你記住IF THEN的類比特性,那么將規(guī)則從自然語言轉(zhuǎn)化到CLIPS語言將很簡單。隨著你CLIPS實(shí)踐的增加,你將發(fā)現(xiàn)在CLIPS中寫規(guī)則非常的簡單。你可以在CLIPS中直接輸入規(guī)則,也可以新建一個(gè)文本文件,將規(guī)則寫在里面,然后加載到CLIPS中來。關(guān)于鴨子叫聲規(guī)則的偽代碼可以寫成如下形式:IF the animal is a duckTHEN the sound made is quack下面是采用CLIPS語法將上面的偽代碼寫成一個(gè)事實(shí)和一個(gè)命名為duck的事實(shí)。規(guī)則名緊跟在關(guān)鍵字defrule后面。雖然你可以將規(guī)則都寫在一行里面,但是我們通常將規(guī)則分成幾段放在幾行里書寫,便于程序的閱讀和編輯。CLIPS(unwatch facts)CLIPS(clear)CLIPS(assert (animal-is duck)CLIPS(defrule duck(animal-is duck)=(assert (sound-is quack)CLIPS如果你按照上面正確的輸入,你便會(huì)看到CLIPS的提示符出現(xiàn),否則,你將會(huì)看到一個(gè)錯(cuò)誤消息提示。如果你得到一個(gè)錯(cuò)誤消息,也許是你拼錯(cuò)了關(guān)鍵字或你遺漏了圓括號(hào)。記住,在一個(gè)聲明中,圓括弧的左邊和右邊部分的數(shù)目是配套的。下面將給出一個(gè)相同的規(guī)則,該規(guī)則中增加了對(duì)規(guī)則每部分的注釋。同時(shí)也增加了可選的規(guī)則頭(rule-header)注釋:“Here comes the quack”。規(guī)則中只能包含一個(gè)規(guī)則頭注釋,且必須寫在規(guī)則名之后和第一個(gè)模式(pattern)之前。雖然現(xiàn)在我們只是討論基于事實(shí)的模式匹配,一般來說,模式的匹配時(shí)基于模式實(shí)體上(pattern entity)的。模式實(shí)體是一個(gè)事實(shí),也可以是一個(gè)用戶定義類的實(shí)例。基于對(duì)象的模式匹配將稍后討論。CLIPS基于模式實(shí)體來進(jìn)行模式匹配。當(dāng)然,由空格,制表和回車組成的空格將規(guī)則的幾個(gè)部分分隔開來,以增強(qiáng)可讀性。其他的注釋由分號(hào)引導(dǎo),直到按下回車鍵結(jié)束一行。CLIPS忽略注釋里的內(nèi)容。(defrule duck “Here comes the quack”;規(guī)則頭(animal-is duck);模式=; THEN箭頭(assert (sound-is quack);執(zhí)行l(wèi)CLIPS中,同時(shí)刻只能僅有一個(gè)規(guī)則名存在。輸入同一個(gè)規(guī)則名,如本例中的“duck”,將會(huì)更替前面規(guī)則名為“duck”里已經(jīng)存在的一切。也就是說,CLIPS中可能有許多條規(guī)則,但是只能有一條被命名為“duck”的規(guī)則。這與其他程序語言中一個(gè)程序名只能標(biāo)識(shí)唯一程序段是一樣的道理。規(guī)則的常規(guī)語法如下所示:(defrule rule_name “optinal_comment”(pattern_1);由一些在“=”之前的元素組成的規(guī)則左部分(pattern_2).(pattern_N)=(action_1);由一些在“=”之后的元素組成的規(guī)則右部分(action_2).(action_M);最后一個(gè)“)”是與“defrule”前面的“)”配;套的。保證你的圓括弧完整,否則你將得到錯(cuò)誤;消息提示整個(gè)規(guī)則必須用圓括弧括住,每個(gè)模式(pattern)和每個(gè)行為(action)都必須用圓括弧括住。行為通常是一類沒有返回值(return value)的函數(shù),但是它可以完成一些有用的執(zhí)行,如(assert)和(retract)。舉個(gè)例子,一個(gè)行為可以是(assert (duck)。這里的函數(shù)名是“assert”,它的參數(shù)是“duck”。注意,我們并沒有希望得到一個(gè)如數(shù)字型的返回值,而是使得事實(shí)(duck)被增加到CLIPS中去。CLIPS中的函數(shù)(function)是一段可執(zhí)行代碼,該段代碼被特定的函數(shù)名標(biāo)識(shí),返回有用的值或產(chǎn)生有用的副作用,如(printout)。一個(gè)規(guī)則通常包含有多個(gè)模式和行為。模式和行為的數(shù)量并不一定得相等,這就是上面例子中用N和M來代指的意義。零個(gè)或多個(gè)模式寫在規(guī)則名之后。每個(gè)模式包含一個(gè)或多個(gè)字段。在上面的duck規(guī)則中,模式為(animal-is duck),字段為“animal-is”和“duck”。CLIPS試圖將模式與事實(shí)表中的事實(shí)進(jìn)行匹配,如果規(guī)則的模式與事實(shí)匹配成功,規(guī)則將會(huì)被激活(activated)而放入到議程(agenda)中。議程中存放的是所有被激活的規(guī)則集合。議程中通常包含零個(gè)或多個(gè)激活的規(guī)則。規(guī)則中,模式后面的符號(hào)“=”被稱之為箭號(hào)(arrow),箭號(hào)是IF-THEN規(guī)則的THEN部分開始的標(biāo)記(也許可以被讀作“意味著”)。規(guī)則的最后部分為零個(gè)或多個(gè)行為,當(dāng)規(guī)則被觸發(fā)(fire)時(shí),這些行為將會(huì)被執(zhí)行。在我們的實(shí)例中,行為是增加一個(gè)事實(shí)(sound-is quack)。Fire一詞意味著CLIPS已經(jīng)選定了議程中某條規(guī)則并執(zhí)行。l當(dāng)議程中沒有激活的規(guī)則時(shí),程序停止執(zhí)行。當(dāng)議程中有多條激活規(guī)則時(shí),CLIPS自動(dòng)決定哪條規(guī)則將被合理的觸發(fā)。CLIPS依照增加優(yōu)先權(quán)和特權(quán)(salience)來對(duì)議程的激活排序。規(guī)則中箭號(hào)之前的被稱之為左部(LHS),箭號(hào)之后的部分被稱之為右部(RHS)。如果沒有指定模式,則CLIPS會(huì)在輸入(reset)命令后自動(dòng)的激活該條規(guī)則。讓鴨子叫吧CLIPS通常會(huì)執(zhí)行議程中最高優(yōu)先權(quán)規(guī)則右部的行為部分。隨后該條規(guī)則將會(huì)被移出議程,接下來最高特權(quán)規(guī)則的行為將會(huì)被執(zhí)行。這樣持續(xù)執(zhí)行下去,直到議程中沒有激活的規(guī)則或輸入了停止激活的命令為止。你可以通過議程(agenda)命令來查看議程中的內(nèi)容,舉例說明:CLIPS(agenda)0duck: f-1For a total of 1 activation.CLIPS第一個(gè)數(shù)字“0”表示規(guī)則“duck”的激活特權(quán)值,“f-1”為事實(shí)的標(biāo)識(shí),(animal-is duck)為匹配激活。如果沒有顯式的聲明特權(quán)值,則CLIPS默認(rèn)為0。特權(quán)值的范圍為-10000到10000。本書中,我們將用default的定義來作為標(biāo)準(zhǔn)方式。如果議程中僅有一個(gè)規(guī)則,該規(guī)則將被觸發(fā)。前面知道了duck-sound規(guī)則的模式左部為:(animal-is duck)該模式剛好與(animal-is duck)事實(shí)符合,因此duck-sound規(guī)則將會(huì)被觸發(fā)。模式的字段被稱之為字面約束(literal constraint)。之所以稱之為字面意味著有一個(gè)常數(shù)值,與之對(duì)立的是值可以改變的變量。在此例中,字面為“animal-is”和“duck”。輸入run命令即可使程序運(yùn)行。敲入(run)并回車,然后輸入(facts)命令查看通過該規(guī)則有哪些事實(shí)被添加。CLIPS(run)CLIPS(facts)f-0 (initial-fact)f-1 (animal-is duck)f-2 (sound-is quack)For a total of 3 facts.CLIPS在操作之前,讓我們使用save命令來保存duck規(guī)則,這樣你就可以避免重復(fù)輸入了(如果你還沒有將這些保存到編輯器中)。輸入命令如下:(save “duck.clp”)將CLIPS內(nèi)存中的規(guī)則保存到命名為“duck.clp”的文件中,“.clp”是一個(gè)簡單方便的擴(kuò)展名,讓我們方便知道這是一個(gè)CLIPS的源文件。注意,從CLIPS內(nèi)存中保存下的代碼只保留了雙引號(hào)內(nèi)可選規(guī)則頭的注釋,而分號(hào)后的注釋就沒有了。踢你的鴨子也許此時(shí)你會(huì)有一個(gè)有趣的問題,如果重復(fù)執(zhí)行(run),結(jié)果會(huì)這樣?當(dāng)一個(gè)規(guī)則被事實(shí)滿足時(shí),該規(guī)則會(huì)被觸發(fā),然而,如果你重復(fù)執(zhí)行(run),你會(huì)發(fā)現(xiàn)該條規(guī)則不將被觸發(fā)了。這也許讓人有一點(diǎn)沮喪,然而,在你做出一些極端的減輕沮喪的事情之前-如狠踢你的寵物鴨-你得多了解一些專家系統(tǒng)的基本原理。當(dāng)規(guī)則的模式與下面的幾點(diǎn)匹配時(shí),規(guī)則被激活:1.之前不存在的不同的新的模式實(shí)體2.該模式實(shí)體存在,但是被撤銷或者被重新添加了。舉個(gè)例子,舊模式實(shí)體的副本便是一個(gè)新的模式實(shí)體。規(guī)則和匹配的模式目錄,都是被激活的。如果是規(guī)則或模式實(shí)體,或者同時(shí)被改變了,激活將會(huì)被移除。一個(gè)激活的也可以通過命令或另一規(guī)則的行為被移除,該規(guī)則在移除激活的先決條件前被觸發(fā)。推理機(jī)通過特權(quán)值將激活進(jìn)行分類。這種分類過程被稱之為沖突消解(conflict resolution),因?yàn)樗饬藳Q定下一個(gè)觸發(fā)規(guī)則的沖突。CLIPS依照議程中最高的特權(quán)值進(jìn)行規(guī)則的激活,并移除激活。這種執(zhí)行被稱之為觸發(fā),就像神經(jīng)細(xì)胞的激活。當(dāng)有適當(dāng)?shù)拇碳r(shí),神經(jīng)細(xì)胞會(huì)激發(fā)出一定的電壓脈沖,神經(jīng)細(xì)胞激活后,將遭受折射(refraction)并在一定時(shí)期內(nèi)不能被再次觸發(fā)。如果沒有折射,神經(jīng)細(xì)胞將會(huì)在刺激作用下無休止的被激活下去。如果沒有折射效應(yīng),專家系統(tǒng)將會(huì)經(jīng)常陷入到無關(guān)重要的循環(huán)當(dāng)中去。因?yàn)?,一旦?guī)則被觸發(fā),那么它將在相同的事實(shí)作用下無休止的被觸發(fā)下去。在現(xiàn)實(shí)世界中,引起觸發(fā)的刺激最終都會(huì)消失。舉個(gè)例子,一只真的鴨子也許會(huì)游走或在電影里充當(dāng)一個(gè)角色,然而,在計(jì)算機(jī)世界里,一旦數(shù)據(jù)被存儲(chǔ),它將一直保存在那兒,除非有外部聲明移除或電腦斷電。下面的例子展示了一個(gè)規(guī)則的激活和觸發(fā)。注意(watch)命令被用來更好的顯示每個(gè)事實(shí)和激活。右箭號(hào)表明激活和事實(shí)正在被添加,左箭號(hào)表明已存在的事實(shí)和激活。CLIPS(clear)CLIPS(defrule duck(animal-is duck)=(assert (sound-is quack)CLIPS(watch facts)CLIPS(watch activations)CLIPS(assert (animal-is duck)=f-1(animal-is duck)=Activation 0duck:f-1;激活的默認(rèn)權(quán)值為0,其后是規(guī)則名:模式;實(shí)體索引CLIPS(assert (animal-is duck);注意復(fù)制的事實(shí)不會(huì)被輸入FALSECLIPS(agenda)0duck: f-1For a total of 1 activation.CLIPS(run)=f-2(sound-is quack)CLIPS(agenda);當(dāng)規(guī)則被觸發(fā)后,議程為空CLIPS(facts)f-0 (initial-fact);即使事實(shí)已與規(guī)則匹配,折射也不會(huì)允許該激f-1 (animal-is duck);活,因?yàn)樵撘?guī)則等待事實(shí)的激活f-2 (sound-is quack)For a total of 3 facts.CLIPS(run)CLIPS你也可以撤銷事實(shí)然后又重新添加作為新的事實(shí)來讓規(guī)則重復(fù)觸發(fā)。查看規(guī)則在你運(yùn)行CLIPS時(shí),也許你想查看某一條規(guī)則,這里有一個(gè)命令:ppdefrule-恰當(dāng)?shù)拇蛴∫?guī)則-打印一條規(guī)則。查看某條規(guī)則,則指定其規(guī)則名為ppdefrule的參數(shù)即可,舉例如下:CLIPS(ppdefrule duck)(defrule MAIN:duck(animal-is duck)=(assert (sound-is quack)CLIPS為了增加可讀性,CLIPS將規(guī)則的不同部分分布在不同的行中。規(guī)則箭號(hào)之前的模式部分仍然被稱之為LHS,箭號(hào)之后的行為部分仍然被稱之為RHS。術(shù)語MAIN引用MAIN模塊表明該條規(guī)則是自定義的。你可以定義模塊,將規(guī)則與那些可以被其他編程語言不同包裝,模塊,過程或函數(shù)納入的聲明類比。模塊的使用使得編寫那些有許多條規(guī)則的專家系統(tǒng)變得簡單,這樣,對(duì)于每個(gè)模塊,它們大多在自己的議程中整合在一起了。如果你想了解更多,請(qǐng)參考CLIPS參考指南。如果你想打印一條規(guī)則,而你又忘掉了該規(guī)則的規(guī)則名,該怎么辦?不用慌,你可以在CLIPS提示符后面使用rules命令來打印出所有的規(guī)則名,舉例如下:CLIPS(rules)DuckFor a total of 1 defrule.CLIPS給我寫信規(guī)則的RHS部分除了添加一條新規(guī)則,你還可以使用printout函數(shù)打印出相應(yīng)的信息。同樣,CLIPS有回車換行關(guān)鍵字:crlf,該關(guān)鍵字以換行格式來改進(jìn)輸出效果。有一點(diǎn)小改變就是,crlf不被圓括弧包含。舉例如下:CLIPS(defrule duck(animal-is duck)=(printout t “quack” crlf) ;一定要打出“t”=Activation 0duck:f-1CLIPS(run)quackCLIPS雙引號(hào)內(nèi)的文本即為輸出。一定記得在printout命令后輸入“t”,這將告知CLIPS將結(jié)果輸出到電腦的標(biāo)準(zhǔn)輸出設(shè)備(standard output device)中。通常,標(biāo)準(zhǔn)輸出設(shè)備是你電腦的終端(terminal)(因此在printout后面接字母“t”)。然而,這可能會(huì)被重新定義,這樣標(biāo)準(zhǔn)輸出設(shè)備也可能是其他的設(shè)備,如調(diào)制解調(diào)器或磁盤。其他特性declare salience命令提供對(duì)增添到議程中的規(guī)則的外部控制。在使用該特性的時(shí)候要注意不要太過于自由以免你的程序被人為控制太多。set-incremental-reset命令禁止在規(guī)則被輸入之前查看該規(guī)則的事實(shí)。獲取增加的重置值命令為:get-incremental-reset。讓一條規(guī)則重復(fù)觸發(fā)的一個(gè)辦法是使用refresh規(guī)則命令來強(qiáng)制使其重新激活。load命令載入前面你已經(jīng)保存在磁盤中命名為“duck.clp”文件或者相應(yīng)文件夾下的任何文件名里的規(guī)則。你還可以使用load命令載入一個(gè)包含規(guī)則的文本文件。最快的載入文件的方法是,首先用bsave二進(jìn)制存儲(chǔ)命令將規(guī)則存儲(chǔ)為機(jī)器可讀二進(jìn)制格式。載入的二進(jìn)制命令為bload。這樣,CLIPS內(nèi)存會(huì)不加解釋的快速讀取這些二進(jìn)制規(guī)則。另外兩個(gè)有用的命令可以幫助你通過一個(gè)文件來保存和載入事實(shí)。它們是save-facts和load-facts。(save-facts)命令將會(huì)保存所有事實(shí)表中的事實(shí),(load-facts)命令將會(huì)導(dǎo)入文件事實(shí)表中的事實(shí)。batch命令允許你像在頂層輸入一樣執(zhí)行一個(gè)文件命令。另外一個(gè)有用的命令為你的操作系統(tǒng)提供一個(gè)界面。system命令允許操作系統(tǒng)的執(zhí)行和在CLIPS內(nèi)的可執(zhí)行。如果你想了解更多此類信息,請(qǐng)查閱CLIPS參考指南。第三章詳細(xì)資料問題不是大局,而是細(xì)節(jié)。在前面的兩章中,你已經(jīng)學(xué)習(xí)了CLIPS的基礎(chǔ)?,F(xiàn)在,你將會(huì)學(xué)到怎樣結(jié)合這些基礎(chǔ)構(gòu)建一個(gè)強(qiáng)大的程序。紅綠燈到目前為止,你還只是看到一些僅包含一條規(guī)則的簡單程序。然而,只包含一條規(guī)則的專家系統(tǒng)無疑作用有限。實(shí)際的專家系統(tǒng)通常包含上百,上千條規(guī)則。讓我們來看看一個(gè)需要多條規(guī)則的應(yīng)用軟件程序吧。假設(shè)你想寫一個(gè)專家系統(tǒng)來決定一個(gè)移動(dòng)式遙控裝置如何對(duì)交通燈進(jìn)行響應(yīng),最好是用多條規(guī)則去編寫這個(gè)問題的類型。舉個(gè)例子,紅燈和綠燈情況下的規(guī)則按如下書寫:(defrule red-light(light red)=(printout t “Stop” crlf)(defrule green-light(light green)=(printout t “Go” crlf)當(dāng)上述規(guī)則被

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論