【正文】
,通常作為一個(gè)占位符用在空字段中。(duck nil)注意,nil表示了一個(gè)占位符,雖然它沒有值。如果沒有nil,這個(gè)事實(shí)就是一個(gè)單字段事實(shí)(duck),如果一個(gè)規(guī)則依賴于兩字段激活,則該單字段事實(shí)不會被激活,稍后你會看到的。這些字段類型用來存儲字段值的類型。在deftemplates中,你可以顯式的聲明字段所包含值的類型。Symbol是一類字段類型,該類型起始于一個(gè)可印刷的ASCII碼并被選擇性的加一個(gè)0或更多的可印刷字符。舉例:有四個(gè)字段,指示了所有的殺鴨獵人。事實(shí)中不能嵌入其他的事實(shí)。(duck (shot Brian Gary Rey))后面的三個(gè)人名為該字段下的值。同樣,CLIPS中特定的符號有特殊的意義?!?( ) amp。 ? $”,“|”和“~”不會獨(dú)立的使用或作為符號的任何部分。下面的字符的作用等同于分隔符號。 所有的不可印刷的ASCII碼,包括空格,回車鍵,制表鍵和換行鍵。 雙引號,“”l amp。 豎線,|ll 分號,;指示一個(gè)注釋的開始,回車鍵結(jié)束l如果你在最高階層(toplevel)中不經(jīng)意的輸入了一個(gè)分號,那么輸入一個(gè)圓括號的結(jié)束部分:)并回車。隨著你通讀這本手冊,你將會逐漸明白上面那些符號的意義?!?,“|”和“~”之外,你將使用其他的表示符號,然而,也許對于有些人,在讀程序和試圖理解程序運(yùn)行機(jī)理時(shí)有些困惑。下面是這些符號的一些例子:第二類類型的字段是string。引號中可以有0個(gè)或多個(gè)字符。“duck”“duck1”“duck/soup”“duck soup”“duck soup is good!!!”該字段用來表示整型或浮點(diǎn)型字段。(floatpointfloat)CLIPS中的數(shù)字均為“l(fā)ong long”整型或雙精度浮點(diǎn)型。整型的范圍由數(shù)字的位數(shù)決定,N,用來表示整型如下所示:對于64位機(jī)器“l(fā)ong long”整型,符合該范圍的數(shù)字為:下面給出一些數(shù)字的例子,增加下面的數(shù)據(jù)到事實(shí)中,最后一個(gè)數(shù)字為指數(shù)表示法,用“e”或“E”代替乘以10。CLIPS(clear)CLIPS(facts)f0 (initialfact)For a total of 1 fact.CLIPS(assert (number 1))Fact1CLIPS(assert (x ))Fact2CLIPS(assert (y 1))Fact3CLIPS(assert (z 65))Fact4CLIPS(assert (distance ))Fact5CLIPS(assert (coordinates 1 2 3))Fact6CLIPS(assert (coordinates 1 3 2))Fact7CLIPS(facts)f0 (initialfact)f1 (number 1)f2 (x )f3 (y 1)f4 (z 65)f5 (distance )f6 (coordinates 1 2 3)f7 (coordinates 1 3 2)For a total of 8 facts.CLIPS注意上面的每個(gè)數(shù)字前面都有一個(gè)符號開頭,如“number”,“x”,“y”等。舉個(gè)例子,專用關(guān)鍵字not用來指代否定模式,但是不能作為一個(gè)事實(shí)的第一字段。為了簡單化,我們在前面七章中將僅僅討論事實(shí),但也有許多對模式匹配應(yīng)用于對象做了討論。對對象相應(yīng)的處理方法將會在第八到第十二章中討論。所有前面你已經(jīng)看到的事實(shí)都是有序事實(shí),因?yàn)樽侄蔚捻樞驔Q定了它們的不同。有序事實(shí)必須用字段對位于其定義的數(shù)據(jù)。相反,事實(shí)(duckBrian)僅有一個(gè)字段,因?yàn)橛幸粋€(gè)“”符號將兩個(gè)值連結(jié)。這與在C和其他語言中應(yīng)用結(jié)構(gòu)體一樣。舉例說明,輸入下面的例子,你將發(fā)現(xiàn)每個(gè)被存儲的事實(shí)都是一樣的。CLIPS(clear)CLIPS(assert (The duck says “Quack”))Fact1CLIPS(facts)f0 (initialfact)f1 (The duck says “Quack”)For a total of 2 facts.CLIPS(clear)CLIPS(assert (The duck says “Quack” ))Fact1CLIPS(facts)f0 (initialfact)f1 (The duck says “Quack”)For a total of 2 facts.CLIPS在下面的例子中,每個(gè)字段后加一個(gè)回車,增加的事實(shí)與將字段都寫在一行的效果是一樣的。CLIPS(clear)CLIPS(assert (Theducksays“Quack”))Fact1CLIPS(facts)f0 (initialfact)f1 (The duck says “Quack”)For a total of 2 facts.CLIPSCLIPS(assert (Theducksays“Quack”))Fact2CLIPS(facts)f0 (initialfact)f1 (The duck says “Quack”)f2 (The duck says “Quack”)For a total of 3 facts.CLIPSCLIPS會認(rèn)為f1與f2是兩個(gè)不同的事實(shí),這一點(diǎn)很重要。也就是“The”中的“T”和“Quack”中的“Q”。舉例說明,增加事實(shí)(duck)和(Duck),然后調(diào)用(facts)命令,你會發(fā)現(xiàn)CLIPS增加了兩個(gè)不同的事實(shí)(duck)和(Duck),這正是因?yàn)镃LIPS是區(qū)分大小寫的緣故。增加下面的事實(shí),使用空格和回車將字段合適的安排在行中。如你所見,CLIPS將回車和制表置換為單空格。在此風(fēng)格中,第一個(gè)字段被稱為關(guān)系,事實(shí)的剩余字段被用來指定值。良好的文檔處理在專家系統(tǒng)中比其他語言如Jave,C,Ada等更顯重要,這是因?yàn)閷<蚁到y(tǒng)中的規(guī)則并不是普通的按順序執(zhí)行。另一個(gè)關(guān)聯(lián)的事實(shí)是(duck),(horse)和(cow)。(animalis duck)(animalis horse)(animalis cow)(animals duck horse cow)一個(gè)明確的關(guān)聯(lián),animalis和animals,比隱式的定義(duck),(horse)和(cow)能使人們得到更多的信息。)消除空格之前我們介紹了空格用來分隔多字段,下面我們將看到在事實(shí)中,空格的作用不僅僅如此。CLIPS(clear)CLIPS(assert (animalis walrus))Fact1CLIPS(assert ( animalis walrus ))FALSECLIPS(assert ( animalis walrus ))FALSECLIPS(facts)f0 (initialfact)f1 (animalis walrus)For a total of 2 facts.CLIPS因此,當(dāng)輸入相同的事實(shí)時(shí),CLIPS返回FALSE。如果你想在事實(shí)中包含空格,那么你必須使用雙引號,舉例如下:注意上面,在CLIPS中,空格的使用使得每個(gè)事實(shí)都不同,雖然在我們看來是同一個(gè)事實(shí)。CLIPS(clear)CLIPS(assert (singlequote “duck”))Fact1CLIPS(assert (singlequote “\”duck“\”))Fact2CLIPS(facts)f0 (initialfact)f1 (singlequote “duck”)f2 (singlequote ““duck””))For a total of 3 facts.CLIPS將事實(shí)表中的事實(shí)移除稱之為撤銷,使用retract命令。CLIPS(clear)CLIPS(assert (animalis duck))Fact1CLIPS(assert (animalsound quack))Fact2CLIPS(assert (The duck says “Quack.”))Fact3CLIPS(facts)f0 (initialfact)f1 (animalis duck)f2 (animalsound quack)f3 (The duck says “Quack.”)For a total of 4 facts.CLIPSCLIPS(retract 3)CLIPS(facts)f0 (initialfact)f1 (animalis duck)f2 (animalsound quack)For a total of 3 facts.CLIPSCLIPS(retract 3)[PRNTUTIL1] Unable to find fact f3.CLIPS如果你沒有給予,你當(dāng)然也沒有道理拿回什么。CLIPS(retract 2)CLIPS(facts)f0 (initialfact)f1 (animalis duck)For a total of 2 facts.CLIPS(retract 1)CLIPS(facts)f0 (initialfact)For a total of 1 fact.CLIPS你可以一次撤銷多條事實(shí),如下所示:撤銷多條事實(shí),只要在retract命令后跟上相應(yīng)的事實(shí)索引號即可。 監(jiān)視事實(shí)CLIPS提供了一些幫助你調(diào)試程序的命令。監(jiān)視事實(shí)是通過輸入(watch facts)命令來實(shí)現(xiàn)的,如下例子所示:右雙箭頭符號==表示事實(shí)正在被添加到內(nèi)存中,左雙箭頭==表示事實(shí)正在從內(nèi)存中移除,如下所示:(watch facts)命令提供對事實(shí)表狀態(tài)的動(dòng)態(tài)顯示,(facts)命令顯示的是靜態(tài)的當(dāng)前事實(shí)表中所包含的事實(shí)。你可以監(jiān)視的項(xiàng)目有很多,下面列舉出來,在《CLIPS參考指南》中有詳細(xì)的表述。 應(yīng)用于對象(watch slots) 。 應(yīng)用于對象(watch messagehandlers) 。 應(yīng)用于對象(watch deffunctions)(watch pilations) 。 監(jiān)視所有項(xiàng)目通過輸入unwatch命令可以關(guān)閉監(jiān)視(watch)命令。一點(diǎn)幫助CLIPS提供有效的在線幫助。不久,你將會看到一個(gè)細(xì)目菜單。退出幫助的方法是一直按回車鍵,直到CLIPS提示出現(xiàn)。第二章 規(guī)則如果你想你的生活碩果累累,那么別打破規(guī)則而是去制定規(guī)則!在前面一章中的學(xué)習(xí)中,你已經(jīng)對事實(shí)有所了解了。構(gòu)造良好的規(guī)則完成一項(xiàng)有價(jià)值的工作,專家系統(tǒng)必須得有事實(shí)和規(guī)則。一條規(guī)則與程序語言如Java,C或Ada中的IF THEN表述非常相似。IF certain conditions are trueTHEN execute the following actions偽代碼不能被計(jì)算機(jī)識別和執(zhí)行,但是它對書寫可執(zhí)行代碼提供了有用的指南。如果你記住IF THEN的類比特性,那么將規(guī)則從自然語言轉(zhuǎn)化到CLIPS語言將很簡單。你可以在CLIPS中直接輸入規(guī)則,也可以新建一個(gè)文本文件,將規(guī)則寫在里面,然后加載到CLIPS中來。IF the animal is a duckTHEN the sound made is quack規(guī)則名緊跟在關(guān)鍵字defrule后面。如果你按照上面正確的輸入,你便會看到CLIPS的提示符出現(xiàn),否則,你將會看到一個(gè)錯(cuò)誤消息提示。記住,在一個(gè)聲明中,圓括弧的左邊和右邊部分的數(shù)目是配套的。同時(shí)也增加了可選的規(guī)則頭(ruleheader)注釋:“Here es the quack”。雖然現(xiàn)在我們只是討論基于事實(shí)的模式匹配,一般來說,模式的匹配時(shí)基于模式實(shí)體上(pattern entity)的?;趯ο蟮哪J狡ヅ鋵⑸院笥懻?。當(dāng)然,由空格,制表和回車組成的空格將規(guī)則的幾個(gè)部分分隔開來,以增強(qiáng)可讀性。CLIPS忽略注釋里的內(nèi)容。(defrule duck “Here es the quack” 。 模式= 。 執(zhí)行l(wèi)也就是說,CLIPS中可能有許多條規(guī)則,但是只能有一條被命名為“duck”的規(guī)則。規(guī)則的常規(guī)語法如下所示: 由一些在“=”之前的元素組成的規(guī)則左部分(pattern_2)...(pattern_N)=(action_1) 。 最后一個(gè)“)”是與“defrule”前面的“)”配。保證你的圓括弧完整,否則你將得到錯(cuò)誤。行為通常是一類沒有返回值(return value)的函數(shù),但是它可以完成一些有用的執(zhí)行,如(assert)和(retract)。這里的函數(shù)名是“assert”,它的參數(shù)是“duck”。CLIPS中的函數(shù)(function)是一段可執(zhí)行代碼,該段代碼被特定的函數(shù)名標(biāo)識,返回有用的值或產(chǎn)生有用的副作用,如(printout)。模式和行為的數(shù)量并不一定得相等,這就是上面例子中用N和M來代指的意義。每個(gè)模式包含一個(gè)或多個(gè)字段。C