專家系統(tǒng)實驗報告_第1頁
專家系統(tǒng)實驗報告_第2頁
專家系統(tǒng)實驗報告_第3頁
專家系統(tǒng)實驗報告_第4頁
專家系統(tǒng)實驗報告_第5頁
已閱讀5頁,還剩51頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

專家系統(tǒng)”實驗報告專業(yè): 智能科學與技術班級:1102學號:姓名: 2014年6月5日實驗1 專家系統(tǒng)與CLIPS實驗內(nèi)容提要:專家系統(tǒng)不僅是具有特定的結(jié)構(gòu),同時,它還有多種知識表示形式,及其相應的知識推理方法。因此,直接采用程序設計語言實現(xiàn)專家系統(tǒng)是比較困難的,而采用適當?shù)膶<蚁到y(tǒng)開發(fā)工具則可以大大降低系統(tǒng)開發(fā)的難度。因此,本章結(jié)合麥粒腫系統(tǒng)專斷專家系統(tǒng)開發(fā)的需要,首先安排了對專家系統(tǒng)及其開發(fā)工具CLIPS基本理論知識,以及CLIPS基本理論知識,以及CLIPS基本使用方法的概要介紹,目的是為第6章“麥粒腫診斷專家系統(tǒng)開發(fā)”做好準備。實驗重點:A專家系統(tǒng)的一般結(jié)構(gòu)>產(chǎn)生式規(guī)則的表示及其正向推理>專家系統(tǒng)開發(fā)工具的結(jié)構(gòu)和特點>專家系統(tǒng)開發(fā)工具CLIPS的基本語法>專家系統(tǒng)開發(fā)工具CLIPS的基本使用實驗目的>掌握專家系統(tǒng)的一般結(jié)構(gòu)>掌握產(chǎn)生式規(guī)則的表示及其正向推理>掌握專家系統(tǒng)開發(fā)工具的結(jié)構(gòu)和特點>了解專家系統(tǒng)開發(fā)工具CLIPS的設計目標與特點>掌握專家系統(tǒng)開發(fā)工具CLIPS的基本語法>掌握專家系統(tǒng)開發(fā)工具CLIPS的基本使用實驗內(nèi)容及要求A學習專家系統(tǒng)的一般結(jié)構(gòu)>學習產(chǎn)生式規(guī)則的表示及其正向推理>學習專家系統(tǒng)開發(fā)工具的結(jié)構(gòu)和特點>學習專家系統(tǒng)開發(fā)工具CLIPS的設計目標與特點>學習專家系統(tǒng)開發(fā)工具CLIPS的基本語法>學習專家系統(tǒng)開發(fā)工具CLIPS的基本使用實驗步驟本實驗包括以下六個具體步驟,分別是:學習專家系統(tǒng)的一般結(jié)構(gòu)、學習產(chǎn)生式規(guī)則的表示及其正向推理、學習專家系統(tǒng)開發(fā)工具的結(jié)構(gòu)和特點、學習專家系統(tǒng)開發(fā)工具CLIPS的設計目標與特點、學習專家系統(tǒng)開發(fā)工具CLIPS的基本語法,以及學習專家系統(tǒng)開發(fā)工具CLIPS的基本使用。學習專家系統(tǒng)的一般結(jié)構(gòu):專家系統(tǒng)(ES,ExpertSystem)是利用大量專家知識,運用只是推理方法解決特定領域中實際問題的計算機程序系統(tǒng)。專家系統(tǒng)由產(chǎn)生式規(guī)則專家系統(tǒng)發(fā)展而來,主要包括知識庫、推理機、綜合數(shù)據(jù)庫、知識獲取程序、人機接口,以及解釋程序六大部分。其中,知識庫、推理機、綜合數(shù)據(jù)庫,以及人際接口是目前大多數(shù)專家系統(tǒng)的主要內(nèi)容,而知識獲取程序和解釋則是所有專家系統(tǒng)都期望具有的兩個模塊。在專家系統(tǒng)的一般結(jié)構(gòu)中,知識庫用于存放各領域?qū)<姨峁┑慕?jīng)驗性知識:綜合數(shù)據(jù)庫用于存放關于問題求解的初始數(shù)據(jù)、中間結(jié)果、假設、目標,以及最終求解結(jié)果(事實);推理機在一定的控制策略下針對綜合數(shù)據(jù)庫中的當前信息,識別和選取知識庫中對當前問題求解有用的知識進行推理;知識獲取程序完成把專家只是按一定表示形式輸入到知識庫中,部分代替知識工程師進行知識的自動獲取,實現(xiàn)專家系統(tǒng)的字學習,不斷完善知識庫;解釋程序可以根據(jù)用戶提問,對系統(tǒng)給出的結(jié)論、求解過程,以及系統(tǒng)當前求解狀態(tài)提供說明,便于用戶理解系統(tǒng)的問題求解,增加用戶對系統(tǒng)求解結(jié)果的信任程度,在知識庫的完善過程中,便于專家或知識工程師發(fā)現(xiàn)和定位知識庫中的錯誤,便于各領域的專業(yè)人員或初學者能夠從問題的求解過程中得到直觀學習;人機接口將專家愛或用戶的輸入信息翻譯為系統(tǒng)可接受的內(nèi)部形式,同時,也把系統(tǒng)向?qū)<一蛴脩糨敵龅男畔⑥D(zhuǎn)化成人類易于理解的外部形式。學習產(chǎn)生式規(guī)則的表示及其正向推理目前,用于專家系統(tǒng)的知識表示形式主要有謂詞邏輯、產(chǎn)生式規(guī)則、語義網(wǎng)絡、框架,以及劇本。其中,采用產(chǎn)生式規(guī)則知識表示形式建立的專家系統(tǒng)最為流行和廣泛,這主要因為:首先,產(chǎn)生式規(guī)則知識表示容易被人理解;其次,它基于演譯推理,保證了推理結(jié)果,的準確性;最后,大量產(chǎn)生式規(guī)則可以連接成多棵推理樹,樹的寬度反映了實際問題的范圍,樹的深度反映了問題的難度。產(chǎn)生式規(guī)則一般表示為:如果A成立,則B成立,簡記為A->B,其中A是前提,B是結(jié)論。一般來說,不同的產(chǎn)生式規(guī)則之間都是有聯(lián)系的,即謀條產(chǎn)生式規(guī)則的前提實力外一條產(chǎn)生式規(guī)則的結(jié)論。如果把規(guī)則庫(知識庫)中所包含的總目標(某些規(guī)則的結(jié)論)作為根節(jié)點,按規(guī)則的前提和結(jié)論展開形成樹的形式,則形成的樹就被稱為推理樹或知識樹,它把規(guī)則庫中的所有規(guī)則都連接了起來。產(chǎn)生式規(guī)則的推理分為正向推理和逆向推理兩種,這里主要介紹正向推理。產(chǎn)生式規(guī)則的正向推理過程是:逐條搜索規(guī)則庫,對每一條規(guī)則的的前提條件檢查實事庫(綜合數(shù)據(jù)庫)中是否存在。若再事實庫中前提條件的個子項不是全部存在,則放棄該條規(guī)則;若在事實庫總?cè)看嬖?,則實行該規(guī)則,把結(jié)論放入事實庫中。反復循環(huán)執(zhí)行上述過過程,直至推出目標,并存入事實庫中為止。學習專家系統(tǒng)開發(fā)工具的結(jié)構(gòu)和特點開發(fā)專家系統(tǒng)主要有三條途徑:直接使用程序設計語言,如LISP或PROLOG等;使用知識獲取工具,如知識獲取系統(tǒng)(KAS,KnowledgeAcquisitionSystem)到等;利用專家系統(tǒng)開發(fā)工具,如CLIPS或M.1等。專家系統(tǒng)開發(fā)工具一般包括開發(fā)環(huán)境和運行環(huán)境兩部分。其中,開發(fā)環(huán)境有知識編輯、編譯模塊,知識庫查詢、維護模塊,數(shù)據(jù)庫查詢、維護模塊,知識庫,以及實事庫組成;運行環(huán)境有推理機,解釋機制,人機交互,知識庫,以及實事庫組成。知識庫和實時庫即被包括在開發(fā)環(huán)境中,同時也被包括在運行環(huán)境中,它們都有一定的格式要求,知識和事實由開發(fā)環(huán)境輸入,提供給運行環(huán)境使用。從專家系統(tǒng)開發(fā)工具的結(jié)構(gòu)可以看出,專家系統(tǒng)開發(fā)工具具有一下特點:首先,工具有開發(fā)環(huán)境和運行環(huán)境組成,開發(fā)環(huán)境用于建立知識庫、實事庫、并修改、查詢知識庫和事實庫;對指定知識表示形式的推理機和解釋機制預先已經(jīng)做好;運行環(huán)境的目的在于支持實際系統(tǒng)的運行。其次,工具提供了一套用于開發(fā)專家系統(tǒng)的語言,包括知識標示語言和工具操作語言。其中,只是表示語言用于完成外部知識到內(nèi)部知識的編譯;利用工具操作語言可以使用工具中的開發(fā)環(huán)境,實行運行環(huán)境中的功能。學習專家系統(tǒng)開發(fā)工具CLIPS的設記目標與特色CLIPS(CLanguageIntegratedProductionSystem)是由美國國家航天局約翰遜空間中心人工智能部在1985年推出的專家系統(tǒng)開發(fā)工具,其設計目標和特色包括:>可用于管理、工業(yè)、商業(yè)、文教等各種領域的專家系統(tǒng)開發(fā),具有廣泛的通用性;>適用于各種型號的計算機,從 IBMPC及其兼容機,到VAX,HP,SUNMACINTOSH,直至【」CRAY,都可以運行CLIPS,具有對機型的廣泛適用性>與已有的普通軟件系統(tǒng)易于集成,同F(xiàn)ortran、ADA等高級程序設計語言均有接口,為用戶提供了方便>用C語言寫成,運行速度快>具有不確定性下進行推理的能力正是由于上述設計目標與特色,加之美國國家航天局對CLIPS采取公開化,以及免費使用的政策,CLIPS在眾多的專家系統(tǒng)開發(fā)工具中深受歡迎,CLIPS研制小組也因而獲得美國航天科技獎CLIPS與比它早的專家愛系統(tǒng)開發(fā)工具ART、OPSS有很密切的關系,繼承與吸收了ART、OPSS的長處與優(yōu)點。但是由于CLIPS最求的簡單實用,以極高度的可移植性,因此,只提供了正向推理能力、CLIPS的發(fā)展歷史證明,這并不影響他成為一個有效的專家系統(tǒng)開發(fā)工具。學習專家系統(tǒng)開發(fā)工具CLIPS的基本語法為了支持麥粒腫診斷專家系統(tǒng)CLIPS程序的編寫,以下將分別從符號體系、語言符號、事實、規(guī)則、注釋、printout命令、變量、字符通配符、特權、read函數(shù),以及其他常用命令等11各方面,對CLIPS的基本語法進行概要介紹。符號體系CLIPS的符號體系包括以下三種類型。>需要完全照樣輸入計算機的字和字符,即不被<>、[]、{}所括住的所有內(nèi)容,比如(example)。方括號表示其中的內(nèi)容可有可無,比如在(example[l])中,方括號中的1是任選的,即輸入(example)和(example1)都是允許的。尖括號表式其中的字所表示的意義要用一個相應的任意值代替,比如(examplevinteger>)表示在example后面一定要跟一個任意整數(shù),即應輸入(example1)、(example5)或者(example-20)等。>對于用雙尖括號括住的描述,表示任意多個(包括0個)與其中的自相應的值,比如vvinteger〉〉,見到這一描述,可以輸入1,1 2,1 23,1 48,或-15,也可以不輸入任何內(nèi)容。對于用三尖括號括住的描述,表示任意多個(但不包括0個)與其中的字相應的值,比如vvvinteger>>>,相當于vinteger〉vvinteger>>。>用于大括號括住的描述表示選用其中的任意一項(必須一項,但也僅一項)輸入,比如{all,none,some},可以輸入all,或者輸入none,或者輸入some。語言符號在CLIPS主要的語言符號單位是“字段”,也稱為“域”(field)。字段包括以下三種類型。>字(word)。字以可以打印的ASCII字符開始,后隨零個或多個字符。但是“v”、“|”、“&”、“$”、“?”、“+”、“-”、“()”字符及其組合不能作為字的開始字符。另外,字中間也不能包含“v”、“I”、“&”、“()”字符,因為這些字符在CLIPS中有特殊用途,即作為字的界限符,表示字的結(jié)束。最后,CLIPS認為統(tǒng)一字母的大、小寫是兩個不同的字。根據(jù)一項規(guī)定,以下均為有效的CLIPS字:emergencyfireemergency-fireactivate-sprinkler-systemnotify-fire-departmentshut-down=electrical-junction-387!?#$人*字串(string)。字串以引號開始和結(jié)束,雙引號和結(jié)束,雙引號本身是字串的一部分,期間可以有零個或任意個字符,比如“Activatethesprinklersystem”。數(shù)值字段或簡稱數(shù)值(number),表示浮點數(shù)。在CLIPS中,所有的數(shù),包括整型值的數(shù),都以浮點數(shù)形式存儲。數(shù)值字段包括三個部分:符號、值和指數(shù)。其中,符號和指數(shù)是任選的。呼號或為+,或為-;值包括一個或多個數(shù)字,以及一個任選的小數(shù)點;指數(shù)包括字母e或E,后隨任選的+或-,其后是一個或多個數(shù)字。根據(jù)以上規(guī)定,1,1.2,.7,+3,-1,65,3.5elO都是CLIPS中有效的數(shù)值字段數(shù)值為了解題,CLIPS程序必須有據(jù)以推理的數(shù)據(jù)或信息,這在CLIPS中被稱為“事實”(fact)。事實由配對的左、右圓括號括住的一個或多個字段組成,比如(single-field)和(twofields)。CLIPS所承認的事實都保存在事實表(fact-list)中,新的事實用assert命令加入事實表,其語法格式為:(assertvvvfact>>>)。比如表示發(fā)生火警的事實(emergencyfire)就可以使用命令(assert(emergencyfire))加入到事實表中。雖然CLIPS不接受重復輸入的事實,但是可以使用一個assert命令同時輸入多個事實。比如,可以使用命令(assert(emergencyfire)(emergencyflood)。將兩個事實(emergencyfire)(emergencyflood)同時加入事實表中。撤銷事實表中已經(jīng)竄在的事實使用retract命令,其語法格式為:(retractvvvfact-index>>>。。其中,fact-index稱為事實索引號,是CLIPS賦予事實的標識,用于區(qū)分事實表眾不同的事實。使用一個retract命令可以一次同時撤銷一個或多個事實。比如,使用命令(retract1)可以撤銷事實表中事實索引號為1的一個事實,而使用命令(retract123。則可以同時撤銷事實表中事實索引號為1、2、3的三個事實。使用facts命令可以顯示當前事實表中存在的所有事實.規(guī)則規(guī)則用以表示推理和行為的過程,它描述了題的狀態(tài)轉(zhuǎn)移、性質(zhì)變化等內(nèi)容。在CLIPS中,定義規(guī)則使用的defrule命令,其語法格式為:(defrule<rule-name>[optionalcomment]<<patterns>>=><<actions>>)其中,命令的第一行是規(guī)則標題,由三部分組成,分別是:關鍵字defrule;規(guī)則明rule-name,可以為任意有效地CLIPS字,但必須唯一,如果新輸入的規(guī)則明與已經(jīng)存在的規(guī)則明相同,則已經(jīng)存在的規(guī)則將被新規(guī)則所取代;注解optionalcomment,可有可無u,但必須是一雙引號開始和結(jié)尾的字串。命令的第二行是零個或多個模式pattern,也就是規(guī)則的左端條件部分。每個模式由一個或多個字段組成。對于無模式的情況,系統(tǒng)將自動加入一個模式(initial-fact)。命令的第三行是一個箭頭,由一個等號和一個大于號組成。命令的第四行是規(guī)則的右端動作部分,它給出了動作表,這部分也可以為空。一下是一個使用defrule命令,定義一個名為fire-emergency的規(guī)則的例子,其含義是“如果發(fā)生的緊急情況是火災,那么就啟動噴淋裝置”(defrulefire-emergency"Anexamplerule"(emergencyfire)=>(assert(actionactivate-sprinkler-system)))使用rules命令或pprule命令可以顯示當前規(guī)則庫中的規(guī)則。其中,使用rules命令將顯示當前規(guī)則庫總存在的所有規(guī)則的名稱;而使用pprule命令則可以顯示某個規(guī)則的文本內(nèi)容注釋為了方便對程序邏輯的理解,增強代碼的可讀性,應該在代碼中加入必要的注釋。CLIPS中,注釋以“;”開頭,一會可換行結(jié)束,比如一下代碼:***************************;*題目 :火災報警*;*日期 :2006年7月*實驗結(jié)果圖如下實驗二麥粒腫診斷專家系統(tǒng)開發(fā)內(nèi)容提要:學習專家系統(tǒng)基本理論知識及其開發(fā)工具最終目的是為了進行實際系統(tǒng)的開發(fā)。因此,在上一章內(nèi)容的基礎上,本章首先安排了對專家系統(tǒng)開發(fā)過程的概要介紹。然后,結(jié)合相應的基本理論知識,詳細介紹了麥粒腫診斷推理樹的繪制、麥粒腫診斷專家系統(tǒng)CLIPS程序的編寫,以及以批處理方式運行麥粒腫診斷專家系統(tǒng)的具體過程。本章重點A專家系統(tǒng)的開發(fā)過程。>繪制麥粒腫診斷推理樹。>編寫麥粒腫診斷專家系統(tǒng)CLIPS程序。>以批處理方式運行麥粒腫診斷專家系統(tǒng)。實驗目的>掌握專家系統(tǒng)的開發(fā)過程。>掌握根據(jù)產(chǎn)生式規(guī)則繪制相應推理樹的方法。>掌握使用記事本編寫CLIPS應用程序的方法。>掌握以批處理方式運行CLIPS應用程序的方法。實驗內(nèi)容與要求>學習專家系統(tǒng)的開發(fā)過程。>根據(jù)以下給出的麥粒腫診斷產(chǎn)生式規(guī)則繪制相應的麥粒腫診斷推理樹。R1:毛囊皮根微紅腫-輕型。R2:鼻塞流涕-外感風熱。R3:舌苔薄黃人胃納差-胃腸積熱。R4:眼瞼局部明顯紅腫—重型。R5:眼瞼局部紅腫人頂尖有膿點—重型。R6:膿點破潰-晚期。R7:輕型人外感風熱-輕風熱型。R8:重型人外感風熱—重風熱型。R9:重型人胃腸積熱—重積熱型。R10:輕型—散痢法。R11:晚期—外敷藥物。R12:輕風熱型—散癩加罐。R13:重風熱型—挑痢加罐。R14:重積熱型—放血法。為了后續(xù)編碼的方便,在推理樹的繪制過程中,首先,應以漢語拼音首字母的形式為每一條產(chǎn)生式規(guī)則的前提和結(jié)論進行編碼,如“散癩法”可以編碼為“SLF”。其次,對于單前提的規(guī)則,在相應的推理樹弧上應標出其相應的規(guī)則編號,而對于具有兩個或多個前提,且前提間具有“并且”關系的規(guī)則,

