【正文】
我們在前面七章中將僅僅討論事實,但也有許多對模式匹配應用于對象做了討論。所有前面你已經(jīng)看到的事實都是有序事實,因為字段的順序決定了它們的不同。有序事實必須用字段對位于其定義的數(shù)據(jù)。這與在C和其他語言中應用結構體一樣。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.CLIPSCLIPS(clear)CLIPS(assert (Theducksays“Quack”))Fact1CLIPS(facts)f0 (initialfact)f1 (The duck says “Quack”)For a total of 2 facts.CLIPSCLIPS會認為f1與f2是兩個不同的事實,這一點很重要。舉例說明,增加事實(duck)和(Duck),然后調用(facts)命令,你會發(fā)現(xiàn)CLIPS增加了兩個不同的事實(duck)和(Duck),這正是因為CLIPS是區(qū)分大小寫的緣故。良好的文檔處理在專家系統(tǒng)中比其他語言如Jave,C,Ada等更顯重要,這是因為專家系統(tǒng)中的規(guī)則并不是普通的按順序執(zhí)行。(animalis duck)(animalis horse)(animalis cow)一個明確的關聯(lián),animalis和animals,比隱式的定義(duck),(horse)和(cow)能使人們得到更多的信息。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如果你想在事實中包含空格,那么你必須使用雙引號,舉例如下: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.CLIPSCLIPS(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)[PRNTUTIL1] Unable to find fact f3.CLIPSCLIPS(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撤銷多條事實,只要在retract命令后跟上相應的事實索引號即可。 監(jiān)視事實CLIPS提供了一些幫助你調試程序的命令。右雙箭頭符號==表示事實正在被添加到內存中,左雙箭頭==表示事實正在從內存中移除,如下所示:你可以監(jiān)視的項目有很多,下面列舉出來,在《CLIPS參考指南》中有詳細的表述。 應用于對象(watch slots) 。 應用于對象(watch deffunctions)(watch pilations) 。通過輸入unwatch命令可以關閉監(jiān)視(watch)命令。不久,你將會看到一個細目菜單。第二章 規(guī)則如果你想你的生活碩果累累,那么別打破規(guī)則而是去制定規(guī)則!在前面一章中的學習中,你已經(jīng)對事實有所了解了。一條規(guī)則與程序語言如Java,C或Ada中的IF THEN表述非常相似。偽代碼不能被計算機識別和執(zhí)行,但是它對書寫可執(zhí)行代碼提供了有用的指南。你可以在CLIPS中直接輸入規(guī)則,也可以新建一個文本文件,將規(guī)則寫在里面,然后加載到CLIPS中來。規(guī)則名緊跟在關鍵字defrule后面。如果你按照上面正確的輸入,你便會看到CLIPS的提示符出現(xiàn),否則,你將會看到一個錯誤消息提示。同時也增加了可選的規(guī)則頭(ruleheader)注釋:“Here es the quack”。基于對象的模式匹配將稍后討論。CLIPS忽略注釋里的內容。 模式= 。也就是說,CLIPS中可能有許多條規(guī)則,但是只能有一條被命名為“duck”的規(guī)則。 由一些在“=”之前的元素組成的規(guī)則左部分(pattern_2)...(pattern_N)=(action_1) 。保證你的圓括弧完整,否則你將得到錯誤。這里的函數(shù)名是“assert”,它的參數(shù)是“duck”。模式和行為的數(shù)量并不一定得相等,這就是上面例子中用N和M來代指的意義。CLIPS試圖將模式與事實表中的事實進行匹配,如果規(guī)則的模式與事實匹配成功,規(guī)則將會被激活(activated)而放入到議程(agenda)中。規(guī)則的最后部分為零個或多個行為,當規(guī)則被觸發(fā)(fire)時,這些行為將會被執(zhí)行。CLIPS依照增加優(yōu)先權和特權(salience)來對議程的激活排序。隨后該條規(guī)則將會被移出議程,接下來最高特權規(guī)則的行為將會被執(zhí)行。如果沒有顯式的聲明特權值,則CLIPS默認為0。前面知道了ducksound規(guī)則的模式左部為:之所以稱之為字面意味著有一個常數(shù)值,與之對立的是值可以改變的變量。(save “”)這也許讓人有一點沮喪,然而,在你做出一些極端的減輕沮喪的事情之前如狠踢你的寵物鴨你得多了解一些專家系統(tǒng)的基本原理。 之前不存在的不同的新的模式實體或2.舉個例子,舊模式實體的副本便是一個新的模式實體。推理機通過特權值將激活進行分類。當有適當?shù)拇碳r,神經(jīng)細胞會激發(fā)出一定的電壓脈沖,神經(jīng)細胞激活后,將遭受折射(refraction)并在一定時期內不能被再次觸發(fā)。在現(xiàn)實世界中,引起觸發(fā)的刺激最終都會消失。右箭號表明激活和事實正在被添加,左箭號表明已存在的事實和激活。 實體索引CLIPS(assert (animalis duck)) 。 duck: f1For a total of 1 activation.CLIPS(run)==f2 (soundis quack)CLIPS(agenda) 。你也可以撤銷事實然后又重新添加作為新的事實來讓規(guī)則重復觸發(fā)。CLIPS(ppdefrule duck)(defrule MAIN::duck(animalis duck)=(assert (soundis quack)))CLIPS你可以定義模塊,將規(guī)則與那些可以被其他編程語言不同包裝,模塊,過程或函數(shù)納入的聲明類比。CLIPS(rules)DuckFor a total of 1 defrule.CLIPS舉例如下:一定記得在printout命令后輸入“t”,這將告知CLIPS將結果輸出到電腦的標準輸出設備(standard output device)中。在使用該特性的時候要注意不要太過于自由以免你的程序被人為控制太多。load命令載入前面你已經(jīng)保存在磁盤中命名為“”文件或者相應文件夾下的任何文件名里的規(guī)則。這樣,CLIPS內存會不加解釋的快速讀取這些二進制規(guī)則。batch命令允許你像在頂層輸入一樣執(zhí)行一個文件命令。第三章 詳細資料問題不是大局,而是細節(jié)。然而,只包含一條規(guī)則的專家系統(tǒng)無疑作用有限。舉個例子,紅燈和綠燈情況下的規(guī)則按如下書寫:再增加一個(light green)事實并運行,你會看到“Go”被打印出來。行人或行車的信息必須被添加,此外交通燈的狀態(tài)信息也得添加。上面的規(guī)則中包含有兩個模式,規(guī)則的每個模式必須在事實表中有相對應的事實滿足才能觸發(fā)。這種約束類型被稱為邏輯與條件元素(logical AND conditional element(CE)),是關于布爾型的“與”關系?!氨仁澜缟掀渌娜速u出更多的多脂漢堡,賺更多的錢!”在專家系統(tǒng)中,strategy術語的一個用法是激活的沖突消解。在不考慮具體的應用軟件程序時,很難說清哪一種策略更好。當CLIPS第一次啟動時,該默認設置便會被自動設置,后面,你可以更改默認設置?,F(xiàn)在,你知道了所有的這些可選設置是多么的有用,一定得記?。寒斈氵\行一個由你和其他人共同編寫的專家系統(tǒng)時,要保證你們的設置是一致的。如果你準備在程序運行的時候用到相同的聲明,首先你可以用批處理文件加載磁盤里的聲明,其次,你還可以使用自定義事實關鍵字:deffacts。 被聲明的事實CLIPS(reset) 。事實名或注釋后面便是將要被聲明到事實表中的事實,自定義的事實由CLIPS的(reset)命令聲明添加。它被用來對那些顯式匹配于該事實的程序向后兼容??偠灾?,(reset)命令作用于事實有三點:(1)將存在的事實從事實表中移除,同時也會移除議程中的激活規(guī)則。選擇性消除undeffacts命令的作用是通過消除內存中的自定義事實來撤銷(deffacts)聲明事實。如果執(zhí)行了(undeffacts)后,想保存一個自定義事實聲明,則必須重新定義。監(jiān)視統(tǒng)計(watch statistics)給出已經(jīng)觸發(fā)規(guī)則數(shù),執(zhí)行時間,每秒規(guī)則數(shù),事實的平均數(shù),事實的最大數(shù),激活的平均數(shù)和激活的最大數(shù)等信息。使用dribble命令打印和查看信息到屏幕或磁盤,將會使你的程序稍微變慢,這是因為CLIPS需要花較多的時間去打印或保存信息到磁盤中去。(dribbleon filename)(dribbleoff filename)(step)命令等同于(run 1)。showbreaks命令顯示所有設置斷點的規(guī)則。多數(shù)情況下,出現(xiàn)錯誤的原因是你書寫規(guī)則的方式不對。讓我們來看看(matches)起著怎樣的作用,首先輸入(clear)命令,然后輸入下面的規(guī)則: 條件因素3= (printout t “Let’s go!!!” crlf)) CE即條件元素NonePartial matches for CEs 1 – 3NoneActivationsNoneCLIPS舉個例子,一個規(guī)則有四個模式,有可能第一個和第二個模式或第三個模式都可能匹配成功,但,只有當所有的模式都匹配,這條規(guī)則才能被激活。函數(shù) 作用assertstring 以字符串作為參數(shù)執(zhí)行一個字符聲明和作為一個無字符串事實的聲明strcat 通過字符串(string concatenation)從單項目中構建一個單引號字符串strindex 返回第一次出現(xiàn)子串的字符串索引(string index)substring 返回一個字符串的子字符串strpare 執(zhí)行字符串比較(string pare)strlength 返回字符串的長度(string pare)symcat 返回連結符號迄今為止,你已經(jīng)了解了一些規(guī)則的類型,簡單的闡述了規(guī)則的模式與事實匹配的一些內容。相比之下,一旦一個事實被聲明,它的字段僅僅只能被撤銷和重新聲明一個該字段的事實而修改,甚至,這些事實的撤銷和聲明修改(將在本章后面的deftemplate中詳細描述)是通過你所知道的修改事實索引執(zhí)行的。全局變量將在后面詳細講到,與上面的句法比較有些許不同。在一個變量能夠被使用之前,它必須被分配一個值。當CLIPS不能找到?x變量的約束值(value bound)時,便會拋出一個錯誤的提示。在一條規(guī)則被觸發(fā)前后,如果非全局變量沒有被約束,那么當你嘗試調用該變量時,CLIPS就會給出一個錯誤提示。聲明事實(ducksound quack),然后用(run)命令運行程序,檢查規(guī)則,你