則應在其相應的推理樹弧之間使用帶有規(guī)則編號的曲線來表示。參考繪制的推理樹,使用記事本編寫麥粒腫診斷專家系統(tǒng)CLIPS程序。系統(tǒng)運行時,首先對所有的癥狀進行提問,收集“yes”或“no”的回答;然后,根據(jù)提出的產(chǎn)生式推理規(guī)則進行正向推理,如果能夠推出治療方法,則顯示治療方法,并提示是繼續(xù)開始新一輪的推理還是退出程序;如果不能推出治療方法,則直接提示是繼續(xù)開始新一輪的推理還是推出程序。以批處理方式運行麥粒腫診斷專家系統(tǒng)。編寫麥粒腫診斷專家系統(tǒng)開發(fā)實驗報告書。具體格式參考附錄A。實驗步驟本實驗包括以下五個具體步驟,分別是:學習專家系統(tǒng)的開發(fā)過程、繪制麥粒腫推理樹、編寫麥粒腫診斷專家系統(tǒng)CLIPS程序、以批處理方式運行麥粒腫診斷專家系統(tǒng),以及編寫麥粒腫診斷專家系統(tǒng)開發(fā)實驗報告。1學習專家系統(tǒng)的開發(fā)過程專家系統(tǒng)一般是由專家和知識工程師共同配合研制而成的。專家可以不懂計算機,但他一定是某個實際領域經(jīng)驗豐富的人,而知識工程師則是既懂計算機和專家系統(tǒng)原理,同時又具有編程專家系統(tǒng)能力的人。專家系統(tǒng)的開發(fā)一般遵循如圖2-1所示的過程:首先,在知識工程師的引導和啟發(fā)下,專家提供解決實際領域中問題的基本知識和經(jīng)驗;其次,知識工程師根據(jù)對專家知識及專家系統(tǒng)的理解設計知識庫、推理機等模塊;最后,知識工程師利用知識工程語言編制知識庫、推理機等模塊程序,并將模塊程序集成為專家系統(tǒng)。專引導和啟發(fā)知識和經(jīng)驗知識工程師專引導和啟發(fā)知識和經(jīng)驗知識工程師設計知識庫設計推 建立專理機等 家系統(tǒng)模塊同2-1專家系統(tǒng)開發(fā)過程2繪制麥粒腫診斷推理樹根據(jù)上述的專家系統(tǒng)開發(fā)過程,由于進行麥粒腫診斷的產(chǎn)生式規(guī)則已經(jīng)在實驗要求2)中給出,而根據(jù)第5章實驗4對專家系統(tǒng)開發(fā)工具的結(jié)構(gòu)和特點,以及CLIPS的介紹可知,針對產(chǎn)生式規(guī)則的知識表示,相應的正向推理機和解釋機制也已經(jīng)在CLIPS中預先做好。因此,利用CLIPS開發(fā)麥粒腫診斷專家系統(tǒng)的主要工作就只剩下編寫代碼,將實驗要求2)中給出的產(chǎn)生式規(guī)則放入規(guī)則庫(知識庫),最終建立麥粒腫診斷專家系統(tǒng)。為了方便對麥粒腫診斷專家系統(tǒng)的編碼,建議首先根據(jù)已知的產(chǎn)生式規(guī)則繪制出相應的推理樹。如果把規(guī)則庫(知識庫)中所包含的總目標(某些規(guī)則的推論)作為根節(jié)點,按規(guī)則的前提和結(jié)論展開形成樹的形式,這樣形成的樹就被稱為推理樹或知識樹,它把規(guī)則庫中的所有規(guī)則都連接起來。根據(jù)上述對推理樹的定義,以及在實驗要求2)中給出的14條麥粒腫診斷產(chǎn)生式規(guī)則,首先,以治療麥粒腫的五種具體方法(散痢法、散癩加罐、挑痢加罐、放血法和外敷藥物)作為根節(jié)點。然后,將所有規(guī)則的其他前提和結(jié)論作為其他節(jié)點,規(guī)則作為連接結(jié)點間的弧,按規(guī)則的前提和結(jié)論展開,就可以形成如圖2-2所示的麥粒腫診斷推斷樹。需要說明的是:在圖2-2的推理樹繪制過程中,為了后續(xù)編碼的方便,首先,以漢語拼音首字母的形式為每一條產(chǎn)生式規(guī)則的前提和結(jié)論進行了編碼,規(guī)則的前提和結(jié)論于編碼的對應關系如表2-1所示。表2-1規(guī)則的前提和結(jié)論與編碼的對應關系

規(guī)則的前提/結(jié)論編碼規(guī)則的前提/結(jié)論編碼毛囊皮根微紅腫MNPGWHZ鼻塞流涕BSLT舌苔薄黃STBH胃納差WNCH眼見局部明顯紅腫YJJBMXHZ眼見局部紅腫YJJBHZ頂尖有膿點DJYND膿點破潰NDPK輕型QX外感風熱WGFR胃腸積熱WCJR重型ZX晚期WQ輕風熱性QFRX重風熱型ZFRX重積熱型ZJRX散痢法SLF外敷藥物WFYW散癩加罐SLJC挑痢加罐TLJG放血法FXF其次,對于但前提的規(guī)則,在相應的推理樹弧上都標出了其相應的規(guī)則編號,比如,在“SLF”和“QX”之間的弧上標出了“R10”,而對于具有兩個前提,且前提間具有“并且”關系的規(guī)則,則在其相應的推理樹弧之間使用帶有規(guī)則編號的曲線來表示,比如,在分別連接“QFRX”與“QX”,以及“QFRX”與“WGFR”的兩條弧之間使用了標有“R7”的曲線。3編寫麥粒腫診斷專家系統(tǒng)CLIPS程序由于CLIPS的當前版本還不能正確地處理中文,而在編寫代碼的過程中,使用中文注釋可以有效地提高代碼的可讀性,因此,本節(jié)在編寫麥粒腫診斷專家系統(tǒng)代碼時沒有直接使用CLIPS提供的編輯環(huán)境,而是借助了windows操作系統(tǒng)自帶的記事本(notpad)應用程序,使用記事本編寫麥粒腫診斷專家系統(tǒng)代碼的具體步驟如下。單擊操作系統(tǒng)桌面左下方的“開始”—“所有程序”—“附件”—“記事本”選項,啟動記事本程序。單擊記事本程序菜單欄上的“文件”—“保存”選項,在彈出的“另存為”對話框文件名右側(cè)的下拉框中輸入 “mlzzdzjxt.clp”,更換存儲路徑為“c:\jczcyzjxt\zjxt”,修改“保存類型”下拉框為“所有文件”,然后,單擊“保存”按鈕,保存文件。;ruleinit:;ruleinit:;初始化程序;**麥粒腫診斷專家系統(tǒng) **(defruleinit(declare(salience9980))?x<-(initial-fact)=>(retract?x)(assert(start)));ruleend:;結(jié)束程序,退出CLIPS(defruleend(declare(salience9200))?w<-(stop)=>(exit));ruleckMNPGWHZ:;進行程序描述,提問毛囊皮根微紅腫(defruleckMNPGWHZ(declare(salience100))?x<-(start)=>(printouttcrlfcrlfcrlf"這個程序?qū)椭阋徊讲降剡M行麥粒腫的診斷"crlfcrlf"毛囊皮根微紅腫嗎?"crlf"選擇 y/n->")(retract?x)(assert(MNPGWHZ=(read))));ruleckBSLT:;提問鼻塞流涕(defruleckBSLT(declare(salience100))=>(printouttcrlfcrlf"=>(printouttcrlfcrlf"鼻塞流涕嗎?"crlf"選擇 y/n->")(assert(BSLT=(read))));ruleckYJJBMXHZ:;提問眼瞼局部明顯紅腫(defruleckYJJBMXHZ(declare(salience100))(BSLT?)=>(printouttcrlfcrlf"眼瞼局部明顯紅腫嗎?"crlf"選擇 y/n->")(assert(YJJBMXHZ=(read))));ruleckYJJBHZ:;提問眼瞼局部紅腫(defruleckYJJBHZ(declare(salience100))(YJJBMXHZ?)=>(printouttcrlfcrlf"眼瞼局部紅腫嗎?"crlf"選擇 y/n->")(assert(YJJBHZ=(read))));ruleckDJYND:;提問頂尖有膿點(defruleckDJYND(declare(salience100))(YJJBHZ?)=>(printouttcrlfcrlf"頂尖有膿點嗎?"crlf"選擇 y/n->")(assert(DJYND=(read))));ruleckSTBH:;提問舌苔薄黃(defruleckSTBH(declare(salience100))(DJYND?)=>(printouttcrlfcrlf"舌苔薄黃嗎?"crlf"選擇 y/n->")(assert(STBH=(read))));ruleckWNC:;提問胃納差(defruleckWNC(declare(salience100))(STBH?)=>(printouttcrlfcrlf"胃納差嗎?"crlf"選擇 y/n->")(assert(WNC=(read))));ruleckNDPK:;提問膿點破潰(defruleckNDPK(declare(salience100))(WNC?)=>(printouttcrlfcrlf"膿點破潰嗎?"crlf"選擇 y/n->")

;rulerule1:;規(guī)則1(defrulerule1a(declare(salience99))(MNPGWHZy)=>(assert(QXy)))(defrulerule1b(declare(salience99))(MNPGWHZn)=>(assert(QXn)));rulerule2:;規(guī)則2(defrulerule2a(declare(salience99))(BSLTy)=>(assert(WGFRy)))(defrulerule2b(declare(salience99))(BSLTn)=>(assert(WGFRn)));rulerule3:=>=>;規(guī)則3(defrulerule3a(declare(salience99))(STBHy)(WNCy)=>(assert(WCJRy)))(defrulerule3b(declare(salience99))(STBHn)=>(assert(WCJRn)))(defrulerule3c(declare(salience99))(WNCn)=>(assert(WCJRn)));rulerule4:;規(guī)則4(defrulerule4a(declare(salience99))(YJJBMXHZy)=>(assert(ZXy)));rulerule5:;規(guī)則5(defrulerule5a(declare(salience99))(YJJBHZy)(DJYNDy)(assert(ZXy)))(defrulerule5b(declare(salience99))(YJJBMXHZn)(YJJBHZy)(DJYNDn)=>(assert(ZXn)))(defrulerule5c(declare(salience99))(YJJBMXHZn)(YJJBHZn)(DJYNDy)=>(assert(ZXn)));rulerule6:;規(guī)則6(defrulerule6a(declare(salience99))(NDPKy)=>(assert(WQy)))(defrulerule6b(declare(salience99))(NDPKn)=>(assert(WQn)));rulerule7:;規(guī)則7(defrulerule7a(declare(salience98))(QXy)(WGFRy)=>(assert(QFRXy)))(defrulerule7b(declare(salience98))(QXn)=>(assert(QFRXn)))(defrulerule7c(declare(salience98))(WGFRn)=>(assert(QFRXn)));rulerule8:;規(guī)則8(defrulerule8a(declare(salience98))(WGFRy)(ZXy)=>(assert(ZFRXy)))(defrulerule8b(declare(salience98))(WGFRn)=>(assert(ZFRXn)))(defrulerule8c(declare(salience98))(ZXn)=>(assert(ZFRXn)));rulerule9:;規(guī)則9(defrulerule9a(declare(salience98))(ZXy)(WCJRy)=>(assert(ZJRXy)))(defrulerule9b(declare(salience98))(ZXn)=>(assert(ZJRXn)))(defrulerule9c(declare(salience98))(WCJRn)=>(assert(ZJRXn)));rulerule10:;規(guī)則10(defrulerule10a(declare(salience98))(QXy)=>(assert(SLFy)))(defrulerule10b(declare(salience98))(QXn)=>(assert(SLFn)));rulerule11:;規(guī)則11(defrulerule11a(declare(salience98))(WQy)=>(assert(WFYWy)))(defrulerule11b(declare(salience98))(WQn)=>(assert(WFYWn)));rulerule12:;規(guī)則12(defrulerule12a(declare(salience97))(QFRXy)=>(assert(SLJGy)))(defrulerule12b(declare(salience97))(QFRXn)=>(assert(SLJGn)));rulerule13:;規(guī)則13(defrulerule13a(declare(salience97))(ZFRXy)=>(assert(TLJGy)))(defrulerule13b(declare(salience97))(ZFRXn)=>(assert(TLJGn)));rulerule14:;規(guī)則14(defrulerule14a(declare(salience97))(ZJRXy)=>(assert(FXFy)))(defrulerule14b(declare(salience97))(ZJRXn)=>(assert(FXFn)));ruleresult1:;診斷結(jié)果1:采用散癩法(defruleresult1(declare(salience96))(SLFy)=>(printouttcrlfcrlf"診斷結(jié)果:可以采用散瘌法。"crlfcrlf)(assert(succeed)));ruleresult4:;診斷結(jié)果4:采用挑瘌加罐;ruleresult2:;診斷結(jié)果2:采用外敷藥物(defruleresult2(declare(salience96))(WFYWy)=>(printouttcrlfcrlf"診斷結(jié)果:可以采用外敷藥物。" crlfcrlf)(assert(succeed)));ruleresult3:;診斷結(jié)果3:采用散瘌加罐(defruleresult3(declare(salience96))(SLJGy)=>(printouttcrlfcrlf"診斷結(jié)果:可以采用散瘌加罐。" crlfcrlf)(assert(succeed)))

(defruleresult4(declare(salience96))(TLJGy)=>(printouttcrlfcrlf"診斷結(jié)果:可以采用挑瘌加罐。"crlfcrlf)(assert(succeed)));ruleresult5:;診斷結(jié)果5:采用放血法(defruleresult5(declare(salience96))(FXFy)=>(printouttcrlfcrlf"診斷結(jié)果:可以采用放血法。"crlfcrlf)(assert(succeed)));ruleresultSucceed:;有診斷結(jié)果(defruleresultSucceed(declare(salience95))(succeed)=>(printouttcrlfcrlf"以上是診斷結(jié)果,你可以選擇:"crlfcrlf”1)繼續(xù)診斷;”crlf"2)退出程序?!眂rlf"請輸入數(shù)字1或2:")(assert(choice_a=(read))))=>=>;rulefail:;沒有診斷結(jié)果;rulechoice2a:;選擇2:有診斷結(jié)果,退出程序(defrulefail(declare(salience95))(SLFn)(WFYWn)(SLJGn)(TLJGn)(FXFn)=>(printouttcrlfcrlf"沒有診斷結(jié)果,你可以選擇:"crlfcrlf”1)重新診斷;”crlf”2)退出程序?!眂rlf"請輸入數(shù)字1或2:")(assert(choice_b=(read))));rulechoice1a:;選擇1:有診斷結(jié)果,重新診斷(defrulechoice1a(choice_a1)=>(printouttcrlfcrlfcrlfcrlf”重新診斷;”crlfcrlf)(reset))

(printouttcrlfcrlfcrlfcrlf”退出程序?!眂rlfcrlf)(assert(stop)));rulechoice1b:;選擇1:沒有診斷結(jié)果,重新診斷(defrulechoice1b(choice_b1)=>(printouttcrlfcrlfcrlfcrlf”重新診斷:”crlfcrlf)(reset));rulechoice2b:;選擇2:沒有診斷結(jié)果,退出程序(defrulechoice2b(choice_b2)=>(printouttcrlfcrlfcrlfcrlf”退出程序?!眂rlfcrlf)(assert(stop)))(defrulechoice2a(choice_a2)實驗結(jié)果圖如下CLITS氐西CLITS氐西□回區(qū)IFiL?Ed.il Bx4cuiiion 也iMo曾liolpDIVIDE:DIVIDE:WindioY 匚|陌Facts叵Ml叵Ml父上至誥斷吳杲,少君;“邈縷診斷;訂退岀程膚力無人骯亨i戎疏:實驗三CLIPS代碼分析一實驗內(nèi)容分析CLIPS程序wine.clp,并對CLIPS編程方法進行分析,深入學習專家系統(tǒng)的編程方法。二實驗目的學習和理解CLIPS編程語言,通過分析用CLIPS編寫的挑選合適的葡萄酒來搭配膳食(簡稱擇美酒配佳肴)的程序,深入理解專家系統(tǒng)的編程技巧,加深對專家系統(tǒng)的認識和理解。三實驗要求1?該專家系統(tǒng)程序所屬類型。該專家系統(tǒng)知識表示方法。3?程序運行過程分析。4.實驗報告應包括算法描述。5.程序結(jié)果分析。實驗說明人們在用雙手創(chuàng)造屬于自己的幸福生活的同時,越來越注重享受生活,追求生活的質(zhì)感。吃是一種享受,吃好是一門學問。有了一桌美味佳肴,如何恰當?shù)靥暨x美酒,成就一場名副其實的美酒佳肴的盛宴呢?擇美酒配佳肴的專家系統(tǒng)呼之欲出。下面我們在具體的可選葡萄酒和膳食中來討論下?lián)衩谰婆浼央鹊膯栴}。問題描述如下:在了解用戶膳食的主要成分、調(diào)味汁、膳食口味,以及用戶對葡萄酒的酒體、顏色、甜度的喜好情況后,綜合考慮后,給用戶推薦搭配最得當?shù)钠咸丫?。其?膳食主要成分可選:meat,fish,poultry;調(diào)味汁口味可選:spicy,sweet,cream,tomato;膳食口味可選:delicate(清淡可口的),average(適中的),strong(重口味的)。酒體可選:lightbodied(清淡酒體),mediumbodied(中度酒體),fullbodied(醇厚酒體);顏色可選:red,white;甜度可選:dry(無甜味的),medium,sweet。(備注:向用戶提問搜集信息的時候,用戶除了上述可選項之外,還可以回答unknown。)可推薦葡萄酒清單如Sheetl所示:Sheet1TheWineListnamecolorbodysweetnessGamayredmediummediumsweetChabliswhitelightdrySauvignon-BlancwhitemediumdryChardonnaywhitemediumfullmediumdrySoavewhitelightmediumdryRieslingwhitelightmediummediumsweetGeverztraminerwhitefullanyChenin-Blancwhitelightmediumsweet

ValpolicellaredlightanyCabernet-SauvignonredanydrymediumZinfandelredanydrymediumPinot-NoirredmediummediumBurgundyredfullany選酒遵循規(guī)則IF-THEN:1.挑選最合適的酒體的規(guī)則R1:ifthenhas-sauceisyesandsauceisspicybest-bodyisfullR2:iftastinessisdelicatethenbest-bodyislightR3:iftastinessisaveragethenbest-bodyislightwithcertainty30andbest-bodyismediumwithcertainty60andbest-bodyisfullwithcertainty30R4:iftastinessisstrongthenbest-bodyismediumwithcertainty40andbest-bodyisfullwithcertainty80R5:ifhas-sauceisyesandsauceiscreamthenbest-bodyismediumwithcertainty40andbest-bodyisfullwithcertainty60R6:ifpreferred-bodyisfullthenbest-bodyisfullwithcertainty40R7:ifpreferred-bodyismediumthenbest-bodyismediumwithcertainty40R8:ifpreferred-bodyislightthenbest-bodyislightwithcertainty40R9:ifpreferred-bodyislightandbest-bodyisfull

thenbest-bodyismediumR10:if preferred-bodyisfullandbest-bodyislightthenbest-bodyismediumR11:ifpreferred-bodyisunknownthenbest-bodyislightwithcertainty20andbest-bodyismediumwithcertainty20andbest-bodyisfullwithcertainty202.挑選最合適的顏色的規(guī)則R1:ifthenmain-componentismeatbest-colorisredwithcertainty90R2:ifmain-componentispoultryandhas-turkeyisnothenbest-coloriswhitewithcertainty90andbest-colorisredwithcertainty30R3:ifmain-componentispoultryandhas-turkeyisyesthenbest-colorisredwithcertainty80andbest-coloriswhitewithcertainty50R4:ifmain-componentisfishthenbest-coloriswhiteR5:ifmain-componentis-notfishandhas-sauceisyesandsauceistomatothenbest-colorisredR6:ifhas-sauceisyesandsauceiscreamthenbest-coloriswhitewithcertainty40R7:ifpreferred-colorisredthenbest-colorisredwithcertainty40R8:ifpreferred-coloriswhite)thenbest-coloriswhitewithcertainty40R9:ifpreferred-colorisunknownthenbest-colorisredwithcertainty20andbest-coloriswhitewithcertainty20挑選最合適的甜度的規(guī)則R1:ifhas-sauceisyesandsauceissweetthenbest-sweetnessissweetwithcertainty90andbest-sweetnessismediumwithcertainty40R2:ifpreferred-sweetnessisdrythenbest-sweetnessisdrywithcertainty40R3:ifpreferred-sweetnessismediumthenbest-sweetnessismediumwithcertainty40R4:if preferred-sweetnessissweetthenbest-sweetnessissweetwithcertainty40R5:ifbest-sweetnessissweetandpreferred-sweetnessisdrythenbest-sweetnessismediumR6:ifbest-sweetnessisdryandpreferred-sweetnessissweetthenbest-sweetnessismediumR7:ifpreferred-sweetnessisunknownthenbest-sweetnessisdrywithcertainty20andbest-sweetnessismediumwithcertainty20andbest-sweetnessissweetwithcertainty20(備注:上述規(guī)則中的certainty表示推薦指數(shù),單位為%)代碼特色分析:1、 專家系統(tǒng)的類型及知識表示方法分析本專家系統(tǒng)為基于框架的專家系統(tǒng),該程序使用一組包含在知識庫內(nèi)的框架對工作存儲器內(nèi)的具體問題信息進行處理,通過推理機推斷出新的知識。這里采用框架而不是采用規(guī)則來表示知識。框架包含給定對象的信息,包括對象的名稱、對象的主要屬性及其相應的屬性值??蚣芴峁┮环N比規(guī)則更豐富的獲取問題知識的方法,不僅提供某些目標的包描述,而且還規(guī)定該目標如何工作。如該程序中對象question的創(chuàng)建,用了attribute、the-question、valid-answers、already-asked和precursors這5個屬性來描述,并且用槽來擴展有關這些屬性的信息,如定義默認值(e.g.defaultFALSE、default?DERIVE等),定義事實的時候可以選擇性地給這些屬性賦值(不可缺?。╠efault?NONE)的屬性必須賦值)。我們可以事先將要提的問題存入知識庫,本質(zhì)上來說每一個question都是采用的O-A-V(對象-屬性-值)三元結(jié)構(gòu),只不過屬性更豐富了。使用時再結(jié)合調(diào)用提問子函數(shù)(后面會討論),就可以很方便從用戶那獲取問題信息。同樣,在定義選擇葡萄酒的酒體、顏色、甜度時遵循的規(guī)則中,也采用框架來描述這些規(guī)則事實,不過是用if、then這兩個屬性來描述對象rule,因此,從形式上看仍具備if-then的形式。該程序中最典型最直觀的框架當屬用來描述對象wine的,wine的屬性有name、color、body、sweetness這4個。預定義可推薦葡萄酒清單時,給這些屬性賦值,就建立了一個小酒庫。2、 算法描述算法流程圖如圖1所示

圖1擇美酒配佳肴專家系統(tǒng)算法流程圖3、知識庫模塊劃分。CLIPS擁有支持模塊化開發(fā)的知識基礎和執(zhí)行機構(gòu)。CLIPS通過defmodule結(jié)構(gòu)來定義各種模塊,將知識庫分塊,使得知識庫的管理更高效,可讀性更好。隨著模塊的劃分,事實、規(guī)則等也會隨之劃分,新插入的事實總會自動添加到當前模板所在模塊。不同對象通常在不同模塊,為了實現(xiàn)對象間的相互通信,模塊間的引用靠定義導入-導出關系來規(guī)定。因此該程序在模塊之間多次使用export和import導出導入。從而使本程序分塊了的知識不再孤立無援,而是互聯(lián)成完整的知識庫。4、子函數(shù)定義CLIPS通過語句deffunction定義子函數(shù)。通過子函數(shù)的定義,使程序更突顯模塊化思想,因此程序更加易讀。本程序中定義了一個用于向用戶提問的ask—question子函數(shù)。5、容錯控制當用戶輸入無效值的時候,要求用戶重新輸入。通過程序函數(shù)條件選擇(if〈predicate-expression>then<expression>+[else〈expression”])結(jié)合循環(huán)判斷(while〈predicate-expression>[do]〈expression>*)可實現(xiàn)。另,為了提高輸入的靈活性,對用戶的輸入不區(qū)分大小寫,程序內(nèi)部采用字符串函數(shù)lowcase講大寫字母統(tǒng)一轉(zhuǎn)換成小寫字母。程序分模塊說明:1、定義模塊(按在代碼中出現(xiàn)的先后次序排列)代碼如下:(defmoduleMAIN(export?ALL))(defmoduleQUESTIONS(importMAIN?ALL)(export?ALL))(defmoduleWINE-QUESTIONS(importQUESTIONS?ALL))(defmoduleRULES(importMAIN?ALL)(export?ALL))(defmoduleCHOOSE-QUALITIES(importRULES?ALL)(importQUESTIONS?ALL)(importMAIN?ALL))(defmoduleWINES(importMAIN?ALL))(defmodulePRINT-RESULTS(importMAIN?ALL))本程序通過defmodule定義了7個模塊。知識模塊在定義之后通過export語句進行導出,通過import進行導入。各個知識模塊之間要相互引用必須通過導出導入來相互傳遞信息。其中(export?ALL)表示導出本模塊所有可導出結(jié)構(gòu)(如自定義模板,自定義事實),(importvmodule-name>?ALL)表示導入vmodule-name>模塊的所有可導入結(jié)構(gòu)(與導出類似)。導入清單中的結(jié)構(gòu)必須先定義,但是導出清單中的結(jié)構(gòu)就不一定要先定義。如(defmoduleMAIN(export?ALL)),此語句是程序的第一句,MAIN模塊定義的子函數(shù)、模板、規(guī)則都在該語句后面,但是這些結(jié)構(gòu)都能導出。然而MAIN模塊沒有從其它模塊導入,因為尚未有其它模塊定義,也無從談起可導入的結(jié)構(gòu)。但是定義第二個模塊QUESTIONS的時候,(importMAIN?ALL)有效。2、定義子函數(shù)。代碼如下:(deffunctionMAIN::ask-question(?question?allowed-values)(printoutt?question)(bind?answer(read))(if(lexemep?answer)then(bind?answer(lowcase?answer)))(while(not(member?answer?allowed-values))do(printoutt?question)(bind?answer(read))(if(lexemep?answer)then(bind?answer(lowcase?answer))))?answer)這個子函數(shù)實現(xiàn)向用戶提問。函數(shù)名ask-question之前的符號MAIN::表示將該子函數(shù)置于MAIN模塊中。?question?allowed-values)為傳遞的兩個參量,函數(shù)返回值為?answer。其中(bind?answer(read))表示將?answer的值約束為(read)的值,即從鍵盤輸入的值。(lexemep?answer)表示若?answer為字符(串),返回TRUE,否則返回FALSE。(lowcase?answer)實現(xiàn)將?answer中的所有大寫字母轉(zhuǎn)換成小寫字母,這樣可增加用戶回答的靈活性。(member?answer?allowed-values)表示當?answer不在?allowed-values中時返回FALSE。把(not(member?answer?allowed-values))作為while-do循環(huán)結(jié)構(gòu)的判斷條件,當用戶輸入的值為非有效值時,可實現(xiàn)要求用戶重新輸入,具備良好的容錯控制功能。3.在MAIN模塊中定義名為attribute的模板,程序中多次引用。代碼如下:(deftemplateMAIN::attribute(slotname)(slotvalue)(slotcertainty(default100.0)));未賦值時,certainty默認值為100(defruleMAIN::start(declare(salience10000));優(yōu)先級設置為最高級別,run命令后先執(zhí)行此規(guī)則。=>(set-fact-duplicationTRUE);禁止插入相同事實,若插入相同事實,返回舊事實。(focusQUESTIONSCHOOSE-QUALITIESWINESPRINT-RESULTS))用focus命令依次將PRINT-RESULTS、WINES、CHOOSE-QUALITIES、QUESTIONS模塊壓入focusstack.此時棧頂為QUESTIONS。Run命令總是先執(zhí)行當前模塊的agenda中觸發(fā)的規(guī)則,直到該agenda為空,從focusstack中彈出該模塊,繼續(xù)執(zhí)行下一個置頂?shù)哪K中的agenda中的觸發(fā)規(guī)則。在MAIN模塊中定義名為combine-certainties的規(guī)則,用來折中處理推薦指數(shù)。代碼如下:(defruleMAIN::combine-certainties""(declare(salience100)(auto-focusTRUE))?rem1<-(attribute(name?rel)(value?val)(certainty?per1))?rem2<-(attribute(name?rel)(value?val)(certainty?per2))(test(neq?rem1?rem2));?rem1不等于?rem2時,滿足測試條件=>(retract?rem1)(modify?rem2(certainty(/(-(*100(+?per1?per2))(*?per1?per2))100))))(declare(auto-focusTRUE))語句含義如下:自動將本規(guī)則所在模塊focus,若激發(fā)的規(guī)則數(shù)超過系統(tǒng)界限,或當前模塊focus無定義,則停機;若當前模塊的agenda沒有規(guī)則,則從focusstack刪去此模塊,彈出下一個;若focusstack空,則停機。前綴表達式:(/(-(*100(+?per1?per2))(*?per1?per2))100)換成中綴表達式為:(100*(?per1+?per2)-?per1*?per2)/100。5.在QUESTIONS模塊中定義名為question的模板。代碼如下:(deftemplateQUESTIONS::question(slotattribute(default?NONE));屬性attribute的值不可缺省(slotthe-question(default?NONE))(multislotvalid-answers(default?NONE))(slotalready-asked(defaultFALSE));未賦值時,lready-asked默認值;為FALSE(multislotprecursors(default?DERIVE)));未賦值時,程序自動給出滿足條件;的任意值(通常返回空置nil),因此要求程序不依賴于此值在QUESTIONS模塊中定義名為ask-a-question的模板。代碼如下:(defruleQUESTIONS::ask-a-question?f<-(question(already-askedFALSE)(precursors)(the-question?the-question)(attribute?the-attribute)(valid-answers$?valid-answers))=>(modify?f(already-askedTRUE))(assert(attribute(name?the-attribute)(value(ask-question?the-question?valid-answers)))));調(diào)用子函數(shù)ask-question,將參數(shù)?the-question?valid-answers依次傳遞給?question?allowed-values在WINE-QUESTIONS模塊中定義名為question-attributes的事實,模板引用QUESTIONS模塊中中名為question的模板。程序中共定義了個8個要提的問題事實,此處只舉一例。代碼如下:(deffactsWINE-QUESTIONS::question-attributes(question(attributepreferred-sweetness)(the-question"Doyougenerallypreferdry,medium,orsweetwines?")(valid-answersdrymediumsweetunknown)))在RULES模塊中定義名為question-attributes的模板(deftemplateRULES::rule(slotcertainty(default100.0))(multislotif)(multislotthen))在RULES模塊中定義相關規(guī)則,解析if-then規(guī)則事實。由于有些規(guī)則中的if含多個條件(如規(guī)則(ifhas-sauceisyesandsauceisspicy)(thenbest-bodyisfull)),必須同時滿足才能得出then中的結(jié)論。這里以if語句中的and為分界符逐一判斷if中的條件是否都滿足。a);is語句形式。代碼如下:(defruleRULES::remove-is-condition-when-satisfied?f<-(rule(certainty?c1)(if?attributeis?value$?rest))(attribute(name?attribute);初始階段向用戶提問獲取的信息(value?value)(certainty?c2))=>(modify?f(certainty(min?c1?c2))(if?rest)));is-not語句形式。代碼如下:(defruleRULES::remove-is-not-condition-when-satisfied?f<-(rule(certainty?c1)(if?attributeis-not?value$?rest))(attribute(name?attribute)(value~?value)(certainty?c2))=>(modify?f(certainty(min?c1?c2))(if?rest)));通常在上述兩個規(guī)則執(zhí)行后,若訐中仍含and字段,則通過此規(guī)則刪去and,以便再次結(jié)合上述兩個規(guī)則進一步判斷條件是否滿足。代碼如下:(defruleRULES::throw-away-ands-in-antecedent?f<-(rule(ifand$?rest))=>(modify?f(if?rest)));同樣有些規(guī)則的then中會得出多個結(jié)論如規(guī)則iftastinessisaveragethenbest-bodyislightwithcertainty30andbest-bodyismediumwithcertainty60andbest-bodyisfullwithcertainty30此時采取類似if的做法,以and為分界符,將結(jié)論解析成具備O-A-V三元結(jié)構(gòu)的短句。代碼如下:(defruleRULES::throw-away-ands-in-consequent?f<-(rule(thenand$?rest))=>(modify?f(then?rest)));with-certainty語句形式,certainty=?c1*?c2/100。代碼如下:(defruleRULES::perform-rule-consequent-with-certainty?f<-(rule(certainty?c1)(if)(then?attributeis?valuewithcertainty?c2$?rest))=>(modify?f(then?rest))(assert(attribute(name?attribute);插入從結(jié)論中解析出來的事實(value?value)(certainty(/(*?c1?c2)100)))))不含withcertainty字段的語句形式。代碼如下:(defruleRULES::perform-rule-consequent-without-certainty?f<-(rule(certainty?c1)(if)(then?attributeis?value$?rest))(test(or(eq(length$?rest)0);$?rest為空或其第一個字段(neq(nth1?rest)with)));不為with,則滿足測試條件=>(modify?f(then?rest))(assert(attribute(name?attribute)(value?value)(certainty?c1))))(defruleCHOOSE-QUALITIES::startit=>(focusRULES));focusRULES模塊;預定義的選酒規(guī)則事實在酒體,顏色,甜度三方面各舉一例。代碼如下(deffactsthe-wine-rules;Rulesforpickingthebestbody(rule(ifhas-sauceisyesandsauceisspicy)(thenbest-bodyisfull));Rulesforpickingthebestcolor(rule(ifmain-componentismeat)(thenbest-colorisredwithcertainty90));Rulesforpickingthebestsweetness(rule(ifhas-sauceisyesandsauceissweet)(thenbest-sweetnessissweetwithcertainty90andbest-sweetnessismediumwithcertainty40))在WINES模塊中定義名為wine的模板。代碼如下:(deftemplateWINES::wine(slotname(default?NONE))(multislotcolor(defaultany));缺省值為字段any(multislotbody(defaultany))(multislotsweetness(defaultany)));有了wine模板,可以生成葡萄酒清單,此處僅舉一例。代碼如下:(deffactsWINES::the-wine-list(wine(nameGamay)(colorred)(bodymedium)(sweetnessmediumsweet)))12.匹配小酒庫里的葡萄酒清單,擇出可推薦的合適的葡萄酒。代碼如下(defruleWINES::generate-wines(wine(name?name)(color$??c$?);多字段通配符使得字段匹配變得靈活(body$??b$?)(sweetness$??s$?))(attribute(namebest-color)(value?c)(certainty?certainty-1))(attribute(namebest-body)(value?b)(certainty?certainty-2))(attribute(namebest-sweetness)(value?s)(certainty?certainty-3))=>(assert(attribute(namewine)(value?name)(certainty(min?certainty-1?certainty-2?certainty-3)))))13.打印挑選出的葡萄酒。;打印結(jié)果的頭。代碼如下:(defrulePRINT-RESULTS::header""(declare(salience10))=>(printouttt);空一行(printoutt" SELECTEDWINES"tt)(printoutt"WINE CERTAINTY"t)(printoutt" "t)(assert(phaseprint-wines)))

;推薦指數(shù)低于20%的仍會被淘汰。代碼如下:(defrulePRINT-RESULTS::remove-poor-wine-choices""?rem<-(attribute(namewine)(certainty?per&:(v?per20)))=>(retract?rem));按推薦指數(shù)將序排列打印結(jié)果。代碼如下:(defrulePRINT-RESULTS::print-wine""?rem<-(attribute(namewine)(value?name)(certainty?per))(not(attribute(namewine)(certainty?per1&:(>?per1?per))))=>(retract?re

溫馨提示

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

評論

0/150

提交評論