專利名稱:用于提供推理服務(wù)的系統(tǒng)和方法
技術(shù)領(lǐng)域:
本發(fā)明一般涉及專家系統(tǒng)領(lǐng)域,特別涉及一種用于提供推理服務(wù)的系統(tǒng)和方法。
背景技術(shù):
專家系統(tǒng)經(jīng)常用來解決特定領(lǐng)域如醫(yī)療或法律領(lǐng)域內(nèi)的問題。例如,專家系統(tǒng)可以接收識別病人癥狀的信息,分析癥狀,并且為病人識別可能的診斷。典型的專家系統(tǒng)包括體現(xiàn)專家系統(tǒng)所用邏輯的規(guī)則庫或者一組規(guī)則。典型的專家系統(tǒng)還包括推理引擎。推理引擎典型地執(zhí)行這些規(guī)則以分析一組輸入,如病人所患癥狀。當(dāng)執(zhí)行這些規(guī)則時,推理引擎典型地試圖賦值給一組輸出值。輸出值表示推理引擎的結(jié)論。
發(fā)明內(nèi)容
本發(fā)明提供了一種用于提供推理服務(wù)的系統(tǒng)和方法。具體地說,推理引擎可結(jié)合靈活的接口,如應(yīng)用程序接口(API)來使用。用戶或應(yīng)用程序可調(diào)用推理引擎來使用所標(biāo)識的規(guī)則庫,并且執(zhí)行推理操作。規(guī)則庫可使用可擴(kuò)展標(biāo)記語言(XML)來定義。然后,推理引擎可在所標(biāo)識的規(guī)則庫中執(zhí)行指定域的規(guī)則,并且將推理結(jié)果返回給調(diào)用用戶或應(yīng)用程序。
在一個實施例中,一種用于提供推理服務(wù)的方法包括接收指定域的多條規(guī)則。該方法還包括識別至少一個與這些規(guī)則相關(guān)聯(lián)的前置條件(precondition)和至少一個與這些規(guī)則相關(guān)聯(lián)的后置條件(postcondition)。每個前置條件表示用于執(zhí)行這些規(guī)則的輸入,而每個后置條件表示來自規(guī)則執(zhí)行的輸出。該方法還包括接收對應(yīng)于前置條件的輸入值。另外,該方法包括使用該輸入值執(zhí)行這些規(guī)則的至少一部分,以產(chǎn)生輸出值。該輸出值對應(yīng)于后置條件。
在另一個實施例中,一種用于提供推理服務(wù)的方法包括接收指定域的多條第一規(guī)則,該規(guī)則包括第一規(guī)則庫的至少一部分。該方法還包括將第一規(guī)則裝載到存儲器中。該方法還包括將來自補(bǔ)充規(guī)則庫的第二域裝載到存儲器中。另外,該方法包括在第二域內(nèi)的規(guī)則上對第一規(guī)則進(jìn)行子推理(sub-inferencing)。
在另一個實施例中,一種用于提供推理服務(wù)的方法包括執(zhí)行指定域的多條規(guī)則中的至少一部分。這些規(guī)則中的至少之一包括表達(dá)式。該方法還包括當(dāng)求解這些規(guī)則之一中的表達(dá)式所需的字段具有未知值時,掛起(pend)該規(guī)則,并且識別與導(dǎo)致決策樹規(guī)則掛起的表達(dá)式相關(guān)聯(lián)的二進(jìn)制語句(binarystatement)。該方法還包括將已知值賦給導(dǎo)致該規(guī)則掛起的字段,并且使該規(guī)則解除掛起(unpending)。另外,該方法包括在識別出的二進(jìn)制語句處重新啟動該規(guī)則的執(zhí)行。
為了更全面理解本發(fā)明,現(xiàn)在結(jié)合附圖參考下面描述,其中圖1是示出根據(jù)本發(fā)明一個實施例的用于提供推理服務(wù)的示例系統(tǒng)的示例性方框圖;圖2是示出根據(jù)本發(fā)明一個實施例的用于提供推理服務(wù)的另一個示例系統(tǒng)的示例性方框圖;圖3是示出根據(jù)本發(fā)明一個實施例的用于提供推理服務(wù)的另一個示例系統(tǒng)的示例性方框圖;圖4是示出根據(jù)本發(fā)明一個實施例的示例規(guī)則庫架構(gòu)的示例性方框圖;圖5A和5B是示出根據(jù)本發(fā)明一個實施例的示例規(guī)則庫構(gòu)建器的示例性方框圖;圖6A、6B、6C-1和6C-2是示出根據(jù)本發(fā)明一個實施例的示例推理引擎的示例性方框圖;圖7是示出根據(jù)本發(fā)明一個實施例的示例核心應(yīng)用程序的示例性方框圖;圖8是示出根據(jù)本發(fā)明一個實施例的示例接口的示例性方框圖;圖9A和9B是示出根據(jù)本發(fā)明一個實施例的示例規(guī)則類型的示例性方框圖;圖10是示出根據(jù)本發(fā)明一個實施例的用于共享規(guī)則庫的示例存儲器布置的示例性方框圖;圖11A到11D是示出根據(jù)本發(fā)明一個實施例的合并到統(tǒng)一(consolidated)規(guī)則庫中的示例規(guī)則庫組件的示例性方框圖;圖12是示出根據(jù)本發(fā)明一個實施例的用于提供推理服務(wù)的示例方法的示例性流程圖;圖13是示出根據(jù)本發(fā)明一個實施例的用于規(guī)則庫構(gòu)建的示例方法的示例性流程圖;以及圖14是示出根據(jù)本發(fā)明一個實施例的用于合并規(guī)則庫組件的示例方法的示例性流程圖。
具體實施例方式
圖1是示出根據(jù)本發(fā)明一個實施例的用于提供推理服務(wù)的示例系統(tǒng)100的示例性方框圖。在所示實施例中,系統(tǒng)100包括服務(wù)器102、數(shù)據(jù)庫104、網(wǎng)絡(luò)106、以及一個或多個客戶端108。
在操作的一方面,服務(wù)器102可包括規(guī)則庫構(gòu)建器110和推理引擎112。規(guī)則庫構(gòu)建器110支持一個或多個規(guī)則庫114的創(chuàng)建和修改。規(guī)則庫114包括規(guī)則116,其體現(xiàn)由推理引擎112用來執(zhí)行推理操作的邏輯。例如,規(guī)則庫114可定義如何分析病人癥狀和為病人識別可能的診斷。推理引擎112可執(zhí)行系統(tǒng)100中的推理操作。例如,推理引擎112可接收一個或多個輸入值,使用規(guī)則庫114分析輸入值,并且產(chǎn)生一個或多個輸出值。然后,輸出值可例如通過使病人的診斷可用于用戶來用于各種目的。
在所示實施例中,服務(wù)器102耦接于網(wǎng)絡(luò)106。在本文中,術(shù)語“耦接”是指兩個或更多組件之間的任何直接或間接通信,而不管這些組件是否相互物理接觸。另外,術(shù)語“通信”可以是指物理上分離的組件之間或者單個物理單元內(nèi)的組件之間的通信。服務(wù)器102執(zhí)行與系統(tǒng)100中的規(guī)則庫114的創(chuàng)建和使用相關(guān)的一個或多個功能。例如,服務(wù)器102可創(chuàng)建、修改和刪除規(guī)則庫114。服務(wù)器102還可使用規(guī)則庫114來執(zhí)行推理操作。服務(wù)器102可包括用于執(zhí)行規(guī)則庫構(gòu)建和推理功能的任何硬件、軟件、固件或其組合。
數(shù)據(jù)庫104耦接于服務(wù)器102。數(shù)據(jù)庫104存儲并幫助檢索由服務(wù)器102使用的信息。例如,數(shù)據(jù)庫104可存儲由規(guī)則庫構(gòu)建器110創(chuàng)建且由推理引擎112使用的一個或多個規(guī)則庫114。數(shù)據(jù)庫104可包括用于存儲和幫助檢索信息的任何硬件、軟件、固件或其組合。另外,數(shù)據(jù)庫104還可使用各種數(shù)據(jù)結(jié)構(gòu)、布置和編譯中的任一種,以存儲和幫助檢索信息。
網(wǎng)絡(luò)106耦接于服務(wù)器102和客戶端108。網(wǎng)絡(luò)106幫助系統(tǒng)100的組件之間的通信。網(wǎng)絡(luò)106可以在網(wǎng)絡(luò)地址之間例如傳送網(wǎng)際協(xié)議(IP)分組、幀中繼幀、異步傳輸模式(ATM)信元或者其它適合信息。網(wǎng)絡(luò)106可包括一個或多個局域網(wǎng)(LAN)、城域網(wǎng)(MAN)、廣域網(wǎng)(WAN)、全球網(wǎng)絡(luò)如因特網(wǎng)的全部或部分,或者處于一個或多個位置的任何其它通信系統(tǒng)。
客戶端108耦接于網(wǎng)絡(luò)106??蛻舳?08可執(zhí)行系統(tǒng)100中的各種功能中的任一種。例如,客戶端108可包括客戶端應(yīng)用程序122,其可調(diào)用服務(wù)器102中的規(guī)則庫構(gòu)建器110和推理引擎112的功能性。作為特定例子,客戶端應(yīng)用程序122可以使推理引擎112使用由客戶端應(yīng)用程序122標(biāo)識的規(guī)則庫114執(zhí)行推理操作。客戶端108還可表示編程人員或其它用戶通過其可使用規(guī)則庫構(gòu)建器110創(chuàng)建、修改和刪除各個規(guī)則庫114的終端??蛻舳?08可包括用于與服務(wù)器102通信的任何硬件、軟件、固件或其組合。
在所示例子中,服務(wù)器102包括處理器124和存儲器126。處理器124執(zhí)行指令和操縱數(shù)據(jù)以執(zhí)行服務(wù)器102的操作。雖然圖1在服務(wù)器102中示出單個處理器124,但是根據(jù)具體需要也可使用多個處理器124。存儲器126存儲和幫助檢索由處理器124使用以執(zhí)行服務(wù)器102的功能的信息。存儲器126可以例如存儲要由處理器124執(zhí)行的指令和由處理器124使用的數(shù)據(jù)。存儲器126可包括用于存儲和幫助檢索信息的任何硬件、軟件、固件或其組合。
在所示實施例中,服務(wù)器102包括規(guī)則庫構(gòu)建器110、推理引擎112和工具128。在特定實施例中,當(dāng)規(guī)則庫構(gòu)建器110或推理引擎112由客戶端應(yīng)用程序122調(diào)用時,服務(wù)器102創(chuàng)建規(guī)則庫構(gòu)建器實例或推理引擎實例。然后,可使用由服務(wù)器102實例化的實例來向客戶端應(yīng)用程序122提供服務(wù)。如果第二客戶端應(yīng)用程序122試圖調(diào)用規(guī)則庫構(gòu)建器110或推理引擎112,則可為第二客戶端應(yīng)用程序122創(chuàng)建單獨的實例。類似地,如果第一客戶端應(yīng)用程序122使用多個線程,并且在每個線程上調(diào)用規(guī)則庫構(gòu)建器110或推理引擎112,則可為每個線程實例化單獨的實例。這允許服務(wù)器102同時向多個客戶端108和在多個線程上提供規(guī)則庫構(gòu)建和推理功能性。在其它實施例中,服務(wù)器102無需為每個客戶端應(yīng)用程序122或線程創(chuàng)建實例。另外,在下面描述中,規(guī)則庫構(gòu)建器110和推理引擎112可被描述為執(zhí)行特定功能。該描述包括由規(guī)則庫構(gòu)建器實例或推理引擎實例執(zhí)行特定功能的情形。
規(guī)則庫構(gòu)建器110幫助系統(tǒng)100中的規(guī)則庫114的創(chuàng)建、修改和刪除。規(guī)則庫114定義由推理引擎112使用以執(zhí)行系統(tǒng)100中的推理功能的一條或多條規(guī)則116。例如,規(guī)則庫114可定義存儲信息的數(shù)據(jù)對象和指定作用于數(shù)據(jù)對象中的信息的方法和規(guī)則的邏輯對象。作為特定例子,數(shù)據(jù)對象可存儲病人癥狀,而邏輯對象分析癥狀并且試圖計算診斷。示例規(guī)則如下面描述的圖9A和9B所示。
規(guī)則庫114可包括使用任何格式定義的任何數(shù)目的規(guī)則116。在一個實施例中,規(guī)則庫114包含使用可擴(kuò)展標(biāo)記語言(XML)定義的規(guī)則116。在特定實施例中,規(guī)則庫114包含使用下面描述的規(guī)則定義語言(RDL)定義的規(guī)則116。另外,規(guī)則庫114可分成多個區(qū)或部分。例如,規(guī)則庫114可分成不同區(qū),其中一個區(qū)定義數(shù)據(jù)對象,而另一個區(qū)定義在數(shù)據(jù)對象上操作的邏輯對象。作為另一個例子,規(guī)則庫(rulebase)114可由多個規(guī)則集(ruleset)130形成,其中每個規(guī)則集130包含與公共問題(common issue)相關(guān)聯(lián)的一條或多條規(guī)則116。規(guī)則庫114還可由多個域130形成,其中域130可包括多個規(guī)則集130。示例規(guī)則庫架構(gòu)如下面描述的圖4所示。
規(guī)則庫構(gòu)建器110通過將各個規(guī)則庫組件合并到統(tǒng)一規(guī)則庫114中來支持系統(tǒng)100中的規(guī)則庫114的創(chuàng)建。例如,規(guī)則庫構(gòu)建器110可將一組規(guī)則116、規(guī)則集130和規(guī)則庫114合并到單個規(guī)則庫114中。規(guī)則庫構(gòu)建器110還可解析所得到的統(tǒng)一規(guī)則庫114,以幫助確保規(guī)則116之間的完全性和一致性。作為特定例子,不同開發(fā)團(tuán)隊可單獨創(chuàng)建不同規(guī)則116、規(guī)則庫114或規(guī)則集130,并且規(guī)則庫構(gòu)建器110可將各個組件合并到單個規(guī)則庫114中。作為另一個例子,一個開發(fā)團(tuán)隊可創(chuàng)建一組數(shù)據(jù)對象,而另一個開發(fā)團(tuán)隊可創(chuàng)建處理數(shù)據(jù)對象的一組邏輯對象。然后,規(guī)則庫構(gòu)建器110可將數(shù)據(jù)和邏輯對象合并到規(guī)則庫114中。
合并到統(tǒng)一規(guī)則庫114中的各個規(guī)則庫組件可以若干形式存在。例如,正被合并的規(guī)則庫114可作為未經(jīng)編譯的源規(guī)則庫114或經(jīng)過編譯的二進(jìn)制規(guī)則庫114而存在。二進(jìn)制規(guī)則庫114的使用可允許第三方廠商創(chuàng)建可上市出售給顧客的二進(jìn)制規(guī)則庫114。由于規(guī)則庫114采用二進(jìn)制形式,因此規(guī)則庫114的實際內(nèi)容可以在更大程度上受到保護(hù)。獲得二進(jìn)制規(guī)則庫114的顧客可簡單地將其與其它規(guī)則庫114進(jìn)行合并。顧客無需訪問形成二進(jìn)制規(guī)則庫114的實際規(guī)則116。
規(guī)則庫構(gòu)建器110還可將各個規(guī)則庫組件轉(zhuǎn)換成標(biāo)準(zhǔn)格式。例如,系統(tǒng)100中的規(guī)則庫114可具有缺省或標(biāo)準(zhǔn)格式,如采用XML的規(guī)則定義語言。如果客戶端應(yīng)用程序122請求規(guī)則庫構(gòu)建器110使用具有不同格式的組件創(chuàng)建統(tǒng)一規(guī)則庫114,則規(guī)則庫構(gòu)建器110可將該組件轉(zhuǎn)換并重新格式化成標(biāo)準(zhǔn)格式。然后,規(guī)則庫構(gòu)建器110可使用重新格式化的組件生成統(tǒng)一規(guī)則庫114。這可允許用戶采用與由規(guī)則庫構(gòu)建器110和推理引擎112使用的標(biāo)準(zhǔn)格式不同的格式編寫規(guī)則庫114。
規(guī)則庫構(gòu)建器110還編譯源規(guī)則庫114以創(chuàng)建二進(jìn)制規(guī)則庫114。作為例子,規(guī)則庫構(gòu)建器110可編譯在遵循規(guī)則定義語言的XML文檔中定義的源規(guī)則庫114。作為編譯結(jié)果,規(guī)則庫構(gòu)建器110創(chuàng)建規(guī)則庫114的二進(jìn)制版本,推理引擎112可使用其來執(zhí)行推理操作。編譯規(guī)則庫114可幫助提高推理引擎112的工作效率,并且它還可幫助保護(hù)規(guī)則庫114的隱私和提高圍繞其的安全性。下面描述如何可將信息合并到由規(guī)則定義語言定義的統(tǒng)一規(guī)則庫114中的描述。
規(guī)則庫構(gòu)建器110可包括用來創(chuàng)建和維護(hù)規(guī)則庫114的任何硬件、軟件、固件或其組合。例如,規(guī)則庫構(gòu)建器110可包括由處理器124執(zhí)行的一個或多個軟件例程。規(guī)則庫構(gòu)建器的示例實施例如下面描述的圖5A和5B所示。
推理引擎112實現(xiàn)服務(wù)器102的推理功能性。例如,推理引擎112可訪問一個或多個規(guī)則庫114,并且識別所要使用的規(guī)則116。推理引擎112還可從客戶端應(yīng)用程序122接收輸入值,并且使用這些輸入來執(zhí)行規(guī)則116。在本文中,術(shù)語“執(zhí)行”最少是指推理引擎112檢查規(guī)則116的至少一部分以確定是否應(yīng)執(zhí)行規(guī)則116中的操作。然后,推理引擎112可將推理操作結(jié)果返回給客戶端應(yīng)用程序122。
在一個實施例中,由推理引擎112使用的規(guī)則116包含或引用屬性或字段。具有已知或既定值的字段可稱作以“已知狀態(tài)”存在的“已知字段”,而具有未知或不定值的字段可稱作以“未知狀態(tài)”存在的“未知字段”。在推理期間,推理引擎112使用規(guī)則116以嘗試將已知值賦給未知字段。
在操作的一方面,推理引擎112可檢查規(guī)則庫114中的規(guī)則116,并且觸發(fā)(fire)、舍棄(fail)或掛起規(guī)則116。當(dāng)推理引擎112檢查規(guī)則116中的前提,發(fā)現(xiàn)前提為真,并且執(zhí)行在規(guī)則116中指定的操作時,它“觸發(fā)”規(guī)則116。當(dāng)推理引擎112檢查規(guī)則116中的前提,發(fā)現(xiàn)前提為假,并且拒絕執(zhí)行在規(guī)則116中指定的操作時,它“舍棄”規(guī)則116。當(dāng)推理引擎112檢查規(guī)則116中的前提,并且確定前提不能被求解為真或假時,它“掛起”規(guī)則116。這可發(fā)生于前提包括具有未知值的字段時。推理引擎112可以以后在將已知值賦給該字段之后試圖觸發(fā)或舍棄該掛起規(guī)則116。
推理引擎112可使用一個或多個策略以執(zhí)行規(guī)則庫114中的規(guī)則116。在一個實施例中,推理引擎112支持規(guī)則庫114中的規(guī)則116的前向鏈接(forward-chaining)和后向鏈接(backward-chaining)。一般而言,前向鏈接涉及推理引擎112試圖最大化置于已知狀態(tài)的規(guī)則庫114中的未知字段數(shù)。在前向鏈接中,推理引擎112觸發(fā)規(guī)則116,并且作為觸發(fā)結(jié)果確定哪些字段被求解成已知狀態(tài)。然后,推理引擎112重新訪問任何掛起規(guī)則116,并且確定這些掛起規(guī)則116是否現(xiàn)在可被觸發(fā)或舍棄。推理引擎112繼續(xù)該過程,直到推理引擎112不能觸發(fā)或舍棄任何更多規(guī)則116或者執(zhí)行任何掛起規(guī)則116。
后向鏈接一般涉及推理引擎112試圖求解初級目標(biāo),例如確定某些前置條件是否保證特定結(jié)果或者求解所標(biāo)識的字段。推理引擎112最初訪問可以潛在求解所標(biāo)識目標(biāo)的規(guī)則116。如果規(guī)則116由于未知字段而掛起,則推理引擎112將未知字段添加到次級目標(biāo)列表。然后,推理引擎112訪問可以潛在求解任何初級或次級目標(biāo)的規(guī)則116。推理引擎112繼續(xù)該過程,直到求解出初級目標(biāo)或者不再有任何可被執(zhí)行的規(guī)則116。
在執(zhí)行推理操作中,推理引擎112執(zhí)行規(guī)則庫114中的規(guī)則116。在一個實施例中,執(zhí)行規(guī)則116的次序至少部分依賴于與規(guī)則116相關(guān)聯(lián)的優(yōu)先級。如上所述,規(guī)則116可處于規(guī)則集130內(nèi),并且規(guī)則集130可處于域131內(nèi)。當(dāng)客戶端應(yīng)用程序122識別在推理期間所要使用的域131時,推理引擎112將包含在該域131中的無條件規(guī)則集130裝載到存儲器126中。然后,推理引擎112確保包含在域131中的規(guī)則116根據(jù)其優(yōu)先級來排序。此后,推理引擎112按照它們的優(yōu)先級次序執(zhí)行規(guī)則116。
在一個實施例中,當(dāng)執(zhí)行推理操作時,推理引擎112實施(enforce)單調(diào)推理。單調(diào)推理假定一旦推理引擎112由于字段值而觸發(fā)或舍棄了規(guī)則,則在隨后推理期間不應(yīng)改變該字段的值;否則,推理完整性可能遭到損害-因為結(jié)果可能反映沖突規(guī)則的操作。推理引擎112可檢測字段值何時由規(guī)則前提測試。如果該字段的值隨后發(fā)生變化,則推理引擎可將此視作單調(diào)推理違例,并且向用戶警告該違例。
字段可稱作“首次定值字段(first-valued field)”,因為字段的值在分配了初始值之后就不可改變。其它字段可稱作“最后定值字段(final-valued field)”,其具有可多次改變的值。例如,當(dāng)在規(guī)則庫114中需要計數(shù)器時,使用最后定值字段可以是有用的。作為特定例子,規(guī)則庫114可以包括一組規(guī)則集130,并且每個規(guī)則集130可確定是否允許納稅人要求特定稅豁免。規(guī)則庫114還可包括記錄允許納稅人要求豁免的數(shù)目的計數(shù)器。當(dāng)推理引擎112執(zhí)行每個規(guī)則集130時,如果納稅人有資格豁免,則可遞增計數(shù)器。在本例中,計數(shù)器的有用值是未知的,直到所有規(guī)則集130都被執(zhí)行,并且推理引擎112可遞增計數(shù)器很多次。
首次定值字段與最后定值字段之間的區(qū)別可影響在推理期間執(zhí)行規(guī)則116的次序。例如,大量規(guī)則116可改變最后定值字段的值。推理引擎112可能不能觸發(fā)或舍棄在前提中使用最后定值字段的規(guī)則116,直到可改變最后定值字段的值的所有規(guī)則116都被執(zhí)行為止。返回到稅例子,推理引擎112可以被迫掛起計算由納稅人擁有的稅的任何規(guī)則116,直到處理豁免次數(shù)的所有規(guī)則集130都被執(zhí)行為止。
推理引擎112還可支持補(bǔ)充的規(guī)則116、規(guī)則庫114和規(guī)則集130的使用。補(bǔ)充規(guī)則庫114表示在推理期間除了基本規(guī)則庫114之外還可使用的規(guī)則庫。例如,保險公司可具有由其公司總部建立的基本規(guī)則庫114,并且每個分支機(jī)構(gòu)可具有定義本地政策的補(bǔ)充規(guī)則庫114。為了使用補(bǔ)充規(guī)則庫114,推理引擎112可接收基本規(guī)則庫114,并將其裝載到存儲器126中。然后,基本規(guī)則庫114內(nèi)的規(guī)則可從補(bǔ)充規(guī)則庫裝載域,并且在這些域內(nèi)的規(guī)則上進(jìn)行子推理。在一個實施例中,基本規(guī)則庫114與補(bǔ)充規(guī)則庫114之間的通信可通過補(bǔ)充規(guī)則庫的前置條件和后置條件來發(fā)生。在特定實施例中,補(bǔ)充規(guī)則庫114可以不直接引用基本規(guī)則庫114中的任何對象,這可幫助使基本規(guī)則庫114隔離于可能的“惡劣”補(bǔ)充規(guī)則庫114。補(bǔ)充規(guī)則庫114還可與不同于基本規(guī)則庫114的不同推理引擎實例相關(guān)聯(lián)。在本例中,基本規(guī)則庫114可擔(dān)當(dāng)驅(qū)動補(bǔ)充規(guī)則庫114的“應(yīng)用程序”。從補(bǔ)充規(guī)則庫114的角度來看,基本規(guī)則庫114與應(yīng)用程序可以是不可區(qū)分的?;疽?guī)則庫114可裝載一個或多個補(bǔ)充規(guī)則庫114,然后每個補(bǔ)充規(guī)則庫114可裝載一個或多個另外的補(bǔ)充規(guī)則庫114。
推理引擎112還可支持系列化的推理和子推理。在系列化推理中,推理引擎112使用第一域131執(zhí)行推理操作,并且產(chǎn)生一組輸出值。然后,推理引擎112使用這些輸出值作為第二域131的輸入值,并且推理引擎112使用第二域131執(zhí)行推理操作。例如,當(dāng)?shù)谝挥?31計算納稅人有權(quán)接受的豁免數(shù)時,這可以是有用的,并且第二域131根據(jù)豁免數(shù)計算納稅人所擁有的稅。在子推理中,推理引擎112使用第一域131執(zhí)行推理操作,并且第一域131中的規(guī)則116之一可使用第二域131來調(diào)用推理。當(dāng)觸發(fā)該規(guī)則116時,推理引擎112裝載第二域131,并且使用第二域131執(zhí)行推理操作。一旦推理引擎112使用第二域131完成推理,推理引擎112就可返回到使用第一域131。第二域131中的規(guī)則116的執(zhí)行可使第一域中的規(guī)則116解除掛起,推理引擎112在返回到第一域131時執(zhí)行該規(guī)則。
推理引擎112可包括用于執(zhí)行一個或多個推理操作的任何硬件、軟件、固件或其組合。推理引擎112例如可包括由處理器124執(zhí)行的一個或多個軟件例程。推理引擎112的示例實施例如下面描述的圖6A到6C所示。
為了幫助客戶端應(yīng)用程序122與規(guī)則庫構(gòu)建器110之間的通信,規(guī)則庫構(gòu)建器110可包括應(yīng)用程序接口(API)118,或者與之相關(guān)聯(lián)。類似地,推理引擎112可包括API 120,或者與之相關(guān)聯(lián)。API 118、120可以允許客戶端應(yīng)用程序122調(diào)用規(guī)則庫構(gòu)建器110和推理引擎112的功能。例如,客戶端應(yīng)用程序122可通過API 118將規(guī)則庫114的標(biāo)識提供給規(guī)則庫構(gòu)建器110而指示規(guī)則庫構(gòu)建器110合并兩個規(guī)則庫114。以類似方式,客戶端應(yīng)用程序122可通過API 120將規(guī)則庫114的標(biāo)識和輸入值提供給推理引擎112而調(diào)用推理引擎112的推理功能。
在特定實施例中,規(guī)則庫構(gòu)建器110可與無狀態(tài)(stateless))API 118、有狀態(tài)(stateful)API 118或兩者相關(guān)聯(lián)。類似地,推理引擎112可與無狀態(tài)API220、有狀態(tài)API 220或兩者相關(guān)聯(lián)。有狀態(tài)API 118、120可保持面向會話的、涉及與服務(wù)器102通信的客戶端應(yīng)用程序122的狀態(tài)信息。狀態(tài)信息例如可表示在服務(wù)器102與客戶端應(yīng)用程序122在其上運(yùn)行的客戶端108之間發(fā)生的會話的當(dāng)前狀態(tài)。無狀態(tài)API 118、120可以不保持面向會話的、涉及與服務(wù)器102通信的客戶端應(yīng)用程序122的狀態(tài)信息。
無狀態(tài)API 118、120可用來在網(wǎng)絡(luò)106上作為遠(yuǎn)程服務(wù)調(diào)用規(guī)則庫構(gòu)建器110或推理引擎112。有狀態(tài)API 118、120可允許服務(wù)器102向訪問服務(wù)器102的客戶端應(yīng)用程序122提供附加功能性。例如,有狀態(tài)API 118、120的使用允許服務(wù)器102提供“回調(diào)(callback)”。在回調(diào)期間,規(guī)則庫構(gòu)建器110或推理引擎112在規(guī)則庫構(gòu)建或推理期間向客戶端應(yīng)用程序122請求附加信息或者向其提供信息。例如,當(dāng)發(fā)生字段值改變時,這可允許服務(wù)器102通知客戶端應(yīng)用程序122。
回調(diào)還可允許服務(wù)器102定義服務(wù)器102可調(diào)用以初始化前置條件值或其它值的方法。例如,服務(wù)器102可請求客戶端應(yīng)用程序122提供特定字段的已知值,這可發(fā)生于“最后機(jī)會處理”期間。在推理期間,推理引擎112可能由于字段具有不能求解的未知值而不能完成推理。當(dāng)此發(fā)生時,推理引擎112可請求客戶端應(yīng)用程序122提供未知字段的值。如果客戶端應(yīng)用程序122提供該值,則推理引擎112可能能夠繼續(xù)或完成推理操作。在另一個實施例中,規(guī)則庫114可提供最后機(jī)會值,以在最后機(jī)會處理期間使用。在本實施例中,當(dāng)推理引擎112在推理期間不能求解字段的值時,推理引擎112使用該字段的最后機(jī)會值。也可使用這些方法的組合,例如推理引擎112從客戶端應(yīng)用程序122請求第一值,并且當(dāng)客戶端應(yīng)用程序122未提供第一值時,使用來自規(guī)則庫114的第二值。
工具128幫助開發(fā)和維護(hù)系統(tǒng)100中的規(guī)則庫114。例如,規(guī)則編輯器132幫助用戶創(chuàng)建規(guī)則116。規(guī)則編輯器132可允許用戶創(chuàng)建和編輯規(guī)則116。作為特定例子,規(guī)則編輯器132可允許用戶創(chuàng)建包含規(guī)則116的XML文檔,編輯包含規(guī)則116的現(xiàn)有XML文檔,并且刪除包含規(guī)則116的XML文檔。
工具128還可包括一個或多個變換器133。變換器133將規(guī)則116從一種格式轉(zhuǎn)換成不同格式。例如,變換器133可接收使用自然語言定義的規(guī)則116,并且將規(guī)則116轉(zhuǎn)換成XML格式。這可允許用戶使用簡單表示法或語法來輸入規(guī)則116。在一個實施例中,變換器133可包括Infix到XML Java編碼工具應(yīng)用程序??墒褂闷渌儞Q器133如圖形編輯器或下拉式機(jī)制。
工具128還可包括一個或多個分析器134。分析器134檢查二進(jìn)制或源規(guī)則庫114,并且識別數(shù)據(jù)對象與規(guī)則116之間的關(guān)系。例如,用戶可識別特定數(shù)據(jù)對象,并且分析器134可識別從數(shù)據(jù)對象讀取值或者向數(shù)據(jù)對象寫入值的任何規(guī)則116。
工具128還可包括一個或多個調(diào)試器136。調(diào)試器136在推理期間監(jiān)視規(guī)則116的執(zhí)行。例如,調(diào)試器136可識別提供給推理引擎112的輸入值、在推理期間觸發(fā)的規(guī)則116、觸發(fā)規(guī)則116的次序、以及觸發(fā)每條規(guī)則116的原因。然后,可使用該信息來分析所發(fā)生的推理操作。當(dāng)規(guī)則庫114沒有提供適當(dāng)結(jié)果,并且用戶想要識別規(guī)則庫114為什么不能按照預(yù)期那樣工作時,這可以是有用的。
另外,工具128可包括一個或多個測試器138。測試器138幫助用戶確保規(guī)則庫114、規(guī)則集130或一組規(guī)則116按照計劃的那樣工作。例如,測試器138可接收識別規(guī)則庫114的信息、一組輸入值和一組預(yù)期輸出值。然后,測試器138使用所識別的規(guī)則庫114和輸入值調(diào)用推理引擎112,從推理引擎112接收算出的輸出值,并且確定算出的輸出值是否匹配預(yù)期輸出值。在特定實施例中,測試器138可訪問包含多組輸入值和對應(yīng)輸出值的庫,以測試所識別的規(guī)則庫114。
每個工具128可包括用于執(zhí)行系統(tǒng)100中的一個或多個功能的任何硬件、軟件、固件或其組合。另外,每個工具128可使用API 118、120調(diào)用規(guī)則庫構(gòu)建器110或推理引擎112中的功能。
在一個實施例中,規(guī)則庫114可定義其自己的數(shù)據(jù)對象,并且規(guī)則庫114可獨立于依賴于嵌入在規(guī)則庫114中的邏輯的應(yīng)用程序來開發(fā)和使用。例如,專用客戶端應(yīng)用程序122可由一組用戶開發(fā),而另一組用戶開發(fā)要由客戶端應(yīng)用程序122使用的規(guī)則庫114。作為特定例子,規(guī)則庫114或規(guī)則庫114中的域131可定義前置條件或輸入值,以及后置條件或輸出值。開發(fā)規(guī)則庫114的用戶可識別前置條件和后置條件,并且開發(fā)客戶端應(yīng)用程序122的用戶可以簡單地確保客戶端應(yīng)用程序122被設(shè)計成將適當(dāng)?shù)那爸脳l件傳送給推理引擎112,并且從推理引擎112接收適當(dāng)?shù)暮笾脳l件。另外,由于規(guī)則庫114可以與使用規(guī)則庫114調(diào)用推理的客戶端應(yīng)用程序122分開地定義其自己的數(shù)據(jù)對象,因此多個客戶端應(yīng)用程序122可以共享規(guī)則庫114。即使一個客戶端應(yīng)用程序122的推理與另一個客戶端應(yīng)用程序122的推理部分或完全重疊,這些客戶端應(yīng)用程序122也可使用相同規(guī)則庫114調(diào)用推理。
雖然圖1示出用于提供推理服務(wù)的示例系統(tǒng)100,但是也可對系統(tǒng)100進(jìn)行各種改變。例如,圖1示出服務(wù)器102的一個示例功能劃分。根據(jù)具體需要,可組合或省略服務(wù)器102的各個組件,并且可增加另外的組件。作為特定例子,可從服務(wù)器102中省略規(guī)則庫構(gòu)建器110或推理引擎112,或者規(guī)則庫構(gòu)建器110和推理引擎112可駐留在單獨平臺上。另外,數(shù)據(jù)庫104可存儲系統(tǒng)100中所需的任何其它信息,并且數(shù)據(jù)庫104和存儲器126可駐留在可由服務(wù)器102訪問的任何一個或多個位置。此外,服務(wù)器102可支持其它或附加工具128,并且規(guī)則庫114可駐留在數(shù)據(jù)庫104以外的其它位置。另外,推理引擎112可支持規(guī)則116的前向鏈接或后向鏈接,并且在系統(tǒng)100中可使用與規(guī)則庫構(gòu)建器110和推理引擎112的其它接口。
圖2是示出根據(jù)本發(fā)明一個實施例的用于提供推理服務(wù)的另一個示例系統(tǒng)200的示例性方框圖。在所示實施例中,系統(tǒng)200包括服務(wù)器202、數(shù)據(jù)庫204、網(wǎng)絡(luò)206和一個或多個客戶端208。
服務(wù)器202、數(shù)據(jù)庫204、網(wǎng)絡(luò)206和客戶端208可相同或類似于圖1的服務(wù)器102、數(shù)據(jù)庫104、網(wǎng)絡(luò)106和客戶端108。在本實施例中,規(guī)則庫構(gòu)建器210和推理引擎212形成服務(wù)器應(yīng)用程序250的一部分。服務(wù)器應(yīng)用程序250表示可在網(wǎng)絡(luò)206上由客戶端應(yīng)用程序222調(diào)用的應(yīng)用程序。服務(wù)器應(yīng)用程序250例如可表示專家應(yīng)用程序,如與醫(yī)療或法律領(lǐng)域相關(guān)聯(lián)的應(yīng)用程序。
在操作的一方面,服務(wù)器應(yīng)用程序250可從客戶端應(yīng)用程序222接收請求以構(gòu)建規(guī)則庫214或執(zhí)行推理操作。服務(wù)器應(yīng)用程序250可創(chuàng)建規(guī)則庫構(gòu)建器210或推理引擎212的實例,并且允許該實例執(zhí)行適合操作。
在所示實施例中,服務(wù)器應(yīng)用程序250包括服務(wù)器API 252。服務(wù)器API252允許客戶端應(yīng)用程序222調(diào)用服務(wù)器應(yīng)用程序250的功能。例如,客戶端應(yīng)用程序222可調(diào)用創(chuàng)建規(guī)則庫構(gòu)建器實例的服務(wù)器應(yīng)用程序250的功能,并且客戶端應(yīng)用程序222可識別多個源規(guī)則庫214。服務(wù)器應(yīng)用程序250可將通過服務(wù)器API 252接收的信息傳給規(guī)則庫構(gòu)建器實例,并且允許規(guī)則庫構(gòu)建器實例合并和編譯所識別的規(guī)則庫214。服務(wù)器API 252可表示有狀態(tài)接口、無狀態(tài)接口、或者其它接口或接口的組合。
在特定實施例中,服務(wù)器應(yīng)用程序250表示Java應(yīng)用程序、J2EE小服務(wù)程序(servlet)、企業(yè)版Java組件(EJB)應(yīng)用程序、Java服務(wù)器頁面(JSP)應(yīng)用程序、或者其它適合應(yīng)用程序。在本實施例中,API 218、220可包括可作為本地服務(wù)由服務(wù)器應(yīng)用程序250調(diào)用的有狀態(tài)接口。另外,服務(wù)器應(yīng)用程序250可作為遠(yuǎn)程服務(wù)由客戶端應(yīng)用程序222通過API 252來調(diào)用。
雖然圖2示出用于提供推理服務(wù)的示例系統(tǒng)200,但是也可對系統(tǒng)200進(jìn)行各種改變。例如,雖然圖2示出服務(wù)器202的一個示例功能劃分,但是根據(jù)具體需要,可組合或省略服務(wù)器202的各個組件,并且可增加另外的組件。作為特定例子,可從服務(wù)器202中省略規(guī)則庫構(gòu)建器210或推理引擎212。
圖3是示出根據(jù)本發(fā)明一個實施例的用于提供推理服務(wù)的另一個示例系統(tǒng)300的示例性方框圖。在所示實施例中,系統(tǒng)300包括執(zhí)行應(yīng)用程序362的主機(jī)計算機(jī)360。
在所示實施例中,主機(jī)360可采用任何公知的MS-DOS、PC-DOS、OS-2、MAC-OS、WINDOWS、UNIX、LINUX或其它適合操作系統(tǒng)執(zhí)行。主機(jī)360可表示桌面計算機(jī)、膝上型計算機(jī)、服務(wù)器計算機(jī)或其它適合計算或通信設(shè)備。主機(jī)360可包括輸入設(shè)備364、輸出設(shè)備366、隨機(jī)存取存儲器(RAM)368、只讀存儲器(ROM)370、CD-ROM、硬盤驅(qū)動器或者其它磁或光存儲設(shè)備372以及一個或多個處理器374。輸入設(shè)備364例如可包括鍵盤、鼠標(biāo)、圖形輸入板、觸摸屏、壓敏板、操縱桿、光筆、麥克風(fēng)或者其它適合輸入設(shè)備。輸出設(shè)備366例如可包括視頻顯示器、打印機(jī)、盤驅(qū)動器、繪圖儀、揚(yáng)聲器或其它適合輸出設(shè)備。
圖3的虛線內(nèi)的項目表示系統(tǒng)300的關(guān)聯(lián)組件的示例性功能操作和數(shù)據(jù)組織。在所示實施例中,主機(jī)360包括應(yīng)用程序362和數(shù)據(jù)庫304。數(shù)據(jù)庫304可相同或類似于圖1和2的數(shù)據(jù)庫104和數(shù)據(jù)庫204。
應(yīng)用程序362可表示使用規(guī)則庫構(gòu)建和推理功能性的專家應(yīng)用程序或其它應(yīng)用程序。在所示例子中,應(yīng)用程序362包括規(guī)則庫構(gòu)建器310、推理引擎312以及其它編程邏輯374。規(guī)則庫構(gòu)建器310可相同或類似于圖1和2的規(guī)則庫構(gòu)建器110和規(guī)則庫構(gòu)建器210。同樣,推理引擎312可相同或類似于圖1和2的推理引擎112和推理引擎212。另外,規(guī)則庫構(gòu)建器310和推理引擎312可以但無需包括API 318和320。
附加編程邏輯374可表示調(diào)用規(guī)則庫構(gòu)建器310和推理引擎312的應(yīng)用程序362中的邏輯。例如,邏輯374可實現(xiàn)從用戶接收病人癥狀并且將癥狀傳給推理引擎312的醫(yī)療專家程序。在推理引擎312執(zhí)行推理之后,邏輯374可使診斷可用于用戶。應(yīng)用程序362中的邏輯374可執(zhí)行任何其它適合功能。
在特定實施例中,應(yīng)用程序362可表示Java應(yīng)用程序。另外,API 318、320可包括作為應(yīng)用程序362中的本地服務(wù)調(diào)用的有狀態(tài)接口。
雖然圖3示出用于提供推理服務(wù)的示例系統(tǒng)300,但是也可對系統(tǒng)300進(jìn)行各種改變。例如,雖然圖3示出主機(jī)360的一個示例功能劃分,但是根據(jù)具體需要,可組合或省略主機(jī)360的各個組件,并且可增加另外的組件。作為特定例子,可從主機(jī)360中省略規(guī)則庫構(gòu)建器310或推理引擎312。另外,雖然圖3示出主機(jī)360為桌面計算機(jī),但是也可使用其它計算或通信設(shè)備。另外,雖然圖1-3示出各種示例操作環(huán)境,但是規(guī)則庫構(gòu)建器110、210、310和推理引擎112、212、312也可用于任何其它適合環(huán)境中。
圖4是示出根據(jù)本發(fā)明一個實施例的示例規(guī)則庫架構(gòu)400的示例性方框圖。在本實施例中,規(guī)則庫架構(gòu)400包括規(guī)則庫級元素402、域級元素404、以及規(guī)則集級元素406。雖然規(guī)則庫架構(gòu)400可以關(guān)于圖1的系統(tǒng)100來描述,但是規(guī)則庫架構(gòu)400也可與其它系統(tǒng)一起使用,并且系統(tǒng)100也可使用其它規(guī)則庫架構(gòu)。
在圖4中,規(guī)則庫級元素402包括類408、初始化方法410、關(guān)聯(lián)412、約束414以及域416。類408定義存儲信息的數(shù)據(jù)對象和可以處理數(shù)據(jù)對象中的信息的方法對象。例如,類408可定義Person(人)對象,其包括人名、年齡及其配偶姓名(若有的話)的字段。作為另一個例子,類408可定義Retirement(退休)方法,其分析Person實例,比較該人的年齡與65的值,并且根據(jù)比較來設(shè)置識別該人是否達(dá)到退休年齡的標(biāo)志。
初始化方法410定義服務(wù)器102如何初始化各個對象中的字段。例如,初始化方法410可將一組數(shù)據(jù)對象中的任何整數(shù)字段初始化為零值,并且將任何字符串字段初始化為空(NULL)值。初始化方法410還可例如通過將最大年齡字段設(shè)為120的值來設(shè)置約束值。
關(guān)聯(lián)412定義字段之間的關(guān)系。例如,Person實例可以是另一個Person實例的配偶,并且關(guān)聯(lián)可以表示Person實例之間的一對一關(guān)系。作為另一個例子,Person實例可擁有多個Duck(鴨子)實例,并且關(guān)聯(lián)可表示Person與Duck實例之間的一對多關(guān)系。在一個實施例中,相關(guān)字段處于架構(gòu)400的相同級別,例如在兩個類408中。在特定實施例中,關(guān)聯(lián)由兩個角色定義。每個角色指定類和由該類擁有的實例引用字段。一個對象中的實例引用字段指向或者識別另一個對象。例如,Ownership(擁有關(guān)系)關(guān)聯(lián)可對Person類的Owns(擁有)字段定義一個角色,并且對Duck類的IsOwnedBy(被擁有)字段定義另一個角色。
約束414定義關(guān)于賦給字段的值應(yīng)為真的條件。約束414還定義如果違反條件則發(fā)生的操作。例如,約束414可指定存儲人年齡的字段應(yīng)當(dāng)具有0到120之間的值。如果Person實例被賦為800的年齡,則違反與年齡字段相關(guān)聯(lián)的約束414,并且可執(zhí)行由該約束414定義的操作。該操作可包括推理引擎112停止推理,使用替代值,或者使用有狀態(tài)接口120,以從客戶端應(yīng)用程序122請求正確值。
域416將規(guī)則分成稱作域的不同組。在每個域416中,規(guī)則庫可包括初始化方法418、關(guān)聯(lián)420、約束422、類424以及規(guī)則集426。初始化方法418、關(guān)聯(lián)420、約束422和類424可相同或類似于初始化方法410、關(guān)聯(lián)412、約束414和類408。這些域級元素404可具有不同于規(guī)則庫級元素402的范圍。例如,雖然關(guān)聯(lián)412可定義處于規(guī)則庫級別的兩個類之間的關(guān)系,但是關(guān)聯(lián)420也可定義處于域級別的類之間的關(guān)系。在某些實施例中,前置條件和后置條件可以在主要級別定義。
規(guī)則集426還將規(guī)則分成稱作規(guī)則集的不同組。在每個規(guī)則集426中,規(guī)則庫可包括初始化方法428、關(guān)聯(lián)430、約束432、類434以及規(guī)則436。這些規(guī)則集級元素406可具有與對應(yīng)規(guī)則庫級元素402和域級元素404不同的范圍。例如,關(guān)聯(lián)430可定義處于規(guī)則集級別的類之間的關(guān)系。
規(guī)則436定義用來分析輸入值并產(chǎn)生輸出值的邏輯。規(guī)則436可處理數(shù)據(jù)對象,如使用類408、424、434創(chuàng)建的對象中的信息。規(guī)則436還可使用在方法對象中定義的方法,以賦值給數(shù)據(jù)對象中的字段。在一個實施例中,規(guī)則436包括決策樹規(guī)則和模式匹配規(guī)則。示例模式匹配規(guī)則如下面描述的圖9A所示。示例決策樹規(guī)則如下面描述的圖9B所示。
雖然圖4示出規(guī)則庫架構(gòu)400的一個例子,但是可對規(guī)則庫架構(gòu)400進(jìn)行各種改變。例如,根據(jù)具體需要,可以向架構(gòu)400的各個級別增加另外的元素,并且可以省略當(dāng)前元素。
圖5A和5B是示出根據(jù)本發(fā)明一個實施例的示例規(guī)則庫構(gòu)建器的示例性方框圖。具體地說,圖5A示出無狀態(tài)規(guī)則庫構(gòu)建器500,而圖5B示出有狀態(tài)規(guī)則庫構(gòu)建器550。雖然圖5A和5B可以關(guān)于圖1的系統(tǒng)100來描述,但是規(guī)則庫構(gòu)建器500、550也可與其它系統(tǒng)一起使用。
在圖5A中,無狀態(tài)規(guī)則庫構(gòu)建器500允許應(yīng)用程序調(diào)用各種函數(shù)調(diào)用502,并且函數(shù)調(diào)用502使用各種數(shù)據(jù)結(jié)構(gòu)504作為輸入和輸出。在所示實施例中,函數(shù)調(diào)用502包括構(gòu)造器函數(shù)506以及構(gòu)建函數(shù)508。構(gòu)造器函數(shù)506創(chuàng)建規(guī)則庫構(gòu)建器500的實例,以由請求規(guī)則庫構(gòu)建服務(wù)的應(yīng)用程序使用。例如,客戶端應(yīng)用程序122可在網(wǎng)絡(luò)106上調(diào)用構(gòu)造器函數(shù)506。服務(wù)器102執(zhí)行構(gòu)造器函數(shù)506,并且實例化規(guī)則庫構(gòu)建器500的實例,從而創(chuàng)建規(guī)則庫構(gòu)建器實例。然后,來自客戶端應(yīng)用程序122的另外函數(shù)調(diào)用被引導(dǎo)到該規(guī)則庫構(gòu)建器實例。如果多個客戶端應(yīng)用程序122請求規(guī)則庫構(gòu)建服務(wù),則服務(wù)器102可執(zhí)行構(gòu)造器函數(shù)506,以創(chuàng)建規(guī)則庫構(gòu)建器500的多個實例。
構(gòu)建函數(shù)508使規(guī)則庫構(gòu)建器實例將各個輸入,如規(guī)則庫、規(guī)則以及規(guī)則集合并到統(tǒng)一規(guī)則庫中。構(gòu)建函數(shù)508可接受二進(jìn)制規(guī)則庫510、字符串512a-512b,以及控制對象513作為輸入。輸入字符串512a表示XML字符串,其包括未經(jīng)編譯的或源規(guī)則、規(guī)則庫和規(guī)則集。輸入字符串512b表示統(tǒng)一資源定位符(URL),其識別經(jīng)編譯或未經(jīng)編譯的規(guī)則、規(guī)則庫和規(guī)則集的遠(yuǎn)程位置。在構(gòu)建統(tǒng)一規(guī)則庫之前,規(guī)則庫構(gòu)建器實例可訪問由URL識別的遠(yuǎn)程位置,并且在該位置檢索任何規(guī)則、規(guī)則庫或規(guī)則集。
服務(wù)器102使用包含在控制對象513中的值528,以標(biāo)識當(dāng)執(zhí)行構(gòu)建函數(shù)508時規(guī)則庫構(gòu)建器實例應(yīng)執(zhí)行的不同功能。例如,值528a指示規(guī)則庫構(gòu)建器實例是否生成應(yīng)用程序接口文檔522。值528b指示規(guī)則庫構(gòu)建器實例是否生成二進(jìn)制規(guī)則庫516。值528c指示規(guī)則庫構(gòu)建器實例是否生成裝載圖(load map)524。值528d-528f指示規(guī)則庫構(gòu)建器實例是否跟蹤各種事件,其可以在消息526中描述。在本例中,事件可分成高級別或L1事件、低級別事件或L2事件以及裝載器事件。也可使用其它事件劃分。
當(dāng)調(diào)用構(gòu)建函數(shù)508時,規(guī)則庫構(gòu)建器實例可以試圖組合輸入規(guī)則、規(guī)則庫和規(guī)則集,并且產(chǎn)生輸出結(jié)果514。輸出結(jié)果514可包括統(tǒng)一二進(jìn)制規(guī)則庫516。規(guī)則庫516表示將這些輸入合并到統(tǒng)一規(guī)則庫中并且進(jìn)行編譯時所形成的規(guī)則庫。輸出結(jié)果514還可包括錯誤計數(shù)518和警告計數(shù)520。錯誤計數(shù)518識別當(dāng)創(chuàng)建統(tǒng)一規(guī)則庫516時所識別的錯誤數(shù),而警告計數(shù)520識別所產(chǎn)生的警告數(shù)。
輸出結(jié)果514還可包括應(yīng)用程序接口文檔522和裝載圖524。應(yīng)用程序接口文檔522描述由規(guī)則庫516使用的輸入值和由規(guī)則庫516產(chǎn)生的輸出值。當(dāng)二進(jìn)制規(guī)則庫516將結(jié)合正被開發(fā)的應(yīng)用程序一起使用時,應(yīng)用程序接口文檔522可以是有用的。應(yīng)用程序接口文檔522可描述與規(guī)則庫516相關(guān)聯(lián)的輸入和輸出,并且創(chuàng)建應(yīng)用程序的開發(fā)者可確保應(yīng)用程序向規(guī)則庫516發(fā)送適當(dāng)?shù)妮斎?,并且從?guī)則庫516預(yù)期適當(dāng)?shù)妮敵觥?br>
裝載圖524識別規(guī)則庫516中的各個對象。裝載圖524還識別規(guī)則庫516中的對象之間的關(guān)系,以及規(guī)則庫516中影響該對象的任何規(guī)則。例如,對于給定對象,裝載圖524可識別從該對象讀取值或向其寫入值的任何規(guī)則。裝載圖524還可例如由系統(tǒng)100中的另一個組件處理以生成規(guī)則庫報告。規(guī)則庫報告可識別規(guī)則庫516中的規(guī)則、規(guī)則之間的交互、或者其它適合信息。
輸出結(jié)果514還可包括零個或更多消息526的集合。消息526可包括在統(tǒng)一規(guī)則庫516的創(chuàng)建期間產(chǎn)生的錯誤和警告消息。消息526還可包括跟蹤消息,如用來識別在統(tǒng)一規(guī)則庫516的創(chuàng)建或編譯期間發(fā)生的不同事件的消息。
在操作的一方面,輸出結(jié)果514的內(nèi)容可根據(jù)值528而變化。例如,如果值528a具有假值,則輸出結(jié)果514將不包括應(yīng)用程序接口文檔522。類似地,如果值528c具有真值,則輸出結(jié)果514將包括裝載圖524。如果值528b具有假值,則輸出結(jié)果514將不包括二進(jìn)制規(guī)則庫。例如,當(dāng)需要用于現(xiàn)有二進(jìn)制規(guī)則庫的應(yīng)用程序接口文檔522或裝載圖524時,這可以是有用的。
在圖5B中,有狀態(tài)規(guī)則庫構(gòu)建器550允許應(yīng)用程序調(diào)用使用數(shù)據(jù)結(jié)構(gòu)554作為輸入和輸出的各種函數(shù)調(diào)用552。在所示實施例中,函數(shù)調(diào)用552包括構(gòu)造器函數(shù)556。構(gòu)造器函數(shù)556創(chuàng)建規(guī)則庫構(gòu)建器550的實例,以由請求規(guī)則庫構(gòu)建服務(wù)的應(yīng)用程序使用。構(gòu)造器函數(shù)556包括兩個輸入值,即跟蹤掩碼(tracemask)568和消息處理程序(handler)570。為跟蹤掩碼568提供的值確定提供給客戶端應(yīng)用程序122的跟蹤消息的詳細(xì)級別。詳細(xì)級別可識別是否提供跟蹤消息,并且如果提供,則應(yīng)在什么情形下提供跟蹤消息。如下所述,消息處理程序570識別用來在客戶端應(yīng)用程序122與規(guī)則庫構(gòu)建器實例之間傳送信息的處理程序。例如,消息處理程序570允許規(guī)則庫構(gòu)建器550執(zhí)行回調(diào)操作,并且從客戶端應(yīng)用程序122請求信息。
增加規(guī)則庫函數(shù)558a-558c識別要合并到統(tǒng)一規(guī)則庫中的不同規(guī)則庫、規(guī)則和規(guī)則集。增加規(guī)則庫函數(shù)558a接受當(dāng)生成統(tǒng)一規(guī)則庫時要使用的二進(jìn)制規(guī)則庫、規(guī)則或規(guī)則集。增加規(guī)則庫函數(shù)558b接受當(dāng)生成統(tǒng)一規(guī)則庫時要使用的源或未經(jīng)編譯規(guī)則庫、規(guī)則或規(guī)則集。增加規(guī)則庫函數(shù)558c接受URL,其識別當(dāng)生成統(tǒng)一規(guī)則庫時要使用的規(guī)則庫、規(guī)則或規(guī)則集的遠(yuǎn)程位置。當(dāng)使用增加規(guī)則庫函數(shù)558a-558c增加每個規(guī)則庫、規(guī)則或規(guī)則集時,將其與先前增加的規(guī)則庫、規(guī)則和規(guī)則集進(jìn)行合并。編譯函數(shù)560編譯所合并的規(guī)則庫以創(chuàng)建二進(jìn)制規(guī)則庫。
生成應(yīng)用程序接口文檔函數(shù)562生成應(yīng)用程序接口文檔。生成二進(jìn)制規(guī)則庫函數(shù)564通過輸出流向客戶端應(yīng)用程序122提供二進(jìn)制規(guī)則庫,并且客戶端應(yīng)用程序122可將輸出流存儲到緩沖器或其它存儲器中。生成裝載圖函數(shù)566生成規(guī)則庫的裝載圖。
由于有狀態(tài)規(guī)則庫構(gòu)建器550維護(hù)會話信息,因此由規(guī)則庫構(gòu)建器550支持的各種函數(shù)調(diào)用552可以由客戶端應(yīng)用程序122單獨調(diào)用。例如,使用客戶端應(yīng)用程序122的用戶可能想要現(xiàn)有二進(jìn)制規(guī)則庫的應(yīng)用程序接口文檔??蛻舳藨?yīng)用程序122可使用增加規(guī)則庫函數(shù)之一558a將二進(jìn)制規(guī)則庫提供給構(gòu)建器550。然后,客戶端應(yīng)用程序122可通過調(diào)用函數(shù)562來生成應(yīng)用程序接口文檔。如果用戶以后決定生成裝載圖,客戶端應(yīng)用程序122可調(diào)用函數(shù)566,以使用相同規(guī)則庫構(gòu)建器實例生成裝載圖。
雖然圖5A和5B示出示例規(guī)則庫構(gòu)建器500、550,但是可對規(guī)則庫構(gòu)建器500、550進(jìn)行各種改變。例如,根據(jù)具體需要,可從構(gòu)建器500、550中省略各種函數(shù)調(diào)用502、552。另外,可以向構(gòu)建器500、550增加另外的函數(shù)調(diào)用502、552。另外,雖然圖5A、5B示出與函數(shù)調(diào)用502、552一起使用的示例數(shù)據(jù)結(jié)構(gòu)504、554,但是也可使用其它或附加的數(shù)據(jù)結(jié)構(gòu)。
圖6A到6C是示出根據(jù)本發(fā)明一個實施例的示例推理引擎的示例性方框圖。具體地說,圖6A示出無狀態(tài)推理引擎600,而圖6B和6C示出有狀態(tài)推理引擎650。雖然圖6A到6C可以關(guān)于圖1的系統(tǒng)100來描述,但是推理引擎600、650也可與其它系統(tǒng)一起使用。
在圖6A中,無狀態(tài)推理引擎600允許應(yīng)用程序調(diào)用使用數(shù)據(jù)結(jié)構(gòu)604作為輸入和輸出的函數(shù)調(diào)用602。在所示實施例中,函數(shù)調(diào)用602包括創(chuàng)建推理引擎600的實例以由應(yīng)用程序使用的構(gòu)造器函數(shù)606。函數(shù)調(diào)用602還包括兩個推理函數(shù)608、610。
推理函數(shù)608使用提供給引擎600的規(guī)則庫612和控制對象613作為輸入來調(diào)用引擎600的推理。規(guī)則庫612可包括如圖4中的域416所示的多個域。結(jié)果,推理函數(shù)608還接收域名614作為輸入,其中域名614識別在推理期間要使用哪個域416。推理函數(shù)608還接收在推理期間要創(chuàng)建和使用的任何動態(tài)實例616的標(biāo)識。推理函數(shù)608還接收任何有條件規(guī)則集618,其表示要與由域名614標(biāo)識的域一起使用的附加規(guī)則。另外,推理函數(shù)608可接收前置條件值620a-620b作為輸入。前置條件值620被賦予所標(biāo)識規(guī)則庫612中的適當(dāng)字段,并且在推理期間被使用。前置條件值620可采取前置條件值文檔620a或前置條件值數(shù)組620b的形式。
控制對象613定義由服務(wù)器102使用的值632a-632f,以控制由推理引擎實例執(zhí)行的操作。值632a指示推理引擎實例生成字段值數(shù)組626b,而值632b指示推理引擎實例生成字段值文檔626a。值632c指示推理引擎實例生成規(guī)則快照630。值632d-632f指示推理引擎實例跟蹤可在消息628中描述的各種事件。在本例中,這些事件分成L1事件、L2事件和推理事件。也可使用其它的事件劃分方法。
推理函數(shù)610接收很多與推理函數(shù)608相同的輸入。推理函數(shù)608接收二進(jìn)制規(guī)則庫612,而推理函數(shù)610接收標(biāo)識在推理期間所要使用的規(guī)則庫的位置的URL輸入622。
推理函數(shù)608、610返回輸出結(jié)果624。輸出結(jié)果624可包括零個或多個字段值626a-626b的集合。字段值626表示在推理期間由推理引擎600賦給后置條件的值。根據(jù)值632a和632b,字段值626可采取字段值文檔626a或字段值數(shù)組626b的形式。輸出結(jié)果624還可包括零個或更多消息628的集合。消息628可包括在推理操作期間產(chǎn)生的錯誤消息、警告消息和跟蹤消息。
輸出結(jié)果624還可包括規(guī)則快照630。規(guī)則快照630提供特定時間點的當(dāng)前規(guī)則狀態(tài)信息。規(guī)則快照630可標(biāo)識規(guī)則、與規(guī)則相關(guān)聯(lián)的任何規(guī)則集、規(guī)則的優(yōu)先級、與規(guī)則相關(guān)聯(lián)的規(guī)則類型、規(guī)則狀態(tài)、以及規(guī)則中導(dǎo)致規(guī)則掛起的任何字段。
在圖6B和6C中,有狀態(tài)推理引擎650允許應(yīng)用程序調(diào)用使用數(shù)據(jù)結(jié)構(gòu)654作為輸入和輸出的各種函數(shù)調(diào)用652。在所示實施例中,構(gòu)造器函數(shù)654a-654c創(chuàng)建推理引擎650的實例。具體地說,函數(shù)654a創(chuàng)建使用采用輸入流定義的二進(jìn)制規(guī)則庫的推理引擎實例,并且函數(shù)654b創(chuàng)建使用采用URL定義的二進(jìn)制規(guī)則庫的推理引擎實例。如下所述,多個推理引擎實例可使用相同規(guī)則庫,并且函數(shù)654c根據(jù)使用相同規(guī)則庫的另一推理引擎實例創(chuàng)建一個推理引擎實例。
域函數(shù)656a-656b控制在推理期間使用哪個域416。域函數(shù)656a標(biāo)識在推理期間所要使用的域416,并且域函數(shù)656b刪除域416,從而在推理期間不再使用它。輸入函數(shù)658a-658b將前置條件的值提供給推理引擎650。具體地說,函數(shù)658a提供特定前置條件的值,而函數(shù)658b提供與當(dāng)前域416相關(guān)聯(lián)的一組前置條件的值。有條件規(guī)則集函數(shù)660將附加規(guī)則集提供給推理引擎650以與當(dāng)前域416一起使用。動態(tài)實例函數(shù)662創(chuàng)建在推理期間所要使用的動態(tài)實例。推理函數(shù)664使用包含在當(dāng)前域416中的規(guī)則開始推理過程。輸出函數(shù)666提供由推理引擎650計算的后置條件值。具體地說,函數(shù)666a創(chuàng)建包含一組后置條件的值的輸出值文檔,函數(shù)666b提供特定后置條件的值,并且函數(shù)666c提供所有前置條件和后置條件的值??煺蘸瘮?shù)668生成和輸出當(dāng)前域的規(guī)則快照。
由于有狀態(tài)推理引擎650維護(hù)會話信息,因此可由推理引擎650提供附加函數(shù)。例如,推理引擎650可提供說明性服務(wù),其用來確定在推理期間如何向特定字段賦值。開始說明函數(shù)670接收字段標(biāo)識作為輸入,并且識別將最終值賦給該字段的規(guī)則。說明規(guī)則觸發(fā)函數(shù)672使用由開始說明函數(shù)670識別的規(guī)則,并且確定是什么導(dǎo)致觸發(fā)該規(guī)則。這可包括識別導(dǎo)致規(guī)則觸發(fā)的任何字段以及這些字段的值。說明字段求解函數(shù)674使用由說明規(guī)則觸發(fā)函數(shù)672識別的字段,并且確定如何向該字段賦值。這些函數(shù)670-674允許客戶端應(yīng)用程序122跟蹤在推理期間如何和為什么賦值給字段。這些函數(shù)670-674可要求服務(wù)器102對在推理期間執(zhí)行的各個步驟進(jìn)行監(jiān)視和歸檔。由于該監(jiān)視在推理期間可施加附加處理要求,因此跟蹤函數(shù)676a-676b允許客戶端應(yīng)用程序122指定服務(wù)器102何時應(yīng)監(jiān)視在推理期間執(zhí)行的步驟。這允許客戶端應(yīng)用程序122控制何時需要該附加處理。
有狀態(tài)推理引擎650的使用還可允許服務(wù)器102向客戶端應(yīng)用程序122提供真實維護(hù)(truth maintenance)(“TM”)功能。在推理期間,將已知值賦給字段可觸發(fā)一連串后果。例如,如果規(guī)則由于字段沒有已知值而先前被掛起,則向該字段賦值可導(dǎo)致推理引擎650使該規(guī)則解除掛起,然后觸發(fā)該規(guī)則。所觸發(fā)的規(guī)則可能又求解出其它字段,該其它字段又導(dǎo)致推理引擎650使另外規(guī)則解除掛起,并且觸發(fā)該另外規(guī)則。真實維護(hù)是指允許客戶端應(yīng)用程序122撤消或撤回對字段的賦值,從而撤消該賦值的后果的機(jī)制。這意味著真實維護(hù)功能性可以有用于“假設(shè)分析(what-if)”型推理。作為特定例子,在貸款核定應(yīng)用程序中,借款人可能想要以若干不同變量如貸款金額、貸款期限和利率來試驗。在這些情形下,由于存在一組假設(shè)場景,因此“答案”是不確定的,并且只有在以可選場景試驗之后才可能知道答案。
為了支持真實維護(hù),設(shè)置TM值函數(shù)678表示特定字段可被賦予可撤消值??沙废当硎驹谀鼙环駴Q的賦值期間所賦的值??蛻舳藨?yīng)用程序122可將多個值賦給選定字段。確認(rèn)TM值函數(shù)680將特定字段的當(dāng)前值設(shè)為那個字段的不可撤消值。不可撤消值表示在不能被否決的賦值期間所賦的值。撤消TM值函數(shù)682將字段撤消回到其最后的不可撤消值。在操作中,客戶端應(yīng)用程序122可將五個可撤消值賦給字段??蛻舳藨?yīng)用程序122然后可將不可撤消值賦給該字段,隨后是七個以上可撤消值。在本例中,賦給字段的最后七個值可被撤消,但是前五個不能。不可撤消值的存在防止推理引擎650撤消在賦予不可撤消值之前所賦的任何值?;氐劫J款例子,選定字段可表示借款人想要接收的最大金額。在一些試驗中,該字段可被賦予多個可撤消的值。逐漸地,用戶可以識別借款者被允許接收的最大金額。該最大金額可被賦為不可撤消值。可以完成將附加的可撤消值賦給字段的附加試驗。這些附加值中的任一個都可被接受為貸款金額,或者可以將這些值撤回為被標(biāo)識為不可撤消值的最后最大貸款金額。
除了這些函數(shù)之外,處理程序函數(shù)684a-684b向推理引擎實例登記各個通信處理程序。如下所述,處理程序函數(shù)允許推理引擎實例在推理期間與客戶端應(yīng)用程序122通信。復(fù)位函數(shù)686將推理引擎實例復(fù)位到初始狀態(tài)。例如,這可包括推理引擎650將所有字段值復(fù)位到未知狀態(tài),刪除所有動態(tài)實例,彈出(popping)所有域,并且運(yùn)行任何規(guī)則庫級初始化方法410。
雖然圖6A到6C示出示例推理引擎600、650,但是可對推理引擎600、650進(jìn)行各種改變。例如,根據(jù)具體需要,可從推理引擎600、650中省略各種函數(shù)調(diào)用602、652。另外,可向推理引擎600、650增加另外的函數(shù)調(diào)用602、652。另外,雖然圖6A到6C示出與函數(shù)調(diào)用602、652一起使用的示例數(shù)據(jù)結(jié)構(gòu)604、654,但是也可使用其它或附加數(shù)據(jù)結(jié)構(gòu)。
圖7是示出根據(jù)本發(fā)明一個實施例的示例核心對象700的示例性方框圖。核心對象700表示由規(guī)則庫構(gòu)建器500、550和推理引擎600、650共享的對象。雖然圖7可以關(guān)于圖2的系統(tǒng)200來描述,但是核心對象700也可與其它系統(tǒng)一起使用。
在圖7中,核心對象700使用各種數(shù)據(jù)結(jié)構(gòu)702以與規(guī)則庫構(gòu)建器500、550和推理引擎600、650通信。數(shù)據(jù)結(jié)構(gòu)702包括消息處理程序704。消息處理程序704表示用來與客戶端應(yīng)用程序222通信的處理程序。例如,消息處理程序704可用來截取來自規(guī)則庫構(gòu)建器500、550或推理引擎600、650的消息706。這可允許消息處理程序704捕獲由規(guī)則庫構(gòu)建器500、550或推理引擎600、650產(chǎn)生的錯誤、警告、跟蹤或其它消息706。數(shù)據(jù)結(jié)構(gòu)702還包括異常708。異常708標(biāo)識在規(guī)則庫構(gòu)建或推理期間檢測的錯誤。
數(shù)據(jù)結(jié)構(gòu)702還可包括跟蹤掩碼710。跟蹤掩碼710表示如何跟蹤由服務(wù)器102執(zhí)行不同功能。為跟蹤掩碼710提供的整數(shù)值確定提供給客戶端應(yīng)用程序222的跟蹤消息的詳細(xì)級別。詳細(xì)級別可標(biāo)識是否提供跟蹤消息,并且如果提供,則應(yīng)在什么情形下提供跟蹤消息。例如,零值可導(dǎo)致服務(wù)器202不提供任何跟蹤消息,并且一的值可導(dǎo)致服務(wù)器202提供較一般的跟蹤消息,并且較高的值可導(dǎo)致服務(wù)器202提供較特定的跟蹤消息。在本例中,事件分成推理事件、L1事件和L2事件和裝載器事件。也可使用其它事件劃分方法。
雖然圖7示出核心對象700的一個例子,但是也可對核心對象700進(jìn)行各種改變。例如,可使用任何其它或附加數(shù)據(jù)結(jié)構(gòu)702。
圖8是根據(jù)本發(fā)明一個實施例的示例接口800的示例性方框圖。在本實施例中,接口800包括初始化處理程序802和改變處理函數(shù)804。雖然圖8可關(guān)于圖1的系統(tǒng)100來描述,但是接口800也可與其它系統(tǒng)一起使用。
初始化處理程序802允許客戶端應(yīng)用程序122初始化字段值。例如,推理引擎650可試圖在推理期間執(zhí)行規(guī)則,但是該規(guī)則可能包括未知字段。推理引擎650可掛起該規(guī)則,并且檢查未知字段是否以后被求解。作為掛起規(guī)則的替代或補(bǔ)充,推理引擎650可調(diào)用初始化處理程序802,并且向客戶端應(yīng)用程序122詢問是否客戶端應(yīng)用程序122想要為未知字段提供值。如果客戶端應(yīng)用程序122提供值,則推理引擎650可使用該值并且繼續(xù)推理。
當(dāng)規(guī)則庫存在大量前置條件時,初始化處理程序802的使用可以是有用的。例如,規(guī)則庫可具有1,000個前置條件。在不使用初始化處理程序802的情況下,在推理開始之前,客戶端應(yīng)用程序122將為所有1,000個前置條件提供輸入值。在使用初始化處理程序802的情況下,客戶端應(yīng)用程序122可為一些前置條件提供輸入值,并且推理引擎650可以使用這些值嘗試完成推理。如果推理引擎650不能完成推理并且需要更多前置條件的值,則客戶端應(yīng)用程序122可使用初始化處理程序802以提供必要前置條件的輸入值。
當(dāng)推理引擎650改變各個數(shù)據(jù)對象時,改變處理函數(shù)804允許服務(wù)器102通知客戶端應(yīng)用程序122。例如,當(dāng)改變字段值時,函數(shù)806通知客戶端122。當(dāng)創(chuàng)建對象時,函數(shù)808通知客戶端應(yīng)用程序122,并且當(dāng)刪除對象時,函數(shù)810通知客戶端應(yīng)用程序122。
當(dāng)在推理期間由推理引擎650計算大量后置條件時,改變處理程序804的使用可以是有用的。例如,規(guī)則庫可具有1,000個后置條件。在不使用改變處理程序804的情況下,在從推理引擎650接收1,000個輸出值的集合之前,客戶端應(yīng)用程序122可能需要等待直到推理引擎650完成推理。在使用改變處理程序804的情況下,每當(dāng)后置條件之一被賦值時,就可通知客戶端應(yīng)用程序122。這樣,即使當(dāng)推理尚未完成時,客戶端應(yīng)用程序122也了解各個后置條件何時被賦值。
雖然圖8示出示例接口800,但是也可對接口800進(jìn)行各種改變。例如,可使用任何其它或附加通信處理程序。另外,每個處理程序802、804可支持任何其它或附加功能。
圖9A和9B是示出根據(jù)本發(fā)明一個實施例的示例規(guī)則類型的示例性方框圖。具體地說,圖9A示出模式匹配規(guī)則900,而圖9B示出決策樹規(guī)則950。也可使用其它或附加類型的規(guī)則。另外,雖然圖9A和9B可關(guān)于圖1的系統(tǒng)100來描述,但是規(guī)則900、950也可與其它系統(tǒng)一起使用。
在圖9A中,模式匹配規(guī)則900包括前提902、操作904以及綁定區(qū)906。前提902表示確定是否應(yīng)執(zhí)行操作904的條件。例如,前提902可包括一個或多個表達(dá)式908。服務(wù)器102可檢查前提902中的表達(dá)式908,并且確定表達(dá)式908是真還是假。使用這些結(jié)果,如果表達(dá)式908為真,則服務(wù)器102可通過執(zhí)行操作904來觸發(fā)規(guī)則900,而如果表達(dá)式908為假,則舍棄規(guī)則900,或者如果不能確定表達(dá)式908的值,則掛起規(guī)則900。
操作904表示如果規(guī)則900的前提902為真、則要由服務(wù)器102執(zhí)行的一個或多個操作。例如,操作904可表示服務(wù)器102應(yīng)將特定值賦給字段。操作904還可使服務(wù)器102執(zhí)行功能或調(diào)用不同規(guī)則庫域上的子推理。
綁定區(qū)906標(biāo)識要由服務(wù)器102監(jiān)視的數(shù)據(jù)對象。由于規(guī)則900是模式匹配規(guī)則,因此它可應(yīng)用于滿足前提902的實例或?qū)ο蟮恼麄€集合。綁定區(qū)906包括一個或多個綁定變量910。推理引擎112將綁定變量910與綁定類的一個或多個候選實例相關(guān)聯(lián)。然后,推理引擎112將綁定變量910應(yīng)用于前提904,以確定任何候選實例是否滿足前提902。這樣,推理引擎112確定候選實例是否應(yīng)受進(jìn)一步的關(guān)注。如果任何候選實例滿足前提902,則服務(wù)器102使用這些候選實例執(zhí)行操作904。
在所示例子中,P的綁定變量910與Person類相關(guān)聯(lián),而D的另一個綁定變量910與Duck類相關(guān)聯(lián)。當(dāng)人的年齡大于鴨子并且該人不擁有任何其它鴨子時,規(guī)則900用來將表示該人的Person對象與表示該鴨子的Duck對象相關(guān)聯(lián)。服務(wù)器102將Person對象綁定于P變量910,并且將Duck對象綁定于D變量910。使用綁定變量910,服務(wù)器102檢查現(xiàn)有Person和Duck對象,并且確定是否有任何對象滿足前提902。如果有任何對象滿足前提902,則服務(wù)器102將規(guī)則900的操作904施加于這些數(shù)據(jù)對象的每一個。操作904增加由該人擁有的鴨子的數(shù)目,并且將該人與該鴨子相關(guān)聯(lián)。
在特定實施例中,服務(wù)器102將模式匹配規(guī)則900保持于就緒狀態(tài),并且不舍棄或掛起模式匹配規(guī)則900。在另一個特定實施例中,模式匹配規(guī)則900可用作單觸發(fā)規(guī)則。在本實施例中,推理引擎112等待直到閾值數(shù)目的對象綁定于綁定變量910。一旦滿足閾值數(shù)目,則推理引擎112使用這些對象執(zhí)行模式匹配規(guī)則900一次。然后可以由推理引擎112忽略所執(zhí)行的模式匹配規(guī)則900。
由于規(guī)則庫可包括大量對象,因此服務(wù)器102可使用一種或多種算法來提高處理模式匹配規(guī)則900的效率。例如,服務(wù)器102可使用神經(jīng)網(wǎng)絡(luò)(Rete)算法。使用神經(jīng)網(wǎng)絡(luò)算法,服務(wù)器102檢測何時創(chuàng)建、修改或刪除對象。然后,服務(wù)器102執(zhí)行具有使用受影響于創(chuàng)建、修改或刪除的字段的前提902的任何模式匹配規(guī)則900。服務(wù)器102可檢查所定位的任何模式匹配規(guī)則900的前提902,并且如果滿足前提902,則執(zhí)行操作904。
在一個實施例中,當(dāng)應(yīng)用第一模式匹配規(guī)則900的操作904時,服務(wù)器102可創(chuàng)建、修改或刪除對象。這些對象可以受影響于同一模式匹配規(guī)則900或另一模式匹配規(guī)則900。結(jié)果,操作904可引起新對象與一條或多條規(guī)則900的綁定。
在圖9B中,決策樹規(guī)則950包括求值語句952或子樹,隨后是兩個或更多樹節(jié)點954a-954e。每個子樹可被命名成使其可以容易地與規(guī)則相關(guān)聯(lián)。求值語句952計算和確定表達(dá)式956的值。根據(jù)表達(dá)式956的算出值,執(zhí)行樹節(jié)點954之一。
每個樹節(jié)點954包括所要執(zhí)行的操作之前的case語句958或otherwise語句960。case語句958標(biāo)識表達(dá)式956的可能值或可能值的范圍。如果表達(dá)式956的值匹配case語句958的值或者落在其值范圍內(nèi),則執(zhí)行與case語句958相關(guān)聯(lián)的樹節(jié)點954。otherwise語句960標(biāo)識如果不能執(zhí)行任何其它樹節(jié)點954則執(zhí)行的樹節(jié)點954。
要在樹節(jié)點954中執(zhí)行的操作還可包括附加子樹。例如,樹節(jié)點954a包括另一個求值語句962和兩個樹節(jié)點964a-964b。這樣,規(guī)則950可分成子樹的分級層,并且服務(wù)器102可遍歷(traverse through)這些子樹以到達(dá)要執(zhí)行的適當(dāng)操作。
在所示例子中,表達(dá)式956計算年齡,并且根據(jù)算出的年齡選擇樹節(jié)點954之一。如果算出的年齡具有已知值,則可根據(jù)該值選擇樹節(jié)點954a、954b或954c。如果算出的年齡是未知的,例如當(dāng)該值依賴于具有未知值的字段時,選擇樹節(jié)點954d。如果算出的年齡是已知的但是落在樹節(jié)點954a-954c中的case語句的范圍之外,則可選擇樹節(jié)點960。
在特定實施例中,服務(wù)器102可為決策樹規(guī)則950使用即時存儲器分配方案。在即時分配方案中,服務(wù)器102僅將決策樹規(guī)則950的一部分裝載到存儲器如存儲器126中。所裝載的規(guī)則950的該部分允許服務(wù)器102識別要遍歷的樹節(jié)點954。在服務(wù)器102識別要遍歷的樹節(jié)點954之后,服務(wù)器102將那個樹節(jié)點954的內(nèi)容裝載到存儲器中。如果所裝載的樹節(jié)點954包括附加子樹964,則服務(wù)器102僅裝載規(guī)則950的一部分,其中該部分允許服務(wù)器102選擇要遍歷的下一個子樹964。在選擇下一個子樹964之后,服務(wù)器102將那個子樹964的內(nèi)容裝載到存儲器中。該過程繼續(xù)直到服務(wù)器102觸發(fā)或舍棄規(guī)則950,此時,服務(wù)器102可釋放由規(guī)則950使用的存儲器。使用即時分配方案可減少由決策樹規(guī)則950使用的存儲器量。由于決策樹規(guī)則950可包含數(shù)百或數(shù)千個嵌入子樹,因此使用即時分配方案可幫助減少處理決策樹規(guī)則950的存儲器需求。
在一個實施例中,服務(wù)器102可被迫掛起決策樹規(guī)則950。例如,服務(wù)器102在推理期間可選擇樹節(jié)點954b,但是字段Fact3可能具有未知值。在本例中,由于服務(wù)器102不能完成規(guī)則950的執(zhí)行,因此服務(wù)器102將掛起規(guī)則950。在特定實施例中,服務(wù)器102執(zhí)行定點重新啟動(pinpoint restart),以使規(guī)則950解除掛起并完成其執(zhí)行。當(dāng)規(guī)則950掛起時,服務(wù)器102可獲得規(guī)則950的快照。該快照標(biāo)識規(guī)則950的上下文,如用于規(guī)則950中的字段的值,以及使規(guī)則950掛起的語句的精確位置。在上面例子中,該快照可標(biāo)識求值語句966的位置,因為其是使規(guī)則950掛起的語句。當(dāng)使規(guī)則950掛起的字段被賦予已知值時,服務(wù)器102可使規(guī)則950解除掛起,并且在存儲于快照中的位置開始執(zhí)行規(guī)則950。這可允許服務(wù)器102更高效地掛起可能包含大量子樹的決策樹規(guī)則950和使其解除掛起。
雖然圖9A和9B示出示例規(guī)則900、950,但是也可對規(guī)則900、950進(jìn)行各種改變。例如,規(guī)則900可包括任何數(shù)目的綁定變量910,并且規(guī)則950可包括任何數(shù)目的子樹。另外,還可使用其它或附加類型的規(guī)則。
圖10是示出根據(jù)本發(fā)明一個實施例的用于共享規(guī)則庫的示例存儲器布置的示例性方框圖。具體地說,圖10示出用于圖1的服務(wù)器102中的存儲器1026,其中多個客戶端應(yīng)用程序122在推理期間使用相同規(guī)則庫114。在本實施例中,存儲器1026包括規(guī)則庫114的只讀映像1050以及一個或多個客戶端特定信息塊1052。雖然圖10可關(guān)于圖1的系統(tǒng)100來描述,但是存儲器1026也可與其它系統(tǒng)一起使用。
只讀映像1050表示規(guī)則庫114中的規(guī)則116的副本。服務(wù)器102可通過將規(guī)則庫114從數(shù)據(jù)庫104或其它位置裝載到存儲器1026中來創(chuàng)建只讀映像1050。由于規(guī)則庫114可定義其自己的、由服務(wù)器102使用的數(shù)據(jù)對象,因此規(guī)則庫114可以不捆綁于任何特定應(yīng)用程序。結(jié)果,規(guī)則庫114可同時由多個客戶端應(yīng)用程序122使用。在特定實施例中,只讀映像1050包含規(guī)則庫114的副本,而不帶任何客戶端特定信息。
客戶端特定信息,如實際前置條件值和后置條件值,可存儲在客戶端特定信息塊1052中。客戶端特定信息塊1052包括客戶端特定信息1054和指針1056??蛻舳颂囟ㄐ畔?054表示前置條件值、后置條件值、掛起規(guī)則116的快照,以及特定于客戶端應(yīng)用程序122的任何其它信息。指針1056指向與客戶端特定信息1054相關(guān)聯(lián)的只讀映像1050。
在操作的一方面,當(dāng)客戶端應(yīng)用程序122請求使用規(guī)則庫114進(jìn)行推理時,服務(wù)器102可確定該規(guī)則庫114的只讀映像1050是否已經(jīng)存在于存儲器1026中。如果否,則服務(wù)器102可將規(guī)則庫114作為只讀映像1050裝載到存儲器1026中。然后,推理引擎112可使用只讀映像1050執(zhí)行推理操作。如果客戶端應(yīng)用程序122請求使用已經(jīng)作為只讀映像1050裝載到存儲器1026中的規(guī)則庫114進(jìn)行推理,則推理引擎112可使用先前創(chuàng)建的只讀映像1050執(zhí)行推理操作。在推理期間,要為特定客戶端應(yīng)用程序122存儲的任何值置于客戶端特定信息塊1052的客戶端特定信息1054中。這樣,即使當(dāng)推理涉及不同輸入值并且以不同次序執(zhí)行規(guī)則116時,服務(wù)器102也可使用相同規(guī)則庫114來執(zhí)行多個客戶端應(yīng)用程序122的推理操作。
在一個實施例中,可以限制如上所述存儲器1026的使用。例如,在特定實施例中,補(bǔ)充規(guī)則116、規(guī)則庫114和規(guī)則集130可以不在多個推理引擎實例之間共享。在本實施例中,補(bǔ)充規(guī)則116、規(guī)則庫114和規(guī)則集130的映像可以不由多個推理引擎實例使用。
雖然圖10示出為了在多個客戶端應(yīng)用程序122之間共享規(guī)則庫114而布置的存儲器1026的一個例子,但是也可對存儲器1026進(jìn)行各種改變。例如,每個客戶端特定信息塊1052可存儲在單獨存儲器結(jié)構(gòu)中。另外,可以使用允許或不允許客戶端應(yīng)用程序122共享規(guī)則庫114的其它存儲器布置。
圖11A到11D是示出根據(jù)本發(fā)明一個實施例的合并到統(tǒng)一規(guī)則庫中的示例規(guī)則庫組件的示例性方框圖。具體地說,圖11A到11C表示規(guī)則庫組件1150a-1150c,而圖11D表示統(tǒng)一規(guī)則庫組件1150d。雖然圖11A到11D可關(guān)于圖1的系統(tǒng)100來描述,但是規(guī)則庫組件1150也可與其它系統(tǒng)一起使用。
在圖11A中,組件1150a表示規(guī)則1152。規(guī)則1152包含在形成域1156的一部分的規(guī)則集1154中。規(guī)則1152引用名稱為Father(父親)和Mother(母親)的Person類的兩個實例1158。
在圖11B中,組件1150b表示包含在域1156中的Person類1160的部分聲明。類1160包括稱作Name(姓名)的字段1162的聲明。組件1150b還包括Father實例1158a的聲明。
在圖11C中,組件1150c表示包含在域1156中的Person類1160的另一部分聲明。類1160還包括稱作Age(年齡)的字段1164的聲明。組件1150c還包括Mother實例1158b的聲明。
規(guī)則庫構(gòu)建器110可通過在多個階段中執(zhí)行活動來合并組件1150a-1150c。在一個實施例中,在第一階段期間,規(guī)則庫構(gòu)建器110檢查組件1150a-1150c,以收集定義數(shù)據(jù)對象和邏輯對象的類。在該階段期間,規(guī)則庫構(gòu)建器110可創(chuàng)建一個或多個內(nèi)部數(shù)據(jù)結(jié)構(gòu),其標(biāo)識由組件1150定義的所有類。在第二階段,規(guī)則庫構(gòu)建器110解析來自階段一的內(nèi)部數(shù)據(jù)結(jié)構(gòu),以幫助確保類聲明之間的完全性和一致性。例如,如果類定義在名稱為Brother(兄弟)的實例上操作的規(guī)則,則規(guī)則庫構(gòu)建器110可確保名稱為Brother的實例由組件1150創(chuàng)建。在第三階段期間,規(guī)則庫構(gòu)建器110可編譯所解析的數(shù)據(jù)結(jié)構(gòu),以產(chǎn)生二進(jìn)制規(guī)則庫114。
在第一階段期間,由規(guī)則庫構(gòu)建器110檢查的組件1150均可定義類的一部分。在所示例子中,組件1150b和1150c定義Person類1160的不同部分。結(jié)果,在合并過程的第一階段期間,規(guī)則庫構(gòu)建器110記錄當(dāng)分析每個組件1150時遇到的類聲明。如果兩個組件1150定義單個類的多個部分,則規(guī)則庫構(gòu)建器110將這些聲明組合成單個類聲明。這可在圖11D中看出,其中圖11D示出規(guī)則庫1150d中的Person類1160的完全聲明。
假定規(guī)則庫構(gòu)建器110檢查組件1150b然后是組件1150c,規(guī)則庫構(gòu)建器110將訪問組件1150b,并且確定組件1150b包含類1160的聲明。規(guī)則庫構(gòu)建器110將檢查包含所有先前遇到的聲明的內(nèi)部數(shù)據(jù)結(jié)構(gòu),確定類1160尚未由先前檢查的組件1150聲明,并且將類1160和字段1162添加到內(nèi)部數(shù)據(jù)結(jié)構(gòu)。規(guī)則庫構(gòu)建器110將繼續(xù)至組件1150c,并且定位類1160的另一個聲明。規(guī)則庫構(gòu)建器110可檢查其內(nèi)部數(shù)據(jù)結(jié)構(gòu),確定類1160已在先前檢查的組件1150中聲明,并且將字段1164添加到數(shù)據(jù)結(jié)構(gòu)中的類1160。這將產(chǎn)生圖11D所示的類1160的全面聲明,其包括具有字段1162、1164的類1160的單個聲明。以類似方式,規(guī)則庫構(gòu)建器110可定位在組件1150中遇到的實例1158的每個聲明,并且形成如圖11D所示的單個聲明。
如上面關(guān)于圖4所述,規(guī)則庫114可在規(guī)則庫114的多個級別(規(guī)則庫級、域級、或規(guī)則集級)定義類。另外,具有相同名稱的類可存在于規(guī)則庫4中的不同級別。因此,在合并過程的階段一期間創(chuàng)建的內(nèi)部數(shù)據(jù)結(jié)構(gòu)指定類的范圍。例如,在圖11D中,類1160被示出為存在于域1156中。如果在規(guī)則集1154中聲明了另一個Person類,則結(jié)果規(guī)則庫1150將包含作為規(guī)則集1154的一部分出現(xiàn)的另一個類定義。如果在規(guī)則庫級別還聲明了另一個Person類,則結(jié)果規(guī)則庫1150d將在域1156的外部包含作為規(guī)則庫1150d的一部分出現(xiàn)的另一個類定義。
在第一階段期間,規(guī)則庫構(gòu)建器110可檢測包括相同字段的類聲明。在一些情況下,這些聲明可能相互匹配,例如當(dāng)多個組件1150聲明Person類1160包括Name字段1162時。在其它情況下,這些聲明可能相互沖突,并且規(guī)則庫構(gòu)建器110可能不能解決該沖突。例如,組件1150c可作為數(shù)字定義Age字段1164,而另一個組件1150作為字符串定義Age字段1164。這些聲明相互沖突,并且規(guī)則庫構(gòu)建器110可產(chǎn)生錯誤消息。在其它情況下,這些聲明可能相互沖突,但是可由規(guī)則庫構(gòu)建器110解決。作為例子,組件1150c可作為數(shù)字定義Age字段1164,而另一個組件1150作為限定于0與120之間的值的數(shù)字來定義Age字段1164。規(guī)則庫構(gòu)建器110可通過使用更受限的聲明來解決該沖突,在本例中,更受限的聲明將是帶約束的聲明。
在一個實施例中,當(dāng)在合并過程的第一階段期間訪問組件1150時,規(guī)則庫構(gòu)建器110使用不定次序。結(jié)果,規(guī)則庫構(gòu)建器110可以在定義類1160的結(jié)構(gòu)之前,處理使用該類1160的實例1158的規(guī)則1152。在特定實施例中,由規(guī)則庫構(gòu)建器110使用的內(nèi)部數(shù)據(jù)結(jié)構(gòu)幫助在規(guī)則庫合并過程期間減少或消除前向聲明的使用。
在創(chuàng)建統(tǒng)一規(guī)則庫1150d之后,規(guī)則庫構(gòu)建器110解析規(guī)則庫1150d。例如,規(guī)則庫構(gòu)建器110分析規(guī)則1152,以確定Father和Mother是否是已經(jīng)聲明的實例。規(guī)則庫構(gòu)建器110還確定與Father和Mother實例相關(guān)聯(lián)的類是否包括Age字段。規(guī)則庫構(gòu)建器110還確定與Age字段相關(guān)聯(lián)的數(shù)據(jù)類型是否適于在規(guī)則1152中執(zhí)行的操作。在本例中,將Age的值與65的值相比較,從而規(guī)則庫構(gòu)建器110確定Age是否已被聲明為數(shù)字?jǐn)?shù)據(jù)類型。另外,規(guī)則庫構(gòu)建器110檢查合并結(jié)果,并且確定所聲明的每個方法是否具有關(guān)聯(lián)實現(xiàn)。在本例中,方法可聲明于一個規(guī)則庫組件1150中,并且該組件1150的開發(fā)者假定另一個組件1150的開發(fā)者可提供方法實現(xiàn)。如果沒有開發(fā)者定義要如何實現(xiàn)該方法,則規(guī)則庫構(gòu)建器110可產(chǎn)生錯誤消息。規(guī)則庫構(gòu)建器110可采取其它或附加步驟以解析統(tǒng)一規(guī)則庫1150d。
在第三階段期間,規(guī)則庫構(gòu)建器110編譯經(jīng)過解析的規(guī)則庫1150d。在一個實施例中,規(guī)則庫1150d采用禁止表達(dá)式具有任何副作用(side effect)的格式來定義。“副作用”發(fā)生于當(dāng)推理引擎112正在對表達(dá)式進(jìn)行求值時字段值發(fā)生改變的時候。例如,在圖9B中,推理引擎112通過調(diào)用稱作“GetAge”的函數(shù)來對表達(dá)式956進(jìn)行求值。在本實施例中,推理引擎112不允許在執(zhí)行“GetAge”函數(shù)時修改任何字段的值。為了幫助減少或消除規(guī)則庫1150d中的副作用的存在,規(guī)則庫構(gòu)建器110識別方法是否返回值。如果方法返回值,則該方法不可包括任何改變字段值的步驟(用于該方法中的局部變量除外)。另外,返回值的方法不可調(diào)用改變字段值的第二方法(用于第二方法中的局部變量除外)。在另一個實施例中,規(guī)則庫構(gòu)建器110可允許規(guī)則庫中的表達(dá)式具有副作用。
在規(guī)則庫構(gòu)建過程期間,規(guī)則庫構(gòu)建器110還可產(chǎn)生與最后定值字段相關(guān)聯(lián)的表。如上所述,首次定值字段是應(yīng)當(dāng)僅被賦值一次的字段,而最后定值字段是可隨著時間被賦予多個值的字段。在推理期間,最后定值字段的有用值典型地是未知的,直到觸發(fā)或舍棄了可改變最后定值字段值的所有規(guī)則為止。在規(guī)則庫構(gòu)建過程期間,規(guī)則庫構(gòu)建器110可為最后定值字段生成一個表。該表可標(biāo)識可能改變最后定值字段值的規(guī)則以及使用最后定值字段的最終值的規(guī)則。這樣,推理引擎112可使用該表來觸發(fā)或舍棄可能改變最后定值字段值的所有規(guī)則。一旦所有這些規(guī)則都被執(zhí)行,則推理引擎112可觸發(fā)或舍棄使用最后定值字段的最終值的規(guī)則。在特定實施例中,決策樹規(guī)則可使用最后定值字段,而模式匹配規(guī)則不能。在本實施例中,在規(guī)則庫構(gòu)建期間構(gòu)造的表將僅標(biāo)識與最后定值字段相關(guān)聯(lián)的決策樹規(guī)則。
圖12是示出根據(jù)本發(fā)明一個實施例的用于提供推理服務(wù)的示例方法1200的示例性流程圖。雖然方法1200可關(guān)于圖1的系統(tǒng)100來描述,但是也可使用其它系統(tǒng)。
服務(wù)器102在步驟1202接收識別一條或多條規(guī)則116的信息。例如,這可包括API 120接收具有一個或多個域131的二進(jìn)制規(guī)則庫114以及API 120接收域131選擇。這還可包括API 120接收二進(jìn)制規(guī)則庫114的位置。該信息可來自任何適合源,例如試圖調(diào)用推理引擎112的推理服務(wù)的客戶端應(yīng)用程序122。
服務(wù)器102在步驟1204識別與所標(biāo)識的規(guī)則116相關(guān)聯(lián)的任何前置條件和任何后置條件。例如,這可包括推理引擎112使用包含在域131中的信息來識別與該域131相關(guān)聯(lián)的任何前置條件和后置條件。
服務(wù)器102在步驟1206接收所識別前置條件的值。例如,這可包括API120從調(diào)用推理引擎112的客戶端應(yīng)用程序122接收前置條件的值。推理引擎112可以逐個地從客戶端應(yīng)用程序122、作為XML文檔中的組、通過初始化處理程序、或者采用其它適合方式接收前置條件值。
服務(wù)器102在步驟1208使用前置條件值來執(zhí)行規(guī)則116。例如,這可包括推理引擎112觸發(fā)、舍棄和掛起各規(guī)則116以試圖將后置條件字段從未知狀態(tài)求解為已知狀態(tài)。這還可包括在字段值發(fā)生改變之后,推理引擎112重新訪問掛起規(guī)則116,以確定該改變是否允許推理引擎112觸發(fā)或舍棄任何掛起規(guī)則116。這還可包括推理引擎112執(zhí)行規(guī)則116的前向鏈接或后向鏈接。
服務(wù)器102在步驟1210返回任何后置條件的值。例如,這可包括推理引擎112將所識別后置條件的值傳送到客戶端應(yīng)用程序122。推理引擎112可以逐個地向客戶端應(yīng)用程序122、作為XML文檔中的組、通過改變處理程序、或者采用其它適合方式傳送后置條件值。推理引擎112可以成功地確定所有后置條件、一些后置條件的值,或者沒有確定任何后置條件的值。
雖然圖12示出用于提供推理服務(wù)的方法1200的一個例子,但是可以對方法1200進(jìn)行各種改變。例如,推理引擎112可以在接收實際規(guī)則116之前接收任何前置條件和后置條件的值。另外,推理引擎112可以在推理期間產(chǎn)生附加信息,如規(guī)則快照。另外,圖12中的一些步驟可重疊。作為例子,推理引擎112可使用改變處理程序?qū)⒑笾脳l件值傳送給客戶端應(yīng)用程序122。在這種情況下,可以在推理完成之前將后置條件值發(fā)送到客戶端應(yīng)用程序122。
圖13是示出根據(jù)本發(fā)明一個實施例的用于規(guī)則庫構(gòu)建的示例方法1300的示例性流程圖。雖然方法1300可關(guān)于圖1的系統(tǒng)100來描述,但是也可使用其它系統(tǒng)。
服務(wù)器102在步驟1302接收標(biāo)識一個或多個規(guī)則庫組件的信息。例如,這可包括規(guī)則庫構(gòu)建器110接收源或二進(jìn)制規(guī)則116、規(guī)則集130或規(guī)則庫114。這還可包括規(guī)則庫構(gòu)建器110接收源或二進(jìn)制規(guī)則116、規(guī)則集130或規(guī)則庫114的位置。該信息可來自任何適合源,例如試圖調(diào)用規(guī)則庫構(gòu)建器110的規(guī)則庫構(gòu)建服務(wù)的客戶端應(yīng)用程序122。
服務(wù)器102在步驟1304確定所接收的規(guī)則庫組件是否具有適當(dāng)?shù)母袷健@?,這可包括服務(wù)器102確定所接收的規(guī)則庫組件是否包含在XML文檔中。這還可包括服務(wù)器102確定所接收的規(guī)則庫組件是否遵循采用規(guī)則定義語言定義的格式。如果否,則服務(wù)器102在步驟1306將所接收的規(guī)則庫組件轉(zhuǎn)換且重新格式化成適當(dāng)?shù)母袷?。例如,這可包括服務(wù)器102將規(guī)則庫組件轉(zhuǎn)換成XML文檔,并且重新格式化規(guī)則庫組件以使其遵循規(guī)則定義語言。
服務(wù)器102在步驟1308將規(guī)則庫組件合并到統(tǒng)一規(guī)則庫114中。例如,這可包括服務(wù)器102識別規(guī)則庫組件中的類或其它數(shù)據(jù)對象的聲明。這還可包括服務(wù)器102在內(nèi)部數(shù)據(jù)結(jié)構(gòu)中查找,以確定先前檢查的規(guī)則庫組件是否包括相同類或其它數(shù)據(jù)對象的另一個聲明。如果否,則服務(wù)器102將聲明添加到內(nèi)部數(shù)據(jù)結(jié)構(gòu)。否則,服務(wù)器102將來自當(dāng)前聲明的元素插入到包含在內(nèi)部數(shù)據(jù)結(jié)構(gòu)內(nèi)的先前聲明中。當(dāng)服務(wù)器102完成生成內(nèi)部數(shù)據(jù)結(jié)構(gòu)時,服務(wù)器102可生成包含內(nèi)部數(shù)據(jù)結(jié)構(gòu)中的元素的統(tǒng)一規(guī)則庫114。
服務(wù)器102在步驟1310編譯統(tǒng)一規(guī)則庫114。例如,這可包括服務(wù)器102將統(tǒng)一規(guī)則庫114解析成各個結(jié)構(gòu),每個結(jié)構(gòu)對應(yīng)于采用規(guī)則定義語言定義的XML元素。這還可包括服務(wù)器102識別結(jié)構(gòu)的各元素之間的鏈接、以創(chuàng)建結(jié)構(gòu)之間的互連。這還可包括服務(wù)器102創(chuàng)建統(tǒng)一規(guī)則庫114的二進(jìn)制版本。
雖然圖13示出用于規(guī)則庫構(gòu)建的方法1300的一個例子,但是也可對方法1300進(jìn)行各種改變。例如,規(guī)則庫構(gòu)建器110只能接收具有適當(dāng)格式的規(guī)則庫組件,并且規(guī)則庫構(gòu)建器110無需轉(zhuǎn)換規(guī)則庫組件。另外,規(guī)則庫構(gòu)建器110可產(chǎn)生附加信息,如裝載圖和應(yīng)用程序接口文檔。
圖14是示出根據(jù)本發(fā)明一個實施例的用于合并規(guī)則庫組件的示例方法1400的示例性流程圖。雖然方法1400可關(guān)于圖1的系統(tǒng)100來描述,但是也可使用其它系統(tǒng)。
服務(wù)器102在步驟1402選擇規(guī)則庫組件。例如,這可包括規(guī)則庫構(gòu)建器110選擇由客戶端應(yīng)用程序122提供的一個或多個規(guī)則庫組件1150之一。服務(wù)器102在步驟1404將所選規(guī)則庫組件解析成一個或多個規(guī)則庫元素。例如,這可包括規(guī)則庫構(gòu)建器110將規(guī)則庫組件1150分成各個聲明,如類聲明。
服務(wù)器102在步驟1406選擇規(guī)則庫元素。例如,這可包括規(guī)則庫構(gòu)建器110選擇在所選規(guī)則庫組件1150中首先出現(xiàn)的規(guī)則庫元素。服務(wù)器102在步驟1408創(chuàng)建對應(yīng)于所選規(guī)則庫元素的標(biāo)準(zhǔn)元素。例如,這可包括規(guī)則庫構(gòu)建器110創(chuàng)建對應(yīng)于規(guī)則庫元素,如XML規(guī)則庫元素的內(nèi)部對象。
在服務(wù)器102創(chuàng)建對應(yīng)標(biāo)準(zhǔn)元素之后,服務(wù)器102在步驟1410確定先前遇到的標(biāo)準(zhǔn)元素是否具有相同名稱且處于相同規(guī)則庫級別。例如,這可包括規(guī)則庫構(gòu)建器110分析包含先前遇到的標(biāo)準(zhǔn)元素的內(nèi)部數(shù)據(jù)結(jié)構(gòu)。這還可包括規(guī)則庫構(gòu)建器110確定先前遇到的標(biāo)準(zhǔn)元素是否具有相同名稱,處于相同分級規(guī)則庫級別,并且表示與所選標(biāo)準(zhǔn)元素具有相同類型的元素。如果這些條件中的任一個不為真,則服務(wù)器102在步驟1418將所選標(biāo)準(zhǔn)元素插入到內(nèi)部數(shù)據(jù)結(jié)構(gòu)中。例如,這可包括規(guī)則庫構(gòu)建器110根據(jù)標(biāo)準(zhǔn)元素所處的分級級別而將標(biāo)準(zhǔn)元素插入到內(nèi)部數(shù)據(jù)結(jié)構(gòu)的適當(dāng)位置中。
如果在步驟1410滿足所有三個條件,則兩個單獨的標(biāo)準(zhǔn)元素在相同規(guī)則庫級別定義相同的規(guī)則庫結(jié)構(gòu)。服務(wù)器102在步驟1412確定兩個標(biāo)準(zhǔn)元素的僅一個是否定義規(guī)則庫邏輯。規(guī)則庫邏輯可包括用來確定是否滿足約束的表達(dá)式的定義,所聲明方法的實現(xiàn)以及規(guī)則的實現(xiàn)。如果多于一個標(biāo)準(zhǔn)元素定義相同規(guī)則庫結(jié)構(gòu)的規(guī)則庫邏輯,則服務(wù)器102在步驟1414產(chǎn)生錯誤。例如,這可包括規(guī)則庫構(gòu)建器110產(chǎn)生由消息處理程序捕獲且傳送到客戶端應(yīng)用程序122的錯誤消息。如果標(biāo)準(zhǔn)元素的僅一個定義相同規(guī)則庫結(jié)構(gòu)的規(guī)則庫邏輯,則服務(wù)器102在步驟1416合并標(biāo)準(zhǔn)元素。例如,這可包括規(guī)則庫構(gòu)建器110將來自選定標(biāo)準(zhǔn)元素的部分插入到包含在內(nèi)部數(shù)據(jù)結(jié)構(gòu)內(nèi)的標(biāo)準(zhǔn)元素中。
服務(wù)器102在步驟1420確定是否還有選定規(guī)則庫組件的另外規(guī)則庫元素有待處理。如果仍然存在另外的規(guī)則庫元素,則服務(wù)器102返回到步驟1406,并且選擇另一個規(guī)則庫元素。否則,服務(wù)器102在步驟1422確定是否還有另外的規(guī)則庫組件有待處理。如果存在另外的規(guī)則庫組件,則服務(wù)器102返回到步驟1402,并且選擇另一個規(guī)則庫組件。
在處理了規(guī)則庫組件之后,由服務(wù)器102創(chuàng)建的內(nèi)部數(shù)據(jù)結(jié)構(gòu)包含對應(yīng)于這些規(guī)則庫組件的各元素的標(biāo)準(zhǔn)元素。然后,服務(wù)器102可使用內(nèi)部數(shù)據(jù)結(jié)構(gòu)采取任何其它適合操作。例如,服務(wù)器102可在語義上分析對應(yīng)于邏輯的內(nèi)部數(shù)據(jù)結(jié)構(gòu),并且產(chǎn)生該邏輯的二進(jìn)制指令。
雖然圖14示出用于合并規(guī)則庫組件的方法1400的一個例子,但是也可對方法1400進(jìn)行各種改變。例如,規(guī)則庫構(gòu)建器110可一次接收一個規(guī)則庫組件,從而規(guī)則庫構(gòu)建器110無需在步驟1402選擇規(guī)則庫組件。另外,規(guī)則庫構(gòu)建器110可以在將任何標(biāo)準(zhǔn)元素插入到內(nèi)部數(shù)據(jù)結(jié)構(gòu)中之前創(chuàng)建所有規(guī)則庫組件的標(biāo)準(zhǔn)元素。另外,雖然規(guī)則庫構(gòu)建器110被描述為處理單個內(nèi)部數(shù)據(jù)結(jié)構(gòu),但是也可以使用其它類型或數(shù)目的數(shù)據(jù)結(jié)構(gòu)。此外,規(guī)則庫構(gòu)建器110可直接比較規(guī)則庫XML元素與預(yù)先存在的標(biāo)準(zhǔn)元素,從而避免創(chuàng)建冗余的標(biāo)準(zhǔn)元素。
規(guī)則定義語言(RDL)在一個實施例中,規(guī)則庫使用規(guī)則定義語言來定義。規(guī)則定義語言定義形成規(guī)則庫的一個或多個XML文檔的結(jié)構(gòu)和內(nèi)容。具體地說,規(guī)則定義語言支持對象定義,如類、字段、方法和靜態(tài)實例的定義,以及組織成域的約束和規(guī)則的定義。
雖然下面可以參照圖1的系統(tǒng)100來描述規(guī)則定義語言,但是其它系統(tǒng)也可使用規(guī)則定義語言。另外,系統(tǒng)可以使用其它語言來定義規(guī)則庫。
1.概述一般而言,規(guī)則定義語言允許用戶指定規(guī)則庫114中的哪些對象,如類、實例、字段、域和規(guī)則集可作為公共對象與客戶端應(yīng)用程序122共享。缺省地,在規(guī)則庫114中指定的其它對象可為該規(guī)則庫114私有。對于共享字段,用戶可指定每個字段是作為前置條件還是作為后置條件可被訪問。
規(guī)則定義語言支持兩種規(guī)則116,即模式匹配規(guī)則和決策樹規(guī)則。在前向鏈接期間使用這兩種規(guī)則,而在后向鏈接期間使用決策樹規(guī)則。
規(guī)則定義語言支持多種不同數(shù)據(jù)類型,包括Number(數(shù)字)、Boolean(布爾型)、String(字符串)、Association instance(關(guān)聯(lián)實例)、Set(集合)和InstanceReference(實例引用)。Number表示不區(qū)分整數(shù)和浮點值的通用數(shù)值數(shù)據(jù)類型。這些值可具有任意大小,并且Number的精度可使用精度標(biāo)志來指定。值也可根據(jù)具體需要而舍入到最近相鄰值。在一個實施例中,如果兩個相鄰值等距,則推理引擎112可總是舍入到最近偶數(shù)鄰近值或最近奇數(shù)鄰近值。Boolean表示TRUE(真)或FALSE(假)值。String表示Unicode字符序列,并且不區(qū)分大小寫。
關(guān)聯(lián)實例定義規(guī)則庫實例之間的關(guān)系。例如,Person實例可以是另一個Person實例的配偶,或者Person實例可擁有Duck實例。規(guī)則定義語言可支持任何適合類型的關(guān)聯(lián),例如一對一、一對多、多對一以及多對多關(guān)聯(lián)。作為特定例子,規(guī)則定義語言可支持Ownership(Owns和IsOwnedBy)關(guān)聯(lián)、Managership(管理關(guān)系)(Manages(管理)和IsManagedBy(被管理))關(guān)聯(lián)、Spousalship(配偶關(guān)系)(IsSpouse Of(是...的配偶))關(guān)聯(lián)以及Siblingship(同胞關(guān)系)(IsSibling Of(是...的同胞))關(guān)聯(lián)。例如,Duck實例的字段可定義與Person實例的IsOwnedBy關(guān)聯(lián),從而表示Duck由所標(biāo)識的Person擁有。
一個實例中的實例引用表示對另一個實例的引用。例如,Duck類可定義對Person的實例引用,從而標(biāo)識擁有給定Duck實例的Person實例。在本例中,實例引用擔(dān)當(dāng)指向其它實例的指針。如同其它數(shù)據(jù)類型一樣,實例引用可以處于已知或未知狀態(tài)。如果處于已知狀態(tài),則實例引用值可引用實例,或者為空??罩悼梢詤^(qū)別于未知值,因為未知值表示未知關(guān)系,而空值表示已知的不存在關(guān)系。
集合表示唯一元素的無序集合。這些元素可以為上述數(shù)據(jù)類型中的任一種。在特定實施例中,所有元素都應(yīng)為相同數(shù)據(jù)類型。規(guī)則定義語言可以或不可以支持集合的集合。規(guī)則定義語言還可支持其它數(shù)據(jù)類型,例如列表、日期和時間。
規(guī)則定義語言可將要由推理引擎112作出的決策分類成規(guī)則前提或約束表達(dá)式。這有助于將決策作出限于更小、更好限定的上下文。這還有助于鼓勵開發(fā)者創(chuàng)建規(guī)則庫114或規(guī)則庫114的一部分以編寫更干凈、更原子的規(guī)則。這還可減少或消除在規(guī)則庫114中使用IF-THEN(如果-則)規(guī)則。規(guī)則定義語言還可禁止表達(dá)式具有任何副作用。
規(guī)則定義語言還可限制指針和動態(tài)分配對象的使用。例如,規(guī)則定義語言可將指針的使用限制于關(guān)聯(lián)實例中的字段和用于模式匹配規(guī)則中的綁定變量中的字段。這有助于在推理開始和使用指針之前幫助分析規(guī)則庫114中的規(guī)則116。在特定實施例中,規(guī)則庫114的分析可發(fā)生于規(guī)則庫構(gòu)建器110正在構(gòu)建規(guī)則庫114時,而不是在推理開始之前由推理引擎112進(jìn)行。在另一個實施例中,指針的使用可以不受到限制,或者可以采用其它方式進(jìn)行限制。
另外,為了允許第三方廠商向規(guī)則庫114增加功能性和附加信息,第三方廠商可以向他們在規(guī)則庫114中定義和使用的元素和字段添加前綴。在某些實施例中,前綴可以是XML命名空間前綴。推理引擎112可處理采用規(guī)則定義語言定義的任何元素和字段,并且忽略任何其它元素和字段,如具有前綴的元素和字段。
規(guī)則定義語言的下面描述假定規(guī)則庫114包括一個或多個XML文檔。在下面描述中,XML文檔的內(nèi)容使用巴克斯-諾爾形式(Backus-Naur Form,BNF)表示法來描述,并且規(guī)則庫邏輯的例子使用中綴表示法。這僅是為了示例說明的目的。也可使用用來描述XML文檔內(nèi)容和例子的其它表示法。另外,在其它實施例中,規(guī)則庫114可包括其它類型的信息并且不限于XML文檔。
2.元素屬性規(guī)則定義語言支持以下屬性<pre listing-type="program-listing"><![CDATA[AbortMsg_Attrib ::=abort_msg=″<StringVal>″//無缺省值 AppShared_Attrib::=appshared=″true″ ::=appshared=″false″ //缺省值 CaseSensitivity_Attrib ::=case_snes=″true″ ::=case_snes=″fasle″ //缺省值 Collection Attrib ::=coll_type=″set″ ::=coll_type=″none″//缺省值 DataType_Attrib//無缺省值 ::=type=″number″ ::=type=″boolean″ ::=type=″string″ ::=type=″inst_ref″ Enabled_Attrib ::=enabled=″true″ //缺省值 ::=enabled=″false″ Intrinsic_Attrib ::=intrinsic=″true″ ::=intrinsic=″false″ //缺省值 LocTag_Attrib ::=loc_tag=″<String Val>″ //無缺省值 Name_Attrib ::=name=″<Identifier>″ //無缺省值 ParamIOType_Attrib ::=iotype=″in″ //缺省值 ::=iotype=″out″ PMOptions_Attrib ::=options=″<Options>″ //缺省值(least-recent(最不近),多次觸發(fā)) Post_Attrib ::=post_type=″conditional″ ::=post_type=″unconditional″ //缺省值Precision_Attrib ::=precision=″<IntegerVal>″//缺省值“0” Priority_Attrib ::=priority=″<IntegerVal>″ //缺省值“0” Resolution_Attrib ::=res_type=″first_valued″ //缺省值 ::=res_type=″final_valued″ ResumeVal_Attrib ::=resume_val=″<Value>″//無缺省值 Value_Attrib ::=value=″<Value>″ //無缺省值]]></pre>后面的章節(jié)引用這些屬性。在很多情況下,該列表定義屬性可具有的實際值,如TRUE或FALSE。在其它情況下,該列表反映符號值,在這種情況下,符號值加有尖括號(<>),并且下面將對其進(jìn)行更全面的說明。
3.根元素該元素是XML文檔的根元素,并且定義規(guī)則庫114的總體結(jié)構(gòu)。它具有以下格式<pre listing-type="program-listing"><![CDATA[Rulebase_Element ::=(′rulebase′RB_Attribs+) RB_Section* Rulebase_Attribs ::=Name_Attrib//必需 ::=LocTag_Attrib //可選 Rulebase_Section ::=InitMethodDef_Element ::=Assoc_Element ::=ConstraintSet_Element ::=ExternalLib_Element ::=Class_Element ::=Domain_Element]]></pre>Name_Attrib(名稱屬性)指定規(guī)則庫114的名稱,如字母數(shù)字字符串。推理引擎112可在錯誤和跟蹤消息中使用該名稱。Rulebase(規(guī)則庫)_Section(部分)包括零個或更多子元素,并且這些子元素定義規(guī)則庫114內(nèi)暴露于全局范圍的對象。例如,InitMethodDef_Element定義規(guī)則庫級初始化方法,Assoc_Element定義規(guī)則庫級類之間的規(guī)則庫級關(guān)系,并且ConstraintSet_Element定義用于約束對規(guī)則庫級字段的賦值的規(guī)則庫級方法集合。ExternalLib_Element定義可從規(guī)則庫114調(diào)用的外部庫,并且Class(類)_Element(元素)定義字段、方法和靜態(tài)實例的規(guī)則庫級類。Domain(域)_Element定義規(guī)則庫級域資源。
所有這些子元素可以是可選的,因為如上文和下文更詳細(xì)所述,規(guī)則定義語言支持合并不完全規(guī)則庫的片斷,以形成完全規(guī)則庫114。另外,如下所述,每個子元素可指定Name_Attrib(屬性)。這些名稱在規(guī)則庫級別可以是唯一的,但是在更低級別可被覆蓋。如果規(guī)則庫114在給定級別定義具有相同名稱的對象,則規(guī)則庫構(gòu)建器110可以在合并過程期間將這些對象合并到單個規(guī)則庫對象中。
4.InitMethodDef_Element該元素定義用于初始化規(guī)則庫114中的對象的方法,并且具有以下格式InitMethodDef_Element::=(′init_method′InitMethodDef_Attribs+)[InitMethodBody_Element]InitMethodDef_Attribs::=Name_Attrib//必需::=LocTag_Attrib //可選InitMethodDef_Element定義初始化級別特定字段和外部庫的方法邏輯。
例如,該元素可初始化隨后由規(guī)則和約束引用的各個字段。當(dāng)首先裝載該級別的資源時,推理引擎112調(diào)用該方法。在一個實施例中,推理引擎112可調(diào)用該方法一次。當(dāng)在給定級別存在多個InitMethodDef_Element時,則推理引擎112可以任何適合次序調(diào)用這些元素。在該元素中定義的初始化方法可以不接受任何參數(shù),并且不返回任何值。這些方法可以自由地調(diào)用其它方法,并且訪問其范圍級別內(nèi)的任意和所有對象。在一個實施例中,這些方法可能不能啟動推理或者試圖讀取未知狀態(tài)下的字段。在本實施例中,當(dāng)檢測到任何這些操作時,推理引擎112可用錯誤消息立即中止推理。
該元素可在規(guī)則庫114中的若干不同級別指定。例如,它可以在規(guī)則庫級別、域級別和規(guī)則集級別指定。在給定級別,可以存在該元素的多個指定,但是每一個應(yīng)當(dāng)具有不同的名稱。另外,多個子規(guī)則庫可在相同規(guī)則庫級別貢獻(xiàn)InitMethodDef_Element。
在一個實施例中,字段初始化受支配于字段約束。該方法應(yīng)敏感于這些約束以及該約束所依賴的字段。例如,字段約束可依賴于字段MaximumAge(最大年齡),從而初始化方法應(yīng)幫助確保在根據(jù)該約束設(shè)置任何字段之前,該字段已被初始化。
樣例規(guī)則庫114可如下定義處于規(guī)則庫級別的InitMethodDef_Element<init_method_name=″RulebaseConstantsInitializer″>
<method_body>
<![CDATA[constants.max_age=120constant.adult_age=21constant.ValidSymptoms=set(″symptom1″,″symptom2″,″symptom3″)]]>
</method_body>
</init_method>
該方法初始化以后由規(guī)則和約束使用的各個常數(shù)字段。
5.Assoc_Element該元素定義字段之間的關(guān)系,并且具有以下格式<pre listing-type="program-listing"><![CDATA[Assoc_Element ::=(′assoc′ Assoc_Attribs+) FieldRef_Element //關(guān)聯(lián)角色1 FieldRef_Element //關(guān)聯(lián)角色2 Assoc_Attribs ::=Name_Attrib//關(guān)聯(lián)名稱-必需 ::=LocTag_Attrib //可選 FieldRef_Element ::=(′field_ref′FieldRef_Attribs+) IdentifierSpec //字段的類FieldRef_Attribs ::=Name_Attrib //字段名稱-必需 ::=LocTag_Attrib//可選]]></pre>該元素可以在規(guī)則庫114中的若干不同級別指定。例如,它可在規(guī)則庫級別、域級別和規(guī)則集級別指定。在一個實施例中,關(guān)聯(lián)具有反映其意義的名稱。例如,Ownership關(guān)聯(lián)可能定義人如何擁有鴨子,Managership關(guān)聯(lián)可能定義人如何管理其它人,并且Spousalship關(guān)聯(lián)可能定義人之間的配偶關(guān)系。
Assoc_Element指定其成員字段為FieldRef_Element。這些子元素的每一個指定字段名稱和擁有或繼承該字段的類。在其各自的類中,這些字段的每一個可以采用實例引用數(shù)據(jù)類型來聲明(參見下述DataTypeInstRef_Element)。該指定字段可以屬于相同類或不同類。例如,用戶可以定義Duck類的IsOwnedBy字段與Person類的Owns字段之間的關(guān)聯(lián)。作為另一個例子,用戶可以定義Person類的IsManagedBy字段與Person類的Manages字段之間的關(guān)聯(lián)。用戶還可為關(guān)聯(lián)角色指定相同的字段,例如Person類的IsSpouseOf字段用作兩個關(guān)聯(lián)角色。
在一個實施例中,關(guān)聯(lián)的多樣性(一對一、一對多、多對一、多對多)可根據(jù)指定字段是否是集合而變化。例如,如果Person類的Owns字段是集合,但是Duck類的IsOwnedby字段不是集合,則關(guān)聯(lián)是Person和Duck之間的一對多關(guān)系。
Assoc_Element元素可關(guān)聯(lián)對象的超類。例如,它可關(guān)聯(lián)Person和Bird(鳥),并且推理引擎112可以以多態(tài)方式(polymorphically)將該關(guān)系解釋為Person與任何種類的Bird(Duck、Vulture(禿鷹)等)之間的關(guān)系。
在特定實施例中,Assoc_Element指定其類處于與其本身相同的規(guī)則庫級別(全局、域、規(guī)則集)的字段。在本實施例中,域級關(guān)聯(lián)只可引用域級類的字段,而不可引用全局級類的字段。
樣例規(guī)則庫114可如下定義處于規(guī)則庫級別的兩個Assoc_Element<assoc name=″Ownership″>
<field_ref name=″Owns″>
<identifier name=″Person″/>
</field_ref>
<field_ref name=″IsOwnedBy″>
<identifier name=″Duck″/>
</field_ref>
</assoc>
<assoc name=″Siblingship″>
<field_ref name=″IsSiblingOf″>
<identifier name=″Person″/>
</field_ref>
<field_ref name=″IsSiblingOf″>
<identifier name=″Person″/>
</field_ref>
</assoc>
另外,規(guī)則庫114可定義關(guān)聯(lián)字段。這些字段對維護(hù)特定于關(guān)聯(lián)而非特定于關(guān)聯(lián)的各個成員的信息可能是又用的。例如,Spousalship關(guān)聯(lián)可能具有DateOfMarriage(結(jié)婚日期)字段。為了使用關(guān)聯(lián)字段,推理引擎112可維護(hù)關(guān)聯(lián)實例,并且其它實例可訪問這些關(guān)聯(lián)實例。例如,Person實例可能需要確定他/她的結(jié)婚日期。這可采用諸如以下的內(nèi)部方法來發(fā)生marriage_date=@getAssocValue(Father.spouse,spousalship.marriage_date)@setAssocValue(Father..spouse,Spousalship.marriage_date,20010708)其中第一自變量(argument)指定關(guān)聯(lián)所涉及的實例,而第二自變量表示相關(guān)關(guān)聯(lián)字段。
在另一個實施例中,關(guān)聯(lián)可視作將其字段“借”給參與實例。例如,Person類可根據(jù)Person是Spousalship關(guān)聯(lián)中的角色類的事實而繼承marriage_date(結(jié)婚日期)字段。在這種情況下,上面例子可能被記錄為marriage_date=Father.marriage_dateFather.marriage_date=20010708在這種方法下,關(guān)聯(lián)實例的字段名稱可以與Person類(及其祖先類)的字段名稱重疊。同樣地,Person類(及其祖先類)可能不能定義用作不同關(guān)聯(lián)實例的Spousalship角色的兩個字段。此外,如果Person用作多個不同關(guān)聯(lián)中的類角色,則關(guān)聯(lián)可能需要采用不同字段名稱??蛇x的特殊前綴可用于關(guān)聯(lián)字段,以避免這些問題中的一些,例如
marriage_date=Father.Spousalshipmarriage_dateFather.Spousalshipmarriage_date=200107086.ConstraintSet_Element該元素指定約束定義的集合,并且具有以下格式<pre listing-type="program-listing"><![CDATA[ConstraintSet_Element ::=(′ConstraintSet_Element′ConstraintSet_Attribs+) ConstraintSet_Element* ConstraintSet_Attribs ::=Name_Attrib //必需 ::=LocTag_Attrib//可選 Constraint_Element ::=(′Constraint′Constraint_Attribs+) GeneralExpr //Boolean表達(dá)式 Constraint_Attribs ::=Name_Attrib //必需 ::=LocTag_Attrib//可選]]></pre>ConstraintSet_Element指定用于限制如何可以賦值給字段的準(zhǔn)則。推理引擎112在賦值給目標(biāo)字段之前可以對約束進(jìn)行求值。這些約束可以通過字段聲明(使用FieldDcl_Element)或通過靜態(tài)實例字段修飾符(使用StaticInstDef_Element)與字段相關(guān)聯(lián)。每個約束的GeneralExpr可表示Boolean表達(dá)式。該表達(dá)式引用內(nèi)部標(biāo)識符(candidat_value(候選值))作為對字段建議新值的符號引用。當(dāng)對表達(dá)式進(jìn)行求值時,推理引擎112可用內(nèi)部標(biāo)識符替換任何符號引用。表達(dá)式值表示候選值是否滿足約束。如果表達(dá)式值為真,則推理引擎112可允許繼續(xù)賦值。否則,推理引擎112可根據(jù)字段聲明(或字段修飾符)指定來采取操作。
表達(dá)式可調(diào)用方法,并且訪問其范圍級別內(nèi)的任意對象。在一個實施例中,表達(dá)式不可試圖讀取處于未知狀態(tài)的字段或者產(chǎn)生任何副作用。在本實施例中,當(dāng)檢測到這些操作中的任一操作時,推理引擎112可用錯誤消息立即中止推理。
該元素可定義多個約束,并且這些約束的每一個可以在約束集合內(nèi)具有唯一名稱。該元素也可在規(guī)則庫114中的若干不同級別指定。例如,它可在規(guī)則庫級別、域級別和規(guī)則集級別指定。推理引擎112可以代表若干不同字段,如相同數(shù)據(jù)類型的字段,對相同約束進(jìn)行求值。
樣例規(guī)則庫114可如下定義處于規(guī)則庫級別的兩個ConstraintSet_Element<constraint_set name=″ThingConstraints″>
<constraint name=″CheckAgeConstraints″>
<![CDATA[@candidate_value>=0 and @candidate_value<=max_age]]>
</constraint>
</constraint_set>
<constraint_set name=″PersonConstraints″>
<constraint name=″CheckSympConstraints″>
<![CDATA[@candidate_value<=ValidSymptoms]]>
</constraint>
</constraint_set>
7.ExternalLib_Element該元素允許用戶采用由一個或多個“外部”庫,如采用Java或C++編碼的庫提供的功能性補(bǔ)充規(guī)則定義語言功能性。這些用戶然后可以隨同規(guī)則庫114一起發(fā)行外部庫。ExternalLib_Element向外部庫提供入口。從規(guī)則庫114的角度,外部庫可作為提供帶有輸入?yún)?shù)、輸出參數(shù)和返回值的方法的“黑盒”出現(xiàn)。規(guī)則庫114可以如同調(diào)用在規(guī)則庫114自身中定義的方法一樣調(diào)用外部庫中的方法。推理引擎112可以負(fù)責(zé)將調(diào)用映射到目標(biāo)環(huán)境。ExternalLib_Element的定義可以要求指定語言特定、平臺特定、或環(huán)境特定的設(shè)置。結(jié)果,推理引擎112可以或不可以需要包括一些目標(biāo)特定代碼。
8.Class_Element
該元素定義字段、方法和靜態(tài)實例的類。它具有以下格式<pre listing-type="program-listing"><![CDATA[Class_Element ::=(′class′Class_Attribs+) Class_Item* Class_Attribs ::=Name_Attrib //必需 ::=LocTag_Attrib//可選 Class_Item ::=Parent_Element ::=FieldDcl_Element ::=ClassMethodDef_Element ::=StaticInstDef_Element Parent_Element ::=(′parent′[LocTag_Attrib]) IdentifierSpec //父類]]></pre>該元素可在規(guī)則庫114中的若干不同級別指定。例如,它可在規(guī)則庫級別、域級別和規(guī)則集級別指定。一些或所有子元素可指定Name_Attrib。除了方法重載之外,這些名稱在類級別可以是唯一的,但是可以覆蓋處于更高級別的名稱并且在更低級別被覆蓋。另外,除了方法重載(overload)之外,如果類定義具有相同名稱的對象,則規(guī)則庫構(gòu)建器110可以在合并過程期間將這些對象合并成單個規(guī)則庫對象。Class_Element可以可選地指定父Class_Element,從而類可組織成繼承分級結(jié)構(gòu)。在一個實施例中,類可以具有最多一個父類。在特定實施例中,如果類具有父,則父類和子類處于相同規(guī)則集級別(全局、域、規(guī)則集)。在本實施例中,域級類將從另一個域級類派生,并且不能從全局級類派生。
在特定實施例中,字段和方法處于實例級別而非類級別,并且字段和方法處于公共而非私有或保護(hù)訪問級別。另外,在特定實施例中,葉子而非父類可被實例化。可以或可以不存在對類包含的支持。
樣例規(guī)則庫114可以定義處于規(guī)則庫級別的若干Class_Element,例如<class name=″Duck″>
<parent>
<identifier name=″Thing″/>
</parent>
<field name=″IsOwnedBy″>
<datatype coll_type=″none″type=″inst_ref″>
<identifier name=″Person″/>
</datatype>
</field>
</class>
8.1FieldDcl_ElementClass_Element的該元素定義類數(shù)據(jù)對象,并且具有以下格式<pre listing-type="program-listing"><![CDATA[FieldDcl_Element ::=(′field′FieldDcl_Attribs+) DataType_Element [ConstrainedBy_Element] FieldDcl_Attribs ::=Name_Attrib //必需 ::=ResolutionType_Attrib //可選 ::=LocTag_Attrib //可選 ConstrainedBy_Element ::=(′constrained_by′[LocTag_Attrib]) ConstrainerList_Element [ConstraintViolation_Element] ConstrainerList_Element ::=(′constrainer_list′[LocTag_Attrib]) IdentifierSpec* //適用的約束 ConstraintViolation_Element ::=(′constraint_violation′[LocTag_Attrib]) ConstraintViolation_Option ConstraintViolation_Option::=ConstraintAbort_Element ::=ConstraintResume_Element ConstraintAbort_Element ::=(′constraint_abort′ConstraintAbort_Attribs*) ConstraintAbort_Attribs ::=LocTag_Attrib //可選 ::=AbortMsg_Attrib//可選 ConstraintResume_Element ::=(′constraint_resume′ConstraintResume_Attribs*) ConstraintResume_Attribs ::=LocTag_Attrib //可選 ::=ResumeVal_Attrib //可選]]></pre>FieldDcl_Element可包括字段求解類型,其是可以可選地指定“求解類型”的字段。求解類型應(yīng)用于推理引擎112在處理決策樹規(guī)則時的行為,并且可被指定為“first_valued(首次定值)”(缺省值)或“final_valued(最后定值)”。該設(shè)置確定推理引擎112是否假定字段的首次值為其求解值,或者推理引擎112是否預(yù)期字段在得到其求解值的過程中可能被賦予中間值。例如,Age字段將典型地是“first_valued”字段,而SetOfResults(結(jié)果集合)字段可能是“final_valued”字段。
FieldDcl_Element還可以可選地指定字段值分配應(yīng)受到約束。在賦值給字段之前,推理引擎112可以以由ConstrainerList(約束列表)_Element指定的次序?qū)σ粋€或多個約束進(jìn)行求值。如果任何約束求值為Boolean FALSE值,則推理引擎112可以根據(jù)ConstraintViolation(約束違例)_Element執(zhí)行違例操作。如果ConstraintViolation_Element指定ConstraintAbort(約束中止)_Element,推理引擎112可以中止推理。如果那個元素指定AbortMsg_Attrib,則屬性值可以是錯誤消息文本。否則,錯誤消息可以反映缺省文本。如果ConstraintViolation_Element指定ConstraintResume(約束恢復(fù))_Element,則推理引擎112可以恢復(fù)推理。如果那個元素指定ResumeVal_Attrib,則推理引擎112可以用屬性值替代字段當(dāng)前值。否則,該字段可以保持其當(dāng)前值。如果沒有ConstraintViolation_Element,則推理引擎112可以缺省錯誤消息中止推理。在FieldDcl_Element級別指定的約束可應(yīng)用于字段類的所有實例。用戶還可以指定實例特定約束。
來自樣例規(guī)則庫114的樣例字段聲明可以是<field name=″Symptoms″>
<datatype coll_type=″set″type=″string″/>
<constrained_by>
<constrainer_list>
<identifier name=″CheckSympConstraints″/>
</constrainer_list>
<constraint_violation>
<constraint_abort abort_msg=″Invalid symptomsspecified″/>
</constraint_violation>
</constrained_by>
</field>
8.2 ClassMethodDef_Element該Class_Element元素定義類方法對象,并且具有以下格式<pre listing-type="program-listing"><![CDATA[ClassMethodDef_Element ::=(′method′ ClassMethodDef_Attribs+) [DataType_Element]//方法返回類型 [ClassMethodParams] [ClassMethodBody_Element] ClassMethodDef_Attribs ::=Name_Attrib //必需 ::=LocTag_Attrib //可選 ClassMethodParams ::=ClassParam_Element ::=ClassParamList_Element ClassParam_Element ::=(′param′ClassParamAttribs+) DataType_ElementClassParamAttribs ::=Name_Attrib //必需 ::=ParamIOType_Attrib //可選 ::=LocTag_Attrib//可選 ClassParamList_Element ::=(′method_params′[LocTag_Attrib]) ClassParam_Element* ClassMethodBody_Element ::=(′method_body′[LocTag_Attrib]) Statement*]]></pre>方法可以可選地接受任何數(shù)目的具有任何數(shù)據(jù)類型的變量,并且該方法可以將每個參數(shù)歸類為輸入(“in”)參數(shù)或輸出(“out”)參數(shù)。在一個實施例中,參數(shù)可以缺省地是輸入?yún)?shù)或輸出參數(shù)。在特定實施例中,參數(shù)不可既是輸入?yún)?shù)又是輸出參數(shù)。規(guī)則定義語言可以支持方法重載,從而類可以定義多個具有相同名稱的方法,只要其參數(shù)表是可區(qū)分的即可。該區(qū)分可以不考慮ClassParamAttribs(類參數(shù)屬性-如ParamIOType_Attrib)或數(shù)字精度。方法可以可選地返回一個或多個任何數(shù)據(jù)類型的值。如果方法返回值,則服務(wù)器102可以將其歸類為函數(shù)方法。否則,服務(wù)器102可以將其歸類為過程方法。服務(wù)器102對函數(shù)方法施加可以不對過程方法施加的限制。這是因為函數(shù)方法是表達(dá)式,并且表達(dá)式可以不具有任何負(fù)作用。因此,服務(wù)器102可以禁止函數(shù)方法支持輸出參數(shù)、賦值給字段、調(diào)用過程方法、或者創(chuàng)建或刪除動態(tài)實例。
如果沒有指定ClassMethodBody(類方法主體)_Element,則服務(wù)器102可以假定另一個規(guī)則庫114將要定義方法實現(xiàn),并且在推理之前該另一個規(guī)則庫114將與當(dāng)前規(guī)則庫114合并。
來自樣例規(guī)則庫114的樣例方法定義可以是<method name=″Has1stSymptomButNot2ndOne″>
<datatype coll_type=″none″type=″boolean″/>
<method_params>
<param name=″symp1″iotype=″in″>
<datatype coll_type=″none″type=″string/>
</param>
<param name=″symp2″iotype=″in″>
<datatype coll_type=″none″type=″string″/>
</param>
</method_params>
<method_body>
<![CDATA[return Symptoms.@Set_DoesIncludeVal(symp1)and not Symptoms.@set_DoesIncludeVal(symp2)]]>
</method_body>
</method>
8.3 StaticInstDef_ElementClass_Element的該元素定義類靜態(tài)實例對象,并且具有以下格式<pre listing-type="program-listing"><![CDATA[StaticInstDef_Element ::=(′instance′StaticInst_Attribs+) [FieldModifiers_Element] StaticInst_Attribs ::=Name_Attrib //必需 ::=LocTag_Attrib//可選 FieldModifiers_Element ::=(′field_modifiers′[LocTag_Attrib]) FieldModifier_Element* FieldModifier_Element ::=(′field_modifier′FieldModifier_Attribs+) [ConstrainedBy_Element] [LastChanceValue_Element] FieldModifier_Attribs ::=Name_Attrib //必需 ::=LocTag_Attrib//可選LastChanceValue_Element ::=(′lastchance_value′[LocTag_Attrib]) lastchancevalue lastchancevalue ::=LiteralConstant_Element ::=UnaryExpr//具有LiteralConstant_Element ::=SetConstant_Element ::=IdentifierSpec //實例名稱]]></pre>當(dāng)推理引擎112裝載實例類時,它可以創(chuàng)建靜態(tài)實例,并且當(dāng)它卸載實例類時,它可以刪除該實例。在一個實施例中,規(guī)則庫邏輯可能不能顯式創(chuàng)建或刪除靜態(tài)實例。該元素可以可選地指定FieldModifiers(字段修飾符)_Element,其指定實例特定字段特征,如最后機(jī)會值和約束。FieldModifiers_Element的Name_Attrib表示受影響的實例字段。該名稱可以標(biāo)識由實例類聲明或繼承的字段。
LastChanceValue(最后機(jī)會值)_Element指定字段的最后機(jī)會值。對于實例引用數(shù)據(jù)類型,最后機(jī)會值可以是另一個靜態(tài)實例或者一組這樣的實例的標(biāo)識符。對于另一種數(shù)據(jù)類型的字段,該值可以是字面常量、集合常量或者字面常量上的一元操作符。在后者情況下,字面常量可以是數(shù)字或布爾常量。推理引擎112可以在涉及決策樹規(guī)則的特定完善定義情形中應(yīng)用最后機(jī)會值,從而最后機(jī)會值的靜態(tài)實例定義本身不可保證推理引擎112將會應(yīng)用它們。
約束子元素指定字段賦值應(yīng)受到約束。有關(guān)約束的進(jìn)一步信息可以在上面FieldDcl_Element章節(jié)內(nèi)的ConstrainedBy_Element描述中找到。在StaticInstDef_Element級別指定的約束可以僅應(yīng)用于那個實例。例如,用戶可為Father.Age指定與Mother.Age不同的約束。用戶還可指定應(yīng)用于類的所有實例的類級約束。如果對于給定字段用戶指定了這兩個級別的約束,則推理引擎112可以在實例特定約束之前應(yīng)用類級約束。
來自示例規(guī)則庫114的樣例StaticInstDef_Element可以是<instance name=″CurrentPatient″>
<field_modifiers>
<field_modifier name=″age″>
<lastchance_value>
<literal_constant value=″55″/>
</lastchance_value>
</field_modifier>
</field_modifiers>
</instance>
9.Domain_Element該元素定義規(guī)則庫級域資源,并且具有以下格式<pre listing-type="program-listing"><![CDATA[Domain_Element ::=(′domain′Domain_Attribs+) Domain_Items* Domain_Attribs ::=Name_Attrib //必需 ::=AppShared_Attrib//可選 ::=LocTag_Attrib //可選 Domain_Items ::=DomainGoal_Element ::=DomainAppSharedFlds_Element ::=InitMethodDef_Element ::=Assoc_Element ::=ConstraintSet_Element ::=Class_Element ::=Ruleset_Element]]></pre>該元素可以可選地指定域可通過使用AppShared(應(yīng)用程序共享)_Attrib字段由客戶端應(yīng)用程序122裝載。否則,域可使用dmn_push()內(nèi)部方法從規(guī)則庫邏輯裝載。規(guī)則庫114可以與客戶端應(yīng)用程序122共享至少一個域,但是它可與客戶端應(yīng)用程序122共享多個域。
大多數(shù)子元素可以指定Name_Attrib。這些名稱在域級別可以是唯一的,但是可以覆蓋處于更高級別的名稱,并且在更低級別被覆蓋。如果域在給定級別定義具有相同名稱的對象,則規(guī)則庫構(gòu)建器110可以在合并過程期間將這些對象合并成單個規(guī)則庫對象。
若干域子元素,如InitMethodDef_Element、Assoc_Element、ConstraintSet_Element、以及Class_Element可以與先前描述的規(guī)則庫級子元素相同。其它子元素,如DomainGoal(域目標(biāo))_Element、DomainAppSharedFlds(域應(yīng)用程序共享字段)_Element、以及Ruleset_Element特定于域,并且在下面進(jìn)行描述。
9.1 DomainGoal_ElementDomain_Element的該元素指定域的目標(biāo)字段,并且具有以下格式DomainGoal_Element::=(′domain_goal′[LocTag_Attrib])IdentifierSpec //后向鏈接目標(biāo)(字段)如果Domain_Element指定DomainGoal_Element,則推理引擎112可以后向鏈接域的規(guī)則,以便求解目標(biāo)字段。否則,推理引擎112可以前向鏈接域的規(guī)則。
來自樣例規(guī)則庫114的樣例DomainGoal_Element可以是<domain name=″PerformConclusionAnalysis″appshared=″true″>
<domain_goal>
<identifier name=″OverallConclusion″/>
</domain_goal>
...
</domain>
9.2 DomainAppSharedFlds_ElementDomain_Element的該元素指定要與客戶端應(yīng)用程序122共享的字段,并且具有以下格式<pre listing-type="program-listing"><![CDATA[DomainAppSharedFlds_Element ::=(′appshared_fields′[LocTag_Attrib]) [DomainPreConditionList_Element] [DomainPostConditionList_Element] DomainPreConditionList_Element ::=(′precondition_list′[LocTag_Attrib]) ConditionIistItem*DomainPostConditionList_Element ::=(′postcondition_list′[LocTag_Attrib]) ConditionListItem* ConditionListItem//限于全局字段 ::=IdentifierSpec ::=FieldRef_Element]]></pre>如果域包括DomainAppSharedFlds_Element子元素,則域本身可以自動地與客戶端應(yīng)用程序122共享。DomainAppSharedFlds_Element指定兩個子元素一個用于推理前置條件,而另一個用于推理后置條件。每個子元素指定零個或更多規(guī)則庫級字段。在一個實施例中,該列表可以指定規(guī)則庫級別而非域級字段。如果為兩個列表都指定相同字段,則字段可以假定為前置條件字段。
DomainPreConditionList(域前置條件列表)_Element標(biāo)識客戶端應(yīng)用程序122既可讀又可寫的字段。DomainPostConditionList(域后置條件列表)_Element標(biāo)識對于客戶端應(yīng)用程序122是只讀的字段。推理引擎112可以拒絕客戶端應(yīng)用程序122不正確訪問字段的嘗試。在一個實施例中,不同規(guī)則庫域由于其輸入和輸出可以不同,而可指定不同的DomainAppSharedFlds_Element。
來自樣例規(guī)則庫114的樣例DomainAppSharedFlds_Element可以是<domain name=″PerformConclusionAnalysis″appshared=″true″>
...
<appshared_fields>
<precondition_List>
<identifier name=″Fact1″/>
<identifier name=″Fact2″/>
<identifier name=″Fact3″/>
<identifier name=″Fact4″/>
</precondition_List>
<postcondition_List>
<identifier name=″OverallConclusion″/>
</postcondition_List>
</appshared_fields>
...
</domain>
上面例子示出四個前置條件字段和一個后置條件字段的定義。對于每個字段,僅指定了一個標(biāo)識符,因為僅存在一個為這些字段定義的類實例(從而不存在引用歧義)。一般而言,共享字段可以特定于單個靜態(tài)實例,以便例如域可以共享Father.Age而非Mother.Age。如果域需要共享多個實例的字段,則DomainAppSharedFlds_Element可以以每個實例一個的方式指定多個字段,例如<precondition_List>
<identifier_path>
<identifier name=″Father″/>
<identifier name=″Age″/>
</identifier_path>
<identifier_path>
<identifier name=″Mother″/>
<identifier name=″Age″/>
</identifier_path>
</precondition_List>
域還可選擇共享類的所有實例的字段。為此,DomainAppSharedFlds_Element使用FieldRef_Element來指定這些字段,例如<precondition_List>
<field_ref name=″Age″>
<identifier name=″Person″/>
</field_ref>
</precondition_List>
該例子指定Age字段應(yīng)為Person的所有實例共享。當(dāng)與動態(tài)實例一起使用時,這可以是有用的,其中逐項列舉給定字段的所有實例可能是不實際或不可能的。
FieldRef_Element可以指定父類以及葉子類,例如<precondition_List>
<field_ref name=″Age″>
<identifier name=″Bird″/>
</field_ref>
</precondition_List>
該形式是從那個父類派生的所有葉子類的簡寫形式,例如<precondition_List>
<field_ref name=″Age″>
<identifier name=″Duck″/>
</field_ref>
<field_ref name=″Age″>
<identifier name=″Vulture″/>
</field_ref>
<field_ref name=″Age″>
<identifier name=″Robin″/>
</field_ref>
</precondition_List>
9.3 Ruleset_ElementDomain_Element的該元素定義規(guī)則集級資源,并且具有以下格式<pre listing-type="program-listing"><![CDATA[Ruleset_Element ::=(′ruleset′Ruleset_Attribs+) RuleSet_Item* Ruleset_Attribs ::=Name_Attrib //必需 ::=Post_Attrib //可選 ::=AppShared_Attrib //可選 ::=LocTag_Attrib//可選 RulesetItem ::=InitMethodDef_Element ::=Assoc_Element ::=ConstraintSet_Element ::=Class_Element::=Rule_Element]]></pre>該元素可以使用Post_Attrib字段可選地指定推理引擎112應(yīng)當(dāng)根據(jù)客戶端應(yīng)用程序122或規(guī)則庫邏輯的控制,有條件地將規(guī)則集的規(guī)則張貼(post)到域的規(guī)則議程(agenda)。缺省地,當(dāng)裝載規(guī)則集時,推理引擎112可以無條件地將規(guī)則張貼到議程。該元素也可使用AppShared_Attrib字段可選地指定規(guī)則集可訪問客戶端應(yīng)用程序122。否則,規(guī)則集僅可訪問規(guī)則庫邏輯。
域可以與客戶端應(yīng)用程序122共享多個規(guī)則集。如果域共享任何規(guī)則集,則域本身也可自動地與客戶端應(yīng)用程序122共享。如果規(guī)則集與應(yīng)用程序共享,則Post_Attrib可以設(shè)為“conditional(有條件)”。否則,服務(wù)器102可以用語法錯誤拒絕該元素。如果規(guī)則集不與客戶端應(yīng)用程序122共享,則PostS_Attrib可以設(shè)為“conditional”或“unconditional(無條件)”。
所有子元素可以指定Name_Attrib。這些名稱在規(guī)則集級別可以是唯一的,但是可以覆蓋處于更高級別的名稱,并且可以在更低級別被覆蓋。如果規(guī)則集在給定級別定義具有相同名稱的對象,則規(guī)則庫構(gòu)建器110可以在合并過程期間將這些對象合并成單個規(guī)則庫對象。
若干規(guī)則集子元素,如InitMethodDef_Element、Assoc_Element、ConstraintSet_Element、以及Class_Element與上面描述的規(guī)則庫級子元素相同。Rule_Element可以特定于規(guī)則集,并且在下面進(jìn)行描述。
樣例規(guī)則庫114中的樣例Ruleset_Element可以是<domain name=″PerformConclusionAnalysis″appshared=″true″>
...
<ruleset name=″ConclusionAnalysis″>
...
</ruleset>
...
</domain>
10.Rule_Element該元素定義規(guī)則,并且具有以下格式<pre listing-type="program-listing"><![CDATA[Rule_Element ::=(′rule′Rule_Attribs+)RuleBody Rule_Attribs ::=Namez_Attrib //必需 ::=Priority_Attrib //可選 ::=Enabled_Attrib//可選 ::=LocTag_Attrib //可選 RuleBody ::=DecisionTree_Element ::=PatternMatching_Element]]></pre>該元素可以使用Priority_Attrib字段可選地指定優(yōu)先級級別。推理引擎112可以通過優(yōu)先級次序,例如從最高值到最低值或者從最低值到最高值,對域議程中的規(guī)則進(jìn)行定序。如果該元素沒有指定優(yōu)先級級別,則推理引擎112可以賦予零或其它適合值的缺省優(yōu)先級。
該元素還可以通過Enabled(使能)_Attrib可選地指定是否應(yīng)啟用規(guī)則以進(jìn)行推理。如果啟用,則該規(guī)則參與推理。否則,推理引擎112忽略該規(guī)則。在一個實施例中,缺省地,規(guī)則被啟用。
規(guī)則定義語言內(nèi)在地支持兩種規(guī)則,即決策樹規(guī)則和模式匹配規(guī)則。不同類型在相同規(guī)則集內(nèi)可以混合。規(guī)則編輯器和轉(zhuǎn)換器,如規(guī)則編輯器132和變換器133可以選擇支持附加類型的規(guī)則。例如,Infix(中綴)到XML工具還可支持IF-THEN規(guī)則。由于IF-THEN規(guī)則可表示決策樹規(guī)則的簡單特殊化,因此Infix到XML工具可從IF-THEN規(guī)則生成決策樹規(guī)則。這對于決策表規(guī)則同樣為真,因為如同IF-THEN規(guī)則它們可以表示決策樹規(guī)則的特殊化。
來自樣例規(guī)則庫114的一些樣例Rule_Element可以是<domain name=″PerformConclusionAnalysis″appshared=″true″>
...
<ruleset name=″ConclusionAnalysis″>
<rule name=″Overall_status″>
...
</rule>
<rule name=″Conclusion1_status″>
...
</rule>
<rule name=″Conclusion2_status″>
...
</rule>
</ruleset>
</domain>
10.1 DecisionTree_ElementRule_Element的該元素定義決策樹規(guī)則的主體。
10.1.1 結(jié)構(gòu)元素決策樹包括一個或多個具有以下形式的決策DecisionTree_Element::=(′dec_tree_body′[LocTag_Attrib])Decision_Element+10.1.1.1 決策每個決策由標(biāo)識符(Name_Attrib)命名,并且包括以下子元素Decision_Element::=(′decision′Decision_Attribs+)GeneralExprDecTestGroup_Element*[DecOtherwise_Element][DecUnknown_Element]Decision_Attribs::=Name_Attrib //必需::=LocTag_Attrib //可選雖然不同規(guī)則內(nèi)的決策可以共享相同決策名稱,但給定規(guī)則內(nèi)的決策可以具有唯一名稱。決策可以定義任何數(shù)據(jù)類型的基本表達(dá)式(GeneralExpr)。該表達(dá)式可以引用字段并且調(diào)用方法。決策也可以定義一個或多個測試組(DecTestGroup(決策樹組)_Element)。它還可以可選地定義otherwise(否則)子句(DecOtherwise_Element)和/或未知子句(DecUnknown_Element)。
10.1.1.2 決策測試組每個測試組指定一個或多個case(情況)表達(dá)式和action(操作)子句,并且它具有以下形式DecTestGroup_Element::=(′dec_test_group′[LocTag_Attrib])DecCaseExpr+DecAction推理引擎112比較情況表達(dá)式(DecCaseExpr)的值與決策基本表達(dá)式的值。如果推理引擎112發(fā)現(xiàn)至少一個“相等”比較,則推理引擎112執(zhí)行由該組的操作子句(DecAction)指定的操作。
10.1.1.3 決策否則子句否則子句指定當(dāng)前決策的缺省操作子句,并且具有以下形式DecOtherwise_Element::=(′dec_otherwise′[LocTag_Attrib])DecAction如果沒有決策測試組或者它們都沒有產(chǎn)生“真”比較,則推理引擎112執(zhí)行由該子句的操作子句(DecAction)指定的操作。
10.1.1.4 決策未知子句未知子句如同否則子句,是當(dāng)前決策的特殊情況操作子句,并且具有以下形式DecUnknown_Element::=(′dec_unknown′[LocTag_Attrib])DecAction如果推理引擎112由于未知字段引用而不能對決策的基本表達(dá)式進(jìn)行求值,則推理引擎112執(zhí)行由該子句的操作子句(DecAction)指定的操作。
10.1.1.5 決策操作子句操作子句可以指定兩種操作之一,并且具有以下形式<pre listing-type="program-listing"><![CDATA[DecAction ::=DecStatements_Element ::=DecRef_Element //嵌套決策 DecStatements_Element ::=(′dec_statements′[LocTag_Attrib])Statement* DecRef_Element ::=(′dec_ref′DecRef_Attribs+) DecRef_Attribs ::=Name_Attrib //決策名-必需 ::=LocTag_Attrib //可選]]></pre>語句-操作子句(DecStatements_Element)指定要執(zhí)行的零個或更多語句。當(dāng)執(zhí)行這些操作時,推理引擎112以“觸發(fā)”或“掛起”狀態(tài)(如果子句指定一些語句)否則以“舍棄”狀態(tài)(如果子句沒有指定任何語句)終止規(guī)則。
決策操作子句(DecRef_Element)對當(dāng)前決策樹規(guī)則內(nèi)的另一個決策進(jìn)行命名。推理引擎112繼續(xù)執(zhí)行(pursue)該命名決策作為當(dāng)前決策的子決策。對于給定規(guī)則,多個決策操作子句(不管是在相同決策中還是在不同決策中)全都可以引用相同的決策作為子決策。
10.1.1.6 測試組情況表達(dá)式每個測試組情況表達(dá)式指定部分比較,并且具有以下形式DecCaseExpr::=PartComp_EQ_Element//=GeneralExpr::=PartComp_NE_Element//<>GeneralExpr::=PartComp_LT_Element//<GeneralExpr::=PartComp_LTEQ_Element //<=GeneralExpr::=PartComp_GT_Element//>GeneralExpr::=PartComp_GTEQ_Element //>=GeneralExpr::=PartComp_Range_Element //在范圍以內(nèi)(GeneralExpr1..
GeneralExpr2)部分比較(PartComp_xxx_Element)在后面進(jìn)行描述。在一個實施例中,這些表達(dá)式不需要是常數(shù)表達(dá)式。例如,它們可以自由地引用字段和調(diào)用方法。這些表達(dá)式與決策的基本表達(dá)式也可以是類型兼容的。
10.1.2 動態(tài)標(biāo)識符路徑中的空在一個實施例中,動態(tài)標(biāo)識符路徑可以包括空值。例如,在以下語句中Duck1.OwnedBy.SpouseOf.Name=″fred″SpouseOf可能具有空值。如果在基本表達(dá)式求值期間檢測到空值,則推理引擎112可以舍棄該規(guī)則(除非它指定otherwise(否則)語句)。如果在test-case(測試情況)求值期間檢測到空值,則推理引擎112可以舍棄該測試情況,并且繼續(xù)其它測試情況。如果在執(zhí)行操作時檢測到空值,則推理引擎112可以用錯誤中止推理。
推理引擎112還可考慮操作語句。例如,在這些語句中isTrue=Duck1.OwnedBy.SpouseOf.Name==″fred″//SpouseOf為空isTrue=Duck1.owner.age>5 and Duck1.spouse.age<5//Owner(所有者)和/或Spouse(配偶)為空不中止,推理引擎112可以將關(guān)系子表達(dá)式求值為假。同樣地,對于基本表達(dá)式前提,例如eval Duck1.owner.age<5 or Duck1.spouse.age<5//Owner為空推理引擎112可以舍棄單獨比較。然而,如果Owner為空,Spouse不為空,并且Spouse年齡足夠小,則推理引擎112可以仍然將基本表達(dá)式求值為真。
10.1.3 示例規(guī)則和行為決策樹決策可以類似于C、C++和Java內(nèi)的switch語句。決策的基本表達(dá)式可以對應(yīng)于switch表達(dá)式,測試組情況表達(dá)式可以對應(yīng)于switch的case(情況)語句,并且決策的otherwise(否則)子句可以對應(yīng)于switch的缺省情況。
下面是反映單個決策的非常簡單決策樹規(guī)則的中綴代碼例子<rule name=″Factl_is_true″>
<![CDATA[decision maineval Fact2thencase=false;do Fact1=true endend]]>
</rule>
本例等價于更傳統(tǒng)的IF規(guī)則。如果Fact2為FALSE(假),則該規(guī)則將Fact1設(shè)為TRUE(真)。
下面是反映多個決策的另一個例子<rule name=″Determine_Fact4_status″>
<![CDATA[decision maineval agethencase<21.5decision sub1case>=30..<=32case>=41..<=55.5decision sub2case>32..<41do endotherwisedo Fact4=false endunknowndo Fact4=true endenddecision sub1eval Fact2thencase=truedo Fact4=false endotherwisedo Fact4=true endenddecision sub2eval Fact3
thencase=falsedo Fact4=true endotherwisedo Fact4=false endend]]>
</rule>
該規(guī)則對年齡進(jìn)行求值,并且根據(jù)結(jié)果有條件地執(zhí)行操作。在一些情況(如年齡15)下,操作是處理另一個決策(向該規(guī)則給出其獨特樹狀行為)。在其它情況(如年齡35)下,不存在要執(zhí)行的操作。
在本例中,決策測試組可以“堆疊”多種情況,以便共享操作(例如,對于年齡35和45)。使用未知子句捕獲年齡未知的情形,并且使用否則子句捕獲未被決策測試組覆蓋的情形。
10.1.4 另外行為10.1.4.1 規(guī)則庫編譯期間在一個實施例中,規(guī)則庫構(gòu)建器110可以確保對于給定決策樹規(guī)則,所有決策是唯一命名的。在本實施例中,規(guī)則庫構(gòu)建器110還可確保正好一個規(guī)則決策不被任何其它決策引用為子決策。規(guī)則庫構(gòu)建器110可以將該決策區(qū)別為規(guī)則的根決策。規(guī)則可以任何次序指定決策,而不管決策可以如何引用另一個決策作為子決策。多個決策操作子句可以指定相同決策作為子決策。規(guī)則庫構(gòu)建器110可以禁止自引用決策和決策之間的“循環(huán)”引用。
10.1.4.2 推理期間在一個實施例中,推理引擎112在根決策中開始規(guī)則處理。在本實施例中,推理引擎112然后可以根據(jù)此結(jié)果進(jìn)入那個決策的嵌套決策中的最多之一。決策可以嵌套至任意層數(shù),但是在每一層,推理引擎112的行為可以是類似的。
對于給定決策,推理引擎112首先對該決策的基本表達(dá)式進(jìn)行求值。如果其由于未知字段引用而失敗,則推理引擎112執(zhí)行未知子句(如果指定了一個的話)的操作。如果不存在這樣的子句,則推理引擎112立即以掛起狀態(tài)終止規(guī)則處理。
如果推理引擎112成功地對決策的基本表達(dá)式進(jìn)行求值,則推理引擎112下一步將該表達(dá)式的值應(yīng)用于任何測試組情況表達(dá)式。推理引擎112按照由決策指定的次序訪問測試組。在每個測試組內(nèi),推理引擎112按照由測試組指定的次序訪問情況表達(dá)式。
當(dāng)檢測到真情況時,推理引擎112執(zhí)行那個擁有組的操作。如果任何測試組中的情況都不適用,則推理引擎112執(zhí)行否則子句的操作(如果定義的話),否則以舍棄狀態(tài)終止規(guī)則處理。
語句-操作子句可以為空或非空。如果為空,則推理引擎112以舍棄狀態(tài)終止規(guī)則處理。否則,推理引擎112以觸發(fā)或掛起狀態(tài)終止規(guī)則處理。
10.1.4.3 情況表達(dá)式的規(guī)則掛起推理引擎112可以查看測試組的情況表達(dá)式作為公共操作的可選資格。如果任何情況表達(dá)式產(chǎn)生真情況,則推理引擎112執(zhí)行組操作。
如果情況表達(dá)式求值由于未知字段的引用而失敗,則推理引擎112對其它的組的情況表達(dá)式進(jìn)行求值以查找真情況。如果找不到一個,則推理引擎112以掛起狀態(tài)終止規(guī)則。
作為該處理的結(jié)果,具有多個測試情況的測試組在語義上可以不等同于各自具有單個測試情況的多個測試組。例如,假定以下測試組case<minimumcase>maximumcase>dangerous_range_start..<dangerous_range_enddoDoSomething()end如果基本表達(dá)式的值落在危險范圍內(nèi),即使最小和最大值是未知的,推理引擎112也觸發(fā)規(guī)則。然而,假定以下表面上等同的測試組case<minimumdoDoSomething()endcase>maximumdo
DoSomething()endcase>dangerous_range_start..<dangerous_range_enddoDoSomething()end如果最小值未知,則即使最大和/或范圍值已知,推理引擎112也立即以掛起狀態(tài)終止規(guī)則。
10.1.4.4 語句操作的規(guī)則掛起當(dāng)執(zhí)行規(guī)則操作時,如果推理引擎112檢測到對未知字段的引用,則推理引擎112立即以掛起狀態(tài)終止規(guī)則。當(dāng)重新啟動規(guī)則時,推理引擎112恢復(fù)先前導(dǎo)致規(guī)則掛起的操作內(nèi)的執(zhí)行。
10.1.5 其它者慮推理引擎112可以前向鏈接或后向鏈接決策樹規(guī)則。在一個實施例中,雖然決策樹規(guī)則可以創(chuàng)建動態(tài)實例(通過inst_make內(nèi)部方法),但是它不可訪問動態(tài)實例。在本實施例中,它只能引用靜態(tài)實例的字段和方法。
10.2 PatternMatching_ElementRule_Element的該元素定義模式匹配規(guī)則,并且具有以下格式<pre listing-type="program-listing"><![CDATA[PatternMatching_Element ::=(′pm_rule′PM_Attribs*) PMBindVars PMPremise_Element PMActions_Element [PMOrderBy_Element] PM_Attribs ::=PMOptions_Attrib //可選(見下值) ::=LocTag_Attrib //可選 //對于PMOptions_Attrib PMOption ::=′mostrecent′ ::=′singlefire′]]></pre>
該規(guī)則可以指定一個或多個選項作為字段。這些選項影響實例綁定(mostrecent-最近)的次序以及推理引擎112是否觸發(fā)規(guī)則僅一次(對于首次綁定)或者多次(對于所有綁定)。缺省地,推理引擎112可以以先入先出的方式(least recent-最不近)對綁定進(jìn)行排序,并且對所有綁定觸發(fā)該規(guī)則。
當(dāng)PM_Attribs指定多個選項時,這些選項可以是逗號分隔的,例如options=″mostrecent,singlefire″這些選項還可以任何次序指定。
PatternMatching_Element可以包括用于綁定變量聲明(PMBindVars)、規(guī)則邏輯(PMPremise_Element、PMActions_Element)以及可選的排序指定(PMOrderBy_Element)的三個子元素。
來自樣例規(guī)則庫114的模式匹配規(guī)則的中綴代碼例子可以是<rule name=″Itemize_persons_without_any_siblings″>
<![CDATA[forany person pif//人從未有過任何同胞p.IsSiblingOf.@fld_isunknown()//人目前沒有同胞or p.IsSiblingOf=set()thenvar msg is string=″No sibling for″&p.@inst_getname()@engn_tracemsg(msg)end//按照年齡以升序?qū)椖窟M(jìn)行排序;//對于相等年齡,按照最近性進(jìn)行排序(最近最先)options mostrecentorderby p.getage()]]>
</rule>
該規(guī)則遍及Person的所有實例,并且逐項列舉沒有任何同胞的實例。結(jié)果按照年齡來排序。在年齡相同的情況下,更近的綁定居于更不近的綁定之前。
模式匹配規(guī)則可以是更動態(tài)的,并且自動地對在其它規(guī)則中執(zhí)行的實例創(chuàng)建、修改和刪除作出反應(yīng)。例如,依靠自身(feed off of itself),并由此計算所有同胞關(guān)系的單條規(guī)則可以是<rule name=″Make_sibling_if_there_are_shared_siblings″>
<![CDATA[forany person p1,any person p2if//不同人p1<>p2//這兩個人已經(jīng)不是同胞and not p1.IsSiblingOf.@set_doesincludeval(p2)//這兩個人共有同胞and p1.IsSiblingOf.@set_doesintersect(p2.IsSiblingOf)then//使這兩個人為同胞p1.IsSiblingOf.@set_addval(p2)end]]>
</rule>
如果動態(tài)標(biāo)識符路徑包括空值,則推理引擎112可以執(zhí)行上面關(guān)于決策樹規(guī)則所述的相同操作。
10.2.1 PMBindVars構(gòu)造該構(gòu)造聲明模式匹配規(guī)則的綁定變量,并且具有以下格式<pre listing-type="program-listing"><![CDATA[PMBindVars ::=PMBindVarDcl_Element ::=PMBindVarList_Element PMBindVarDcl_Element::=(′bindvar_dcl′PMBindVarDcI_Attribs+) IdentifierSpec //bindvar類 PMBindVarDcl_Attribs ::=Name_Attrib //必需 ::=LocTag_Attrib//可選 PMBindVarList_Element ::=(′bindList′[LocTag_Attrib]) PMBindVarDcl_Element*]]></pre>該構(gòu)造可以聲明一個或多個綁定變量。每個聲明指定變量名(作為PMBindVarDcl_Attribs Name_Attrib)和類名。不同綁定變量可以與相同或不同類相關(guān)聯(lián)。對于中綴代碼聲明any person p,any duck d所生成的規(guī)則定義語言代碼可以是<bindlist>
<bindvar_dcl name=″p″loc_tag=″Line#2″>
<identifer name=″person″/>
</bindvar_dcl>
<bindvar_dcl name=″d″loc_tag=″Line#3″>
<identifer name=″duck″/>
</bindvar_dcl>
</bindlist>
如上所述,loc_tag字段表示推理引擎112可以在錯誤和跟蹤消息中包括的字段。當(dāng)執(zhí)行推理操作時,loc_tag字段無需由推理引擎112處理。另外,loc_tag字段可以在規(guī)則定義語言中應(yīng)用于在分級結(jié)構(gòu)中較低的元素,除非該較低元素覆蓋loc_tag值。結(jié)果,loc_tag字段可以用來將源輸入行號附于XML元素。
10.2.2 PMPremise_Element該元素定義規(guī)則的前提PMPremise_Element::=(′pm_premise′[LocTag_Attrib])
GeneralExprGeneralExpr可以是引用為該規(guī)則聲明的所有綁定變量的Boolean表達(dá)式。否則,服務(wù)器102可以用語法錯誤拒絕規(guī)則。
10.2.3 PMActions_Element該元素定義規(guī)則的操作PMActions_Element::=(′pm_actions′[LocTag_Attrib])Statement*規(guī)則操作可以通過綁定變量引用一些字段值,但是服務(wù)器102可以不堅持要求這些引用。
10.2.4 PMOrderBy_Element該元素指定用于對實例綁定進(jìn)行排序的準(zhǔn)則,并且具有以下格式PMOrderBy_Element::=(′orderby′[LocTag_Attrib])GeneralExpr*//Number(數(shù)字)或String(字符串)該元素指定零個或更多Number或String表達(dá)式作為排序準(zhǔn)則。推理引擎112可以首先通過第一表達(dá)式對綁定進(jìn)行排序,然后通過第二表達(dá)式對匹配綁定進(jìn)行排序,等等。如果在所有這些比較之后綁定仍然匹配,則推理引擎112可以根據(jù)mostrecent(最近)選項來決定排序。排序可以升序、降序或者其它適合次序來完成。如果對于Number表達(dá)式期望用降序,則用戶可以對表達(dá)式取負(fù),例如Orderby-p.getage()。
10.2.5其它考慮在一個實施例中,推理引擎112可以前向鏈接而非后向鏈接模式匹配規(guī)則。在本實施例中,推理引擎112在后向鏈接期間可以忽略任何模式匹配規(guī)則。模式匹配規(guī)則也可與靜態(tài)和動態(tài)實例或者兩種類型的混合一起工作。該規(guī)則可以能夠自由地修改靜態(tài)實例,并且它們可以自由地創(chuàng)建、修改和刪除動態(tài)實例。當(dāng)計算模式匹配實例綁定時,推理引擎112可以省略inst_template內(nèi)部實例。綁定變量可以與對象的超類相關(guān)聯(lián)。例如,用戶可能指定Bird綁定變量,并且推理引擎112可以在Duck、Robin和Hawk的實例上以多態(tài)方式進(jìn)行模式匹配。
11.語句構(gòu)造該構(gòu)造定義規(guī)則定義語言的邏輯語句元素,并且具有以下格式Statement::=VarDclStmt_Element::=AssignmentStmt_Element::=MethodCall_Element::=ReturnStmt_Element11.1 VarDclStmt_Element該Statement元素聲明局部變量,并且具有以下格式VarDclStmt_Element::=(′var_dcl′VarDcl_Attribs+)DataType_ElementGeneralExpr //初始化值VarDcl_Attribs::=Name_Attrib //必需::=LocTag_Attrib//可選該語句可以由規(guī)則和方法邏輯兩者指定。它可以位于該邏輯內(nèi)的任何地方,但是其位置可影響其范圍可見性。局部變量可以為任何數(shù)據(jù)類型,包括集合和關(guān)聯(lián)實例。該語句可以為局部變量指定初始化值。GeneralExpr定義類型兼容的初始化值。該表達(dá)式無需是常數(shù)表達(dá)式。
來自樣例規(guī)則庫114的中綴代碼例子可以是var result is boolean=true //以樂觀方式并且對應(yīng)的規(guī)則定義語言代碼可以是<var_dcl name=″result″loc_tag=″Line#2″>
<datatype coll_type=″none″type=″boolean″/>
<literal_constant value=″true″/>
</var_dcl>
11.2 AssignmentStmt_Element該Statement元素定義賦值語句,并且具有以下格式AssignmentStmt_Element
::=(′assign_stmt′[LocTag_Attrib])IdentifierSpec//目的(字段)GeneralExpr//源該元素可以由規(guī)則和方法邏輯兩者指定。推理引擎112對GeneralExpr進(jìn)行求值,并且將其值賦給類型兼容的指定目的對象。目的對象可以是字段或局部變量。如果是字段,則推理引擎112可以在完成賦值之前首先調(diào)用約束檢查。
當(dāng)操作數(shù)為Number類型時,推理引擎112比較操作數(shù)精度。如果GeneralExpr精度小于目的對象的精度,則推理引擎112可以對GeneralExpr值進(jìn)行零擴(kuò)展,以匹配目的精度,然后執(zhí)行賦值。否則,推理引擎112在必要時舍入GeneralExpr值,以匹配目的精度。
來自樣例規(guī)則庫114的中綴代碼例子可以是Fact1=true并且對應(yīng)的規(guī)則定義語言代碼可以是<assign_stmt loc_tag=″Line#3″>
<identifier name=″Fact1″/>
<literal_constant value=″true″/>
</assign_stmt>
11.3 MethodCall_ElementStatement的該元素定義方法調(diào)用語句,并且具有以下格式MethodCall_Element::=(′method_call′[LocTag_Attrib])IdentifierSpec //方法[MethodArgList_Element]MethodArgList_Element::=(′arg_list′[LocTag_Attrib])GeneralExpr*該元素可以由規(guī)則和方法邏輯兩者指定。推理引擎112可以調(diào)用帶有任何指定自變量的指定方法。該元素可作為獨立語句和表達(dá)式中的項(如果所調(diào)用的方法返回值)來應(yīng)用。調(diào)用可以包括零個或更多自變量表達(dá)式。自變量數(shù)目可以等于目標(biāo)方法所預(yù)期的參數(shù)數(shù)目,并且每個自變量與其對應(yīng)方法參數(shù)可以是類型兼容的。如果方法參數(shù)是輸出參數(shù),則自變量可以是字段或局部變量的標(biāo)識符。
當(dāng)自變量和參數(shù)為Number類型時,則推理引擎112比較它們的精度。如果source-object(源對象)(輸入?yún)?shù)的自變量;輸出參數(shù)的參數(shù))精度小于目的對象(輸入?yún)?shù)的參數(shù);輸出參數(shù)的自變量),則推理引擎112對源值進(jìn)行零擴(kuò)展,以匹配目的精度,然后傳遞值。否則,推理引擎112在必要時舍入源值,以匹配目的精度。類似的考慮可以應(yīng)用于Number類型的方法返回值。推理引擎112可以在將返回值賦給目的對象之前調(diào)整或舍入返回值。
來自樣例規(guī)則庫114中的模式匹配規(guī)則的中綴代碼例子可以是//關(guān)聯(lián)人和鴨子p.AssignDuck(d)并且對應(yīng)的規(guī)則定義語言代碼可以是<method_call loc_tag=″Line#13″>
<identifier_path>
<identifier name=″p″/>
<identifier name=″AssignDuck″/>
</identifier_path>
<arg_list>
<identifier name=″d″/>
</arg_list>
</method_call>
11.4 ReturnStmt_Element該元素定義方法返回語句,并且具有以下格式RetumStmt_Element::=(′return_stmt′[LocTag_Attrib])[GeneralExpr]在一個實施例中,該語句可以僅由方法邏輯而非規(guī)則邏輯指定。如果在規(guī)則邏輯內(nèi)指定,則服務(wù)器102可以用語法錯誤拒絕該語句。當(dāng)執(zhí)行該語句時,推理引擎112可以終止方法執(zhí)行,并且返回控制給調(diào)用該方法的代碼。如果該語句指定GeneralExpr,則當(dāng)前方法可以被定義為返回值,并且所聲明的返回數(shù)據(jù)類型與該語句的GeneralExpr可以是類型兼容的。如同對MethodCall_Element描述的一樣,推理引擎112可以調(diào)整或舍入Number類型的返回值。
來自樣例規(guī)則庫114的中綴代碼例子可以是return Symptoms.@Set_DoesIncludeVal(symp1)and not Symptoms.@set_DoesINcludeVal(symp2)并且對應(yīng)的規(guī)則定義語言代碼可以是<return_stmt loc_tag=″Line#1″>
<and_op loc_tag=″Line#2″>
<method_call>
<identifier intrinsic=″true″name=″set_doesincludeval″/>
<arg_list>
<identifier name=″Symptoms″/>
<identifier name=″symp1″/>
</arg_list>
</method_call>
<not_op>
<method_call>
<identifier intrinsic=″true″name=″set_doesincludeval″/>
<arg_list>
<identifier name=″Symptoms″/>
<identifier name=″symp2″/>
</arg_list>
</method_call>
</not_op>
</and_op>
</return_stmt>
12.GeneralExpr構(gòu)造GeneralExpr構(gòu)造定義從規(guī)則定義語言邏輯引用的表達(dá)式,并且具有以下格式<pre listing-type="program-listing"><![CDATA[GeneralExpr ::=SimpleTerm ::=RelationalTerm //一元操作符 ::=UnaryPlusExpr_Element ::=UnaryMinusExpr_Element ::=UnaryNotExpr_Element //二元操作符 ::=ORed_Element ::=ANDed_Element ::=Addition_Element ::=Subtraction_Element ::=Concatenation_Element ::=Multiplication_Element ::=Division_Element]]></pre>GeneralExpr支持項和操作符的預(yù)期集合。如前所述,表達(dá)式求值不可產(chǎn)生任何副作用。同樣地,由表達(dá)式調(diào)用的任何方法不可產(chǎn)生任何副作用。稱作函數(shù)方法的這些方法在上面ClassMethodDef_Element章節(jié)中作了進(jìn)一步的描述。
在一個實施例中,該語法不試圖區(qū)分?jǐn)?shù)據(jù)類型兼容操作與不兼容操作。例如,該語法可建議可以從String值中減去Boolean值。在本實施例中,由執(zhí)行類型檢查和常量合并(constant folding)的服務(wù)器102執(zhí)行類型兼容性強(qiáng)制。
設(shè)法包括項和操作符的大部分類型的示例中綴代碼語句可以是var IsHappy is Boolean=Is WealthyOr(age>0..<=200and not IsTooTalland QualityIndex(
(income+savings-debts)/12,firstname&″″&lastname,some_random_number)>+100)該語句的對應(yīng)規(guī)則定義語言代碼可以是<var_dcl loc_tag=″Line#1″name=″IsHappy″>
<datatype coll_type=″none″type=″Boolean″/>
<or_op loc_tag=″Line#3″>
<identifier name=″IsWealthy″/>
<and_op loc_tag=″Line#6″>
<and_op loc_tag=″Line#5″>
<range_op>
<identifier name=″age″/>
<part_gt_op>
<literal_constant value=″0″/>
</part_gt_op>
<part_lteq_op>
<literal_constant value=″200″/>
</part_lteq_op>
</range_op>
<not_op>
<identifier name=″IsTooTall″/>
</not_op>
</and_op>
<gt_op>
<method_call>
<identifier name=″QualityIndex″/>
<arg_list>
<div_op>
<subt_op>
<add_op>
<identifier name=″income″/>
<identifier name=″savings″/>
</add_op>
<identifier name=″debts″/>
</subt_op>
<literal_constant value=″12″/>
</div_op>
<concat_op>
<concat_op>
<identifier name=″firstname″/>
<literal_constant value=″&quot;&quot;″>
</concat_op>
<identifier name=″lastname″/>
</concat_op>
<identifier name=″some_random_number″/>
</arg_list>
</method_call>
<uplus_op>
<literal_constant value=″100″/>
</uplus_op>
</gt_op>
</and_op>
</or_op>
</var_dcl>
12.1 SimpleTerm構(gòu)造GeneralExpr的SimpleTerm可以具有以下格式SimpleTerm::=LiteralConstant_Element::=SetConstant_Element
::=IdentifierSpec //對象名稱::=MethodCall_Element在此描述LiteralConstant_Element和SetConstant_Element。IdentifierSpec在本文的后面進(jìn)行描述,而MethodCall_Element在上面已作過描述。
12.1.1 LiteralConstant_ElementLiteralConstant_Element具有以下格式LiteralConstant_Element::=(′literal_constant′LiteralConstant_Attribs+)LiteralConstant_Attribs::=Value_Attrib //必需::=LocTag_Attrib//可選Value_Attrib常量值表示為字符串。服務(wù)器102可以檢查該值(以不區(qū)分大小寫的方式)以便確定常量的數(shù)據(jù)類型。如果值為“TRUE”或“FALSE”,則服務(wù)器102識別該常量為Boolean常量。如果值為“NULL”,則服務(wù)器102識別該常量為關(guān)聯(lián)實例常量(表示缺乏關(guān)聯(lián)實例)。如果值的第一字符是雙引號字符,則服務(wù)器102識別該常量為String常量,并且驗證該值的最后字符也為雙引號字符。否則,服務(wù)器102假定該常量是Number常量,并且相應(yīng)地解析它。推理引擎112通過檢查小數(shù)點右邊的位數(shù)來確定該常量的精度。如果該常量采用科學(xué)表示法來表達(dá),則精度也對指數(shù)值加以考慮。
字面常量的中綴代碼例子可以是method1(false,null,″abc″,″″,123.456)并且對應(yīng)的規(guī)則定義語言代碼可以是<method_call loc_tag=″Line#1″>
<identifier name=″method1″/>
<arg_list>
<literal_constant value=″false″/>
<literal_constant value=″null″/>
<literal_constant value=″&quot;abc&quot;″/>
<literal_constant value=″&quot;&quot;″/>
<literal_constant valtue=″123.456″/>
</arg_list>
</method_call>
12.1.2 SetConstant_ElementSetConstant_Element具有以下格式SetConstant_Element::=(′set_constant′[LocTag_Attrib])SetMember*SetMember::=LiteralConstant_Element::=IdentifierSpec //實例名稱::=UnaryExpr//只帶LiteralConstant_Element集合包含零個或更多成員。在一個實施例中,集合的所有成員都應(yīng)具有相同數(shù)據(jù)類型。成員(若有的話)的數(shù)據(jù)類型為集合常量的數(shù)據(jù)類型。成員可以是字面常量、IdentifierSpec(用于關(guān)聯(lián)實例集合)或者對字面常量的一元操作符。在對字面常量的一元操作符的情況下,字面常量可以是Number或Boolean常量。對于Number的集合常量,盡管其成員具有精度,但集合本身不具有精度。同樣地,實例的集合常量不綁定于任何特定關(guān)聯(lián)。
集合常量的中綴代碼例子可以是set1=set(123)set2=set(″abc″,″def″)set3=set(duck1,duck2)set4=set(-123,0)set5=set()//空集合并且對應(yīng)的規(guī)則定義語言代碼可以是<assign_stmt loc_tag=″Line#1″>
<identifier name=″set1″/>
<set_constant>
<literal_constant value=″123″/>
</set_constant>
</assign_stmt>
<assign_stmt loc_tag=″Line#2″>
<identifier name=″set2″/>
<set_constant>
<literal_constant value=″&quot;abc&quot;″/>
<literal_constant value=″&quot;def&quot;″/>
</set_constant>
</assign_stmt>
<assign_stmt loc_tag=″Line#3″>
<identifier name=″set3″/>
<set_constant>
<identifier name=″duck1″/>
<identifier name=″duck2″/>
</set_constant>
</assign_stmt>
<assign_stmt loc_tag=″Line#4″>
<identifier name=″set4″/>
<set_constant>
<uminus_op>
<literal_constant value=″123″/>
</uminus_op>
<literal_constant value=″0″/>
</set_constant>
</assign_stmt>
<assign_stmt loc_tag=″Line#5″>
<identifier name=″set5″/>
<set_constant/>
</assign_stmt>
12.2 RelationalTerm構(gòu)造RelationalTerm定義值比較,并且具有以下格式RelationalTerm::=Fullcomp_EQ_Element
::=Fullcomp_NE_Element::=Fullcomp_LT_Element::=Fullcomp_LTEQ_Element::=Fullcomp_GT_Element::=Fullcomp_GTEQ_Element::=Fullcomp_Range_Element值比較可包括上面描述的完全比較和部分比較。
12.2.1 完全比較構(gòu)造完全比較可以包括二元操作或者涉及值范圍的三元操作。示例二元操作可以是IsLessThan=fld1<123而示例三元操作可以是IsInRange=fld1>=100..<200//上面語句在語義上等價于下面語句//(但是更高效)IsInRange=fld1>=100 and fld1<200在任何情況下,該表達(dá)式返回表示比較結(jié)果的Boolean值。
對應(yīng)于上述三個中綴語句的規(guī)則定義語言代碼可以是<assign_stmt loc_tag=″Line#1″>
<identifier name=″IsLessThan″/>
<lt_op>
<identifier name=″fld1″/>
<literal_constant value=″123″/>
</lt_op>
</assign_stmt>
<assign_stmt loc_tag=″Line#2″>
<identifier name=″IsInRange″/>
<range_op>
<identifier name=″fld1″/>
<part_gteq_op>
<literal_constant value=″100″/>
</part_gteq_op>
<part_lt_op>
<literal_constant value=″200″/>
</part_lt_op>
</range_op>
</assign_stmt>
<assign_stmt loc_tag=″Line#5″>
<identifier name=″IsInRange″/>
<and_op loc_tag=″Line#5″>
<gteq_op>
<identifier name=″fld1″/>
<literal_constant value=″100″/>
</gteq_op>
<lt_op>
<identifier name=″fld1″/>
<literal_constant value=″200″/>
</lt_op>
</and_op>
</assign_stmt>
完全比較元素可以具有以下格式<pre listing-type="program-listing"><![CDATA[Fullcomp_EQ_Element//GeneralExpr=GeneralExpr ::=(′eq_op′Comp_Attribs*) GeneralExpr GeneralExpr Fullcomp_NE_Element//GeneralExpr<>GeneralExpr ::=(′neq_op′Comp_Attribs*) GeneralExpr GeneralExpr Fullcomp_LT_Element//GeneralExpr<GeneralExpr ::=(′lt_op′Comp_Attribs*) GeneralExprGeneralExpr Fullcomp_LTEQ_Element //GeneralExpr<=GeneralExpr ::=(′lteq_op′Comp_Attribs*) GeneralExpr GeneralExpr Fullcomp_GT_Element//GeneralExpr>GeneralExpr ::=(′gt_op′Comp_Attribs*) GeneralExpr GeneralExpr Fullcomp_GTEQ_Element //GeneralExpr>=GeneralExpr ::=(′gteq_op′Comp_Attribs*) GeneralExpr GeneralExpr Fullcomp_Range_Element //GeneralExpr在范圍以內(nèi)(GeneralExpr1..GeneralExpr2) ::=(′range_op′[LocTag_Attrib]) GeneralExpr RangeStartComp RangeStopComp RangeStartComp ::=PartComp_GT_Element ::=PartComp_GTEQ_Element RangeStopComp ::=PartComp_LT_Element ::=PartComp_LTEQ_Element]]></pre>對于所有這些元素,GeneralExpr可以全都為相同數(shù)據(jù)類型。然而,一些操作符僅支持特定數(shù)據(jù)類型。例如,相等和不等的比較支持所有數(shù)據(jù)類型和值的集合。不等集合可以或不可以相交。幅值的比較可以只支持Number和String表達(dá)式,但是也可應(yīng)用于集合。對于集合,結(jié)果表示子集關(guān)系。當(dāng)比較Number值時,推理引擎112首先將任何較低精度的操作數(shù)零擴(kuò)展至另一個操作數(shù)的精度,然后執(zhí)行比較。
對于所有元素,可以采用以下格式指定Comp_AttribsComp_Attribs::=CaseSensitivity_Attrib //可選::=LocTag_Attrib //可選可以指定CaseSensitivity(區(qū)分大小寫)_Attrib來表示區(qū)分大小寫的String比較。缺省地,String比較可以是不區(qū)分大小寫或者區(qū)分大小寫的。對于其它數(shù)據(jù)類型的比較,可以忽略該設(shè)置。
12.2.2 部分比較構(gòu)造范圍比較依賴于部分比較構(gòu)造、或者僅指定完全比較的“右手側(cè)”的構(gòu)造。部分比較構(gòu)造具有以下格式<pre listing-type="program-listing"><![CDATA[PartComp_EQ_Element //=GeneralExpr ::=(′part_eq_op′Comp_Attribs*) GeneralExpr PartComp_NE_Element //<>GeneralExpr ::=(′part_neq_op′Comp_Attribs*) GeneralExpr PartComp_LT_Element //<GeneralExpr ::=(′part_lt_op′Comp_Attribs*) GeneralExpr PartComp_LTEQ_Element //<=GeneralExpr ::=(′part_lteq_op′Comp_Attribs*) GeneralExpr PartComp_GT_Element //>GeneralExpr ::=(′part_gtop′Comp_Attribs*) GeneralExpr PartComp_GTEQ_Element //>=GeneralExpr ::=(′part_qteq_op′Comp_Attribs*) GeneralExpr PartComp_Range_Element //在范圍以內(nèi)(GeneralExpr1..GeneralExpr2) ::=(′part_range_op′[LocTag_Attrib])RangeStartComp RangeStopComp]]></pre>這些構(gòu)造也可以由決策樹元素使用,其指定一個GeneralExpr(或者對于范圍,指定二個)。它們也適用與完全比較相同的數(shù)據(jù)類型和區(qū)分大小寫考慮。
12.3 一元操作符元素GeneralExpr的一元操作符包括UnaryPlusExpr_Element、UnaryMinusExpr_Element和UnaryNotExpr_Element。
12.3.1 UnaryPlusExpr_ElementGeneralExpr的UnaryPlusEXpr_Element具有以下格式UnaryPlusExpr_Element::=(′uplus_op′[LocTag_Attrib])GeneralExpr該操作在本質(zhì)上返回GeneralExpr的值。包括它是為了“可表達(dá)性”的目的,例如If this_value>=-100..<=+100 then...endGeneralExpr可以是Number表達(dá)式,并且該操作返回Number值。
12.3.2 UnaryMinusExpr_ElementUnaryMinusExpr_Element具有以下格式UnaryMinusExpr_Element::=(′uminus_op′[LocTag_Attrib])GeneralExpr該操作取反GeneralExpr值的算術(shù)正負(fù)號。正值變成負(fù)值以及相反。GeneralExpr可以是Number表達(dá)式,但是該操作返回Number值。
12.3.3 UnaryNotExpr_ElementUnaryNotExpr_Element具有以下格式UnaryNotExpr_Element::=(′not_op′[LocTag_Attrib])GeneralExpr該操作取反GeneralExpr的Boolean值。TRUE值變成FALSE以及相反。GeneralExpr可以是Boolean表達(dá)式,并且該操作返回Boolean值。
12.4 二元操作符元素二元操作符包括ORed_Element、ANDed_Element、Addition_Element、Substraction_Element、Concatenation_Element、Multiplication_Element、以及Division_Element。
12.4.1 ORed_ElementORed_Element支持OR(或)操作,并且具有以下格式ORed_Element::=(′or_op′[LocTag_Attrib])GeneralExprGeneralExpr該操作對子元素執(zhí)行邏輯OR(或)操作。如果任一子元素為TRUE,則結(jié)果為TRUE。否則,結(jié)果為FALSE。GeneralExpr可以都是Boolean表達(dá)式,并且該操作返回Boolean值。
在運(yùn)行時,推理引擎112可以僅對GeneralExpr之一進(jìn)行求值,例如,對于中綴代碼表達(dá)式fld1<100 or fld2>=200如果fld1的值為50,則推理引擎112無需煩擾測試fld2,因為總結(jié)果已知為TRUE。然而,如果fld1未知,則推理引擎112可以測試fld2,以便如果fld2具有足夠大的值如250,則推理引擎112可以避免掛起規(guī)則。類似地,推理引擎112還可確定任何帶有中間實例引用字段的標(biāo)識符路徑是否具有空值。例如,對于中綴代碼表達(dá)式Father.pDog.age<5 or Child.pFriend.age>10Father可能沒有任何狗(pDog=null)。然而,如果Child(孩子)的朋友年齡足夠大,則推理引擎112可以將該表達(dá)式求值為真。
雖然ORed_Element被描述為二元操作符,但是它也可容納任意數(shù)目的操作數(shù)。例如,ORed_Element可以處理一個或多個操作數(shù)的“列表”。如果規(guī)則由于ORed_Element中的一個或多個操作數(shù)而被掛起,則推理引擎112可以以先前掛起的這些操作數(shù)(并且只是這些操作數(shù))重新啟動推理。
12.4.2 ANDed_ElementANDed_Element支持AND(與)操作,并且具有以下格式ANDed_Element::=(′and_op′[LocTag_Attrib])
GeneralExprGeneralExpr該操作對子元素執(zhí)行邏輯AND(與)操作。如果子元素都為TRUE,則結(jié)果為TRUE。否則,結(jié)果為FALSE。GeneralExpr可以都是Booleau表達(dá)式,并且該操作返回Booleau值。在運(yùn)行時,推理引擎112可以僅對GeneralExpr之一進(jìn)行求值,例如,對于中綴代碼表達(dá)式Fld1>=100 and fld2<200如果fld1的值為50,則推理引擎112無需煩擾測試fld2,因為總結(jié)果已知為FALSE。然而,如果fld1未知,則推理引擎112可以測試fld2,以便如果fld2具有足夠大的值如250,則推理引擎112可避免掛起規(guī)則。類似地,推理引擎112還可確定任何帶有中間實例引用字段的標(biāo)識符路徑是否具有空值。例如,對于中綴代碼表達(dá)式Father.pDog.age<5 and Child.pFriend.age>10Father可能沒有任何狗(pDog=null)。然而,如果Child的朋友年齡不足夠大,則推理引擎112可以將該表達(dá)式求值為假。
雖然ANDed_Element被描述為二元操作符,但是它也可容納任意數(shù)目的操作數(shù)。例如,ANDed_Element可以處理一個或多個操作數(shù)的“列表”。如果規(guī)則由于ANDed_Element中的一個或多個操作數(shù)而被掛起,則推理引擎112可以用先前掛起的這些操作數(shù)(并且只是這些操作數(shù))重新啟動推理。
12.4.3 Addition_ElementAddition_Element支持加法操作,并且具有以下格式Addition_Element::=(′add_op′[LocTag_Attrib])GeneralExprGeneralExpr該操作執(zhí)行子元素的算術(shù)加法。該操作返回將第二子元素加到第一子元素的結(jié)果。GeneralExpr可以都是Number表達(dá)式,并且該操作返回Number值。當(dāng)相加對象時,在算術(shù)操作之前,可以將較小精度的對象零擴(kuò)展至另一個對象的精度。該結(jié)果可以反映較大的精度。
12.4.4 Subtraction_ElementSubtraction_Element支持減法操作,并且具有以下格式
Subtraction_Element::=(′subt_op′[LocTag_Attrib])GeneralExprGeneralExpr該操作執(zhí)行子元素的算術(shù)減法。該操作返回從第一子元素減去第二子元素的結(jié)果。GeneralExpr可以都是Number表達(dá)式,并且該操作返回Number值。當(dāng)使對象相減時,在算術(shù)操作之前,可以將較小精度的對象零擴(kuò)展至另一個對象的精度。該結(jié)果可以反映較大的精度。
12.4.5 Concatenation_FlementConcatenation_Element支持串接操作,并且具有以下格式Concatenation_Element::=(′concat_op′[LocTag_Attrib])GeneralExprGeneralExpr該操作將一個String值附加到另一個String值。該操作返回將第二子元素附加到第一子元素的結(jié)果。GeneralExpr可以是任何數(shù)據(jù)類型,并且任一或全部兩個表達(dá)式可以是Set(集合)表達(dá)式。在執(zhí)行附加操作之前,推理引擎112可以將非String表達(dá)式自動轉(zhuǎn)換成String值。可以沒有用于控制非String值的格式化的選項。該操作返回String值。
12.4.6 Multiplication_ElementMultiplication_Element支持加法操作,并且具有以下格式Multiplication_Element::=(′mult_op′[LocTag_Attrib])GeneralExprGeneralExpr該操作執(zhí)行子元素的算術(shù)乘法。該操作返回將第一子元素乘以第二子元素的結(jié)果。GeneralExpr可以都是Number表達(dá)式,并且該操作返回Number值。當(dāng)使對象相乘時,可以沒有精度調(diào)整,并且乘積可以反映作為操作數(shù)精度之和的精度。
12.4.7 Division_ElementDivision_Element支持加法操作,并且具有以下格式
Division_Element::=(′div_op′[LocTag_Attrib])GeneralExprGeneralExpr該操作執(zhí)行子元素的算術(shù)除法。該操作返回將第一子元素除以第二子元素的結(jié)果。除以零可以用錯誤終止推理。GeneralExpr可以兩個都是Number表達(dá)式,并且該操作返回Number值。當(dāng)使對象相除時,可以沒有精度調(diào)整,并且商可以反映被除數(shù)值的精度,并且必要時可以進(jìn)行舍入。
13.DataType_Element本說明書頻繁地引用DataType_Element。DataType_Element具有以下格式<pre listing-type="program-listing"><![CDATA[DataType_Element ::=DataTypeNumber_Element ::=DataTypeBoolean_Element ::=DataTypeString_Element ::=DataTypeInstRef_Element //------------------------------------------------ DataTypeNumber_Element ::=(′datatype′NumberType_Attribs+) NumberType_Attribs ::=DataType_Attrib //″數(shù)字″(必需) ::=Collection_Attrib //可選 ::=Precision_Attrib//可選 ::=LocTag_Attrib //可選 //------------------------------------------------ DataTypeBoolean_Element ::=(′datatype′BooleanType_Attribs+) BooleanType_Attribs ::=DataType_Attrib //″布爾″(必需) ::=Collection_Attrib //可選 ::=LocTag_Attrib //可選//------------------------------------------------ DataTypeString_Element ::=(′datatype′StringType_Attribs+) StringType_Attribs ::=DataType_Attrib //″字符串″(必需) ::=Collection_Attrib //可選 ::=LocTag_Attrib //可選 //------------------------------------------------ DataTypeInstRef_Element ::=(′datatype′InstRefType_Attribs+) IdentifierSpec//實例的類 InstRefType_Attribs ::=DataType_Attrib //″inst_ref″(必需) ::=Collection_Attrib //可選 ::=LocTag_Attrib //可選]]></pre>規(guī)則定義語言支持上面示出的四種“原子”數(shù)據(jù)類型。對于每種原子數(shù)據(jù)類型,還可以存在Datatype(數(shù)據(jù)類型)_Element的變體。
DataType_Attrib和Collection(收集)_Attrib屬性公共于所有數(shù)據(jù)類型。DataType_Attrib表示相關(guān)數(shù)據(jù)類型。Collection_Attrib表示該數(shù)據(jù)類型是值的收集,如集合,還是簡單的原子值。
對于DataTypeNumber(數(shù)據(jù)類型數(shù))_Element,用戶可以可選地指定“精度”,其按照小數(shù)點右邊的十進(jìn)制位數(shù)來表達(dá)。如果未指定,服務(wù)器102假定該值為零精度的整數(shù)。
對于DataTypeAssocInst_Element,用戶可以指定兩個子元素。這些分別標(biāo)識數(shù)據(jù)類型的關(guān)聯(lián)角色和關(guān)聯(lián)名稱。例如,對于涉及類Person和Duck的Ownership關(guān)聯(lián),Duck類可能定義作為用于Ownership關(guān)聯(lián)中的角色Person的關(guān)聯(lián)實例而聲明的字段(IsOwnedBy),例如<field name=″IsOwnedBy″>
<datatype coll_type=″none″type=″assoc_instance″>
<identifier name=″Person″/>
<identifier name=″Ownership″/>
</datatype>
</field>
對于DataTypeInstRef_Element,用戶指定標(biāo)識與實例引用相關(guān)聯(lián)的類的子元素。例如,Duck類可以通過以下代碼定義作為Person類的實例而聲明的IsOwnedBy字段<field name=″IsOwnedBy″>
<datatype coll_type=″none″type=″inst_ref″>
<identifier name=″Person″/>
</datatype>
<field>
14.標(biāo)識符在一個實施例中,標(biāo)識符名稱可以是區(qū)分大小寫的。在特定實施例中,規(guī)則定義語言禁止標(biāo)識符名稱包括雙引號、句號、逗號、冒號或括號(開或閉)。服務(wù)器102可以例如通過保留字或者施加一些次序限制來施加附加限制。
14.1 IdentifierSpec-Identifier_Element、IdentifierPath_ElementIdentifierSpec元素具有以下格式<pre listing-type="program-listing"><![CDATA[IdentifierSpec ::=Identifier_Element ::=IdentifierPath_Element Identifier_Element ::=(′identifier′Identifier_Attribs+) Identifier_Attribs ::=Name_Attrib //必需 ::=Intrinsic_Attrib//可選 ::=LocTag_Attrib //可選 IdentifierPath_Element ::=(′identifier_path′[LocTag_Attrib]) Identifier_Element+]]></pre>標(biāo)識符指定可包括單個標(biāo)識符、或者多個標(biāo)識符的“路徑”。例如,中綴語言支持使用“.”操作符的路徑,例如Class1.Instance1.Fld1=3
14.2 內(nèi)部(Intrinsic)標(biāo)識符對于每個Identifier(標(biāo)識符)_Element,用戶可以可選地指定標(biāo)識符是內(nèi)部標(biāo)識符(Intrinsic_Attrib)或者內(nèi)置于規(guī)則定義語言的標(biāo)識符。服務(wù)器102可以檢查這些標(biāo)識符,并且將它們與其內(nèi)部名稱表進(jìn)行比較。可能存在匹配,如不區(qū)分大小寫的匹配。否則,服務(wù)器102可以作為語法錯誤拒絕該使用。
中綴語言可以要求每個內(nèi)部標(biāo)識符以“@”前綴指定。另外,中綴語言可以支持內(nèi)部使用的可選形式。例如,下面的語句對在語義上可以是等價的,并且產(chǎn)生相同的規(guī)則定義語言代碼@inst_reset(duck.@inst_template)duck.@inst_template.@inst_reset()@dmn_push(DomainX)DomainX.@dmn_push()If@fld_isunknown(instance1.fld1)then...endIf instance1.fld1.@fld_isunknown()then...endIf@set_doesincludeval(set1,123)then...endIf set1.@set_doesincludeval(123)then...end另外,服務(wù)器102可以選擇采用不同于由本文定義的名稱暴露內(nèi)部標(biāo)識符。例如,服務(wù)器102可以選擇更簡單地作為“template”暴露inst_template,并且使后一名稱為其語言中的保留字。
14.3 標(biāo)識符解析規(guī)則定義語言將標(biāo)識符與規(guī)則庫對象,如類、域、實例和字段相關(guān)聯(lián)。服務(wù)器102因而解析對這些對象的名稱引用。
14.3.1 標(biāo)識符范圍用戶可以以分級方式定義對象,例如●規(guī)則庫全局對象○類特定對象■方法特定局部變量○域特定對象
■類特定對象●方法特定局部變量■規(guī)則集特定對象●類特定對象○方法特定局部變量●規(guī)則特定局部變量對象在該分級結(jié)構(gòu)中的位置確定其對對象引用的范圍(可見性)。處于規(guī)則庫級別的對象在整個規(guī)則庫內(nèi)可見于處于規(guī)則庫級別和更低級別的對象。處于域級別的對象在其域內(nèi)可見于處于域級別和更低級別的對象,但是這些對象不可見于其域之外。處于規(guī)則集級別的對象在該規(guī)則集內(nèi)可見于處于規(guī)則集級別和更低級別的對象,但是這些對象不可見于該規(guī)則集之外。處于更低級別的對象“隱藏”處于更高級別的具有相同名稱的對象。因此,名稱為Age的局部變量可以隱藏名稱為Age的類字段。
14.3.2 標(biāo)識符限定用戶一般無需進(jìn)行完全對象引用。用戶可以只需指定足夠的限定符來消除引用的歧義。因此,如果標(biāo)識符Age唯一標(biāo)識類Person的實例Father中的字段,則用戶可簡單地指定age。
如果存在Person的多個靜態(tài)實例,則用戶可以將標(biāo)識符進(jìn)一步限定為father.age。
如果多個同范圍(in-scope)類定義Father對象,則用戶可以將該標(biāo)識符更完全限定為person.father.age。
如果在代碼塊的范圍內(nèi)的多處定義Age,則代碼塊可以通過指定適當(dāng)?shù)南薅ǚ麃硪妹恳粋€對象。
14.4 靜態(tài)和動態(tài)IdentifierSpec元素14.4.1 靜態(tài)指定(specification)靜態(tài)IdentifierSpec的值在推理之前就可被求解,例如agefather.ageperson.father.age
domain1.ruleset1.duck.donald.age。
在一個實施例中,IdentifierSpec可以在允許IdentifierSpec的規(guī)則庫內(nèi)的任何地方被指定為靜態(tài)的。在特定實施例中,路徑不可包括多于五個標(biāo)識符,并且路徑長度影響其解釋。例如,具有五個標(biāo)識符的字段路徑可以假定為采用以下格式<domain_name>.<ruleset_name>.<class_name>.<instance_name>.<field_name>,而三個標(biāo)識符的字段路徑假定為采用以下格式<class_name>.<instance_name>.<field_name>。
14.4.2 動態(tài)指定動態(tài)IdentifierSpec的值在推理期間被求解,例如//名稱為Father的Person實例的配偶的年齡person.father.spouse.age//名稱為Donald的Duck實例的擁有者的年齡domain1.ruleset1.duck.donald.owner.age在一個實施例中,IdentifierSpec可以在規(guī)則或方法邏輯內(nèi)被指定為動態(tài)的。在特定實施例中,這些指定可以為任意長,例如//Employee1(雇員)的管理者的配偶的管理者的配偶的年齡employee1.manager.spouse.manager.spouse.age=32路徑的“尾部”指定兩個或更多字段名稱。在一個實施例中,除了最后字段名稱之外的所有字段名稱標(biāo)識作為實例引用字段而聲明的字段。在上面例子中,標(biāo)識符Manager和Spouse命名實例引用字段。
14.4.2.1 推理行為當(dāng)推理引擎112對動態(tài)指定中的各個字段進(jìn)行求值時,推理引擎112可能遇到未知或空字段值。
14.4.2.1.1 未知字段值的處理如果推理引擎112檢測到未知值,則推理引擎112掛起當(dāng)前執(zhí)行的規(guī)則。
14.4.2.1.2 空字段值的處理如果推理引擎112檢測到具有空值的中間字段,則結(jié)果可能依賴于當(dāng)前上下文。如果當(dāng)前上下文是比較,例如employee1.manager(管理者).age<32//其中employee1.manager=NULL(無管理者)則推理引擎112可以將比較結(jié)果強(qiáng)制為假。如果推理引擎112在比較上下文之外檢測到空值,則推理引擎112以錯誤異常終止推理。在本實施例中,如果Employee1沒有管理者(Employee1.Manager=NULL),則推理引擎112將所有下面比較求值為假employee1.manager.age<32employee1.manager.age>=32employee1.manager.age<>32employee1.manager.age=3215.規(guī)則庫合并規(guī)則庫合并是來自參與規(guī)則庫114或子規(guī)則庫的元素和字段的混合。在一些情況下,合并涉及相同規(guī)則庫內(nèi)具有相同名稱的對象。規(guī)則庫構(gòu)建器110通過在規(guī)則庫級別、約束設(shè)置級別、類級別、域級別和規(guī)則集級別比較對象名稱來合并規(guī)則庫元素。
在給定級別不存在重疊(不存在任何具有相同名稱的元素)的情況下,結(jié)果簡單地是處于那個級別的合并對象的聚合。從而如果一個規(guī)則庫114僅定義名稱為Class1的規(guī)則庫級類,并且另一個規(guī)則庫114僅定義名稱為Class2的規(guī)則庫級類,則合并結(jié)果將反映Class1和Class2兩者。
在存在重疊的情況下,結(jié)果將依賴于所合并的元素和字段。在一些情況下,將存在元素和字段的混合。在其它情況下,僅存在規(guī)則庫114之間的一致性檢查。在任何情況下,下面準(zhǔn)則可以適用。首先,合并結(jié)果僅反映由規(guī)則庫構(gòu)建器110識別的元素和字段,并且可能不包括具有名稱空間前綴或未被識別的元素/字段。第二,可能不試圖合并規(guī)則庫邏輯。對于方法,這意味著只有一個規(guī)則庫元素可定義該方法的實現(xiàn)邏輯。對于規(guī)則,這意味著只有一個規(guī)則庫元素可指定規(guī)則的實現(xiàn)邏輯。對于約束,這意味著只有一個規(guī)則庫元素可指定約束Boolean表達(dá)式。第三,對于給定元素,合并僅反映所發(fā)現(xiàn)的第一LocTag_Attrib。從而,如果第一規(guī)則庫元素指定LocTag_Attrib,則合并結(jié)果反映該字段。否則,結(jié)果將反映第二規(guī)則庫元素的LocTag_Attrib(若有的話)。下面章節(jié)提供可以如何合并規(guī)則庫元素的附加詳細(xì)信息。
15.1 IdentifierSpec元素的合并當(dāng)合并這些元素時,一個元素的指定應(yīng)相同于其它元素,否則是其右側(cè)子路徑。例如,一個元素可能指定Person.Father.Name,并且其它元素可以指定Person.Father.Name、Father.Name或Name。如果指定不相同,則合并結(jié)果可以反映最特定(最長)指定。
15.2 DataType_Element的合并當(dāng)合并這些元素時,每個元素的屬性和子元素應(yīng)當(dāng)與其它元素一致。對于DataTypeNumber_Element,如果Precision_Attrib不同,則合并結(jié)果可以反映兩個精度中的較大者。
15.3 Rulebase_Element的合并合并結(jié)果反映第一元素的Name_Attrib。
15.4 InitMethodDef_Element的合并(在任何級別)合并結(jié)果可以保留多個InitMethodDef_Element,從而如果每個規(guī)則庫元素在給定級別定義一個InitMethodDef_Element,則在那個級別,結(jié)果將為兩個InitMethodDef_Element。每個元素保留其自己的字段和子元素,并且合并的元素應(yīng)當(dāng)具有不同的名稱。如果合并的元素具有相同名稱,則至多一個元素可指定InitMethodBody(方法實現(xiàn))。
15.5 具有相同名稱的Assoc_Element的合并(在任何級別)IdentifierSpec元素可以相互一致。
15.6 具有相同名稱的ConstraintSet_Element的合并(在任何級別)規(guī)則庫構(gòu)建器110可以組合Constraint_Elements。對于具有相同名稱的Constraint_Elements,只有一個元素可指定GeneralExpr。
15.7 具有相同名稱的Class_Elements的合并(在任何級別)如果多個元素指定Parent_Element,則這些指定應(yīng)當(dāng)相互一致。如果任一元素指定Parent_Element,則合并結(jié)果將反映父元素。
對于具有相同名稱的FieldDcl_Elements,ResolutionType_Attribs和DataType_Elements應(yīng)當(dāng)相同。如果一個元素指定“final valued”,但是其它元素未指定,則該元素將為“first valued”。規(guī)則庫構(gòu)建器110可以組合ConstrainerList_Elements的列表。如果兩個元素都指定ConstraintViolation_Elements,則規(guī)則庫構(gòu)建器110可以選擇最受限制的一個(中止元素優(yōu)先于恢復(fù)元素)。
對于具有相同名稱的ClassMethodDef_Elements,方法簽名(除了參數(shù)名之外)應(yīng)當(dāng)一致,但是最多一個元素可指定ClassMethodBody_Element(方法實現(xiàn))。
對于具有相同名稱的StaticInstDef_Elements,規(guī)則庫構(gòu)建器110可以組合LastChanceValue_Elements的任何列表。對于具有相同名稱標(biāo)識符的元素,規(guī)則庫構(gòu)建器110可以僅保留首先找到的LastChanceValue(最后機(jī)會值)。規(guī)則庫構(gòu)建器110對FieldDcl_Elements處理約束。
15.8 具有相同名稱的Domain_Elements的合并如果任一元素與客戶端應(yīng)用程序122共享,則結(jié)果將被共享。否則,結(jié)果將不被共享。如果兩個元素都指定DomainGoal_Element,則目標(biāo)應(yīng)當(dāng)具有一致值。如果任一元素指定目標(biāo),則合并結(jié)果反映該目標(biāo)。
如果任一元素指定DomainAppSharedFlds_Element,則結(jié)果可以反映DomainAppSharedFlds_Element。如果兩個都指定一個,則可以合并子元素,但是相同標(biāo)識符不應(yīng)當(dāng)最終既作為DomainPreConditionList_Element又作為DomainPostConditionList_Element。
對于具有相同名稱的Ruleset_Elements,如果一個元素指定Post_Attrib為“conditional(有條件的)”但是另一個未指定,則該元素將是“unconditional(無條件的)”。如果任一元素與應(yīng)用程序共享,則結(jié)果將被共享。否則,結(jié)果將不被共享。規(guī)則庫構(gòu)建器110組合Rule_Element子元素,但是可以禁止具有相同名稱的Rule_Elements。
16.內(nèi)部標(biāo)識符規(guī)則定義語言引用內(nèi)部標(biāo)識符。下面是采用中綴語言給出的內(nèi)部標(biāo)識符的例子。在這些例子中,中綴語言要求每個內(nèi)部標(biāo)識符以“@”前綴指定。
16.1 符號引用16.1.1 scope(范圍)global(全局)該標(biāo)識符是對規(guī)則庫范圍級別的符號引用。例如,它可以有用于區(qū)分規(guī)則庫級Class1與域級Class1。該標(biāo)識符可例如通過下列代碼被指定為標(biāo)識符路徑內(nèi)的第一標(biāo)識符@scope_global.class1.instance1.fld1=3。
16.1.2 scope_currclass該標(biāo)識符是對執(zhí)行方法的當(dāng)前類的符號引用。例如,它可以有用于區(qū)分實例xyz與局部變量xyz。該標(biāo)識符可在方法邏輯而非規(guī)則邏輯內(nèi)、例如通過下列代碼被指定為標(biāo)識符路徑內(nèi)的第一標(biāo)識符@scope_currclass.xyz.fld1=3
16.1.3 scope_currinstance該標(biāo)識符是對執(zhí)行方法的當(dāng)前實例的符號引用。例如,它可以有用于區(qū)分字段xyz與局部變量xyz。該標(biāo)識符可在方法邏輯而非規(guī)則邏輯內(nèi)、例如通過下列代碼被指定為標(biāo)識符路徑內(nèi)的第一標(biāo)識符,例如@scope_currinstance.xyz=316.1.4 candidate(候選)value該標(biāo)識符是對字段的建議新值的符號引用。該標(biāo)識符可在約束Boolean表達(dá)式內(nèi)、例如通過下列代碼指定@candiate_value>=0 or@candidate_value<=max_age16.2 內(nèi)部對象16.2.1 inst_template該標(biāo)識符是對與所有類相關(guān)聯(lián)的內(nèi)部實例的引用。它用作動態(tài)實例創(chuàng)建的模型。規(guī)則或方法初始化模板字段,以反映新動態(tài)實例的期望字段。模板實例是具有受限使用的實例的特殊形式,因為它們是只寫實例。規(guī)則庫邏輯可以僅為模板字段設(shè)置值,但是不通過模板實例讀取模板字段或調(diào)用方法。同樣地,模板實例可以不具有任何推理作用,例如用于模式匹配。一個示例使用是//創(chuàng)建Duck@inst_reset(duck.@inst_template) //將字段復(fù)位為未知狀態(tài)//初始化模板字段duck.@inst_template.age=4...//初始化附加字段//創(chuàng)建新實例@inst_make(duck)16.3引擎級方法16.3.1 engn_startchain該標(biāo)識符是初始化(或重新啟動)當(dāng)前域上下文的推理的內(nèi)部方法。一個例子是rcInfer=@engn_startchain()如果推理引擎112已經(jīng)在當(dāng)前域上推理,則推理引擎112可以用錯誤中止該操作。該方法返回代碼表示engn_stopchain()返回代碼(若有的話)。如果推理正常終止(沒有engn_stopchain執(zhí)行),則返回代碼為零。
16.3.2 engn_stopchain該標(biāo)識符是立即中止當(dāng)前域上下文的推理的內(nèi)部方法。如果推理引擎112當(dāng)前不在當(dāng)前域上推理,則推理引擎112可以用錯誤中止該操作。該標(biāo)識符還指定將作為推理返回代碼而返回的數(shù)值。按照慣例,該值可以為非零,因為當(dāng)推理正常終止時,推理引擎112返回零。在任何情況下,推理可以立即終止而不完成當(dāng)前規(guī)則操作。如果該操作調(diào)用了方法,并且它們之一調(diào)用engn_stopchain(),則那個方法和所有動態(tài)前輩方法也立即終止。一個示例使用是@engn_stopchain(-123)16.3.2 engn_tracemsg該標(biāo)識符是將文本消息發(fā)送到應(yīng)用程序的MessageHandler(消息處理程序)或MessageArray(消息數(shù)組)對象(若有的話)的內(nèi)部方法。如果客戶端應(yīng)用程序122沒有定義任何這些對象,則推理引擎112可以忽略engn_tracemsg()的調(diào)用。一個示例使用是@engn_tracemsg(″In Rule1;father age=″& father.age)16.4 域級方法16.4.1 dmn_push該標(biāo)識符是裝載指定子推理域的內(nèi)部方法。如果指定域已經(jīng)被裝載(推入),則推理引擎112可以用錯誤中止該操作。一個示例使用是@dmn_push(DomainX)16.4.2 dmn_pop該標(biāo)識符是卸載當(dāng)前子推理域的內(nèi)部方法。如果當(dāng)前沒有裝載任何域,則推理引擎112可以用錯誤中止該操作。一個示例使用是@dmn_pop()16.5 實例級方法16.5.1 inst_make該標(biāo)識符是從實例模板創(chuàng)建動態(tài)實例的內(nèi)部方法。它根據(jù)模板實例的當(dāng)前字段值創(chuàng)建實例。規(guī)則庫邏輯可以通過以由所有實例共享的字段值初始化模板實例一次然后調(diào)用inst_make()多次,從而創(chuàng)建多個類似的實例,其中每次修改實例特定差異的模板字段值。
16.5.2 inst_reset該標(biāo)識符是將指定實例的所有字段復(fù)位為未知狀態(tài)的內(nèi)部方法。一個示例使用是@inst_reset(class1.instance1)16.5.3 inst_delete該標(biāo)識符是刪除指定動態(tài)實例的內(nèi)部方法。在一個實施例中,任何種類的規(guī)則可創(chuàng)建動態(tài)實例,但是只有模式匹配規(guī)則可刪除它們。一個示例使用是forany duck dif//鴨子是老鴨子d.getage()>=100then@inst_delete(d)end16.5.4 inst_getname該標(biāo)識符是返回指定實例的名稱的內(nèi)部方法。對于靜態(tài)實例,返回名稱是帶“.”分隔符的完全限定名稱,例如“Domain1.Ruleset1.Person.Father”對于動態(tài)實例,實例標(biāo)識符反映索引值,例如“Domain1.Ruleset1.Person(23)”一個示例使用是strName=@inst_getname(person1.spouse)16.6字段級方法(所有字段)16.6.1 fld_isknown該標(biāo)識符是測試指定字段的可知性狀態(tài)的內(nèi)部方法。如果該字段目前處于KNOWN(已知)狀態(tài),該方法返回BooleanTRUE值。否則,當(dāng)前活動規(guī)則將掛起,直到該字段達(dá)到已知狀態(tài)。一個示例使用是if@fld_sknown(instance1.fld1)then...end16.6.2 fld_isunknown
該標(biāo)識符是測試指定字段的可知性狀態(tài)的內(nèi)部方法。如果該字段目前處于已知狀態(tài),該方法返回Boolean FALSE值。否則,該方法返回Boolean TRUE值。一個示例使用是if@fld_isunknown(instance1.fld1)then...end16.6.3 fld_reset該標(biāo)識符是將指定字段復(fù)位為UNKNOWN(未知)狀態(tài)的內(nèi)部方法。一個示例使用是@fld_reset(class1.instance1.fld1)16.7字段級方法(特定于集合)16.7.1 set_addval該標(biāo)識符是將指定值添加到集合的內(nèi)部方法。如果集合已經(jīng)包含該值,則該操作沒有任何效果。指定值與集合可以是類型兼容的。一個示例使用是@set_addval(set1,123)16.7.2 set_doesincludeval該標(biāo)識符是測試Set(集合)是否已經(jīng)包含指定值的內(nèi)部方法。如果集合確實包含該值,則該方法返回Boolean TRUE值。否則,它返回Boolean FALSE值。指定值與集合可以是類型兼容的。一個示例使用是if@set_doesincludeval(set1,123)then...end16.7.3 set_removeval該標(biāo)識符是從集合中刪除指定值的內(nèi)部方法。結(jié)果,集合保持不變,變成本身的子集,或者變成空集合。指定值與集合可以是類型兼容的。一個示例使用是@set_removeval(set1,123)16.7.4 set_mergeset該標(biāo)識符是合并指定集合與基本集合的內(nèi)部方法。如果指定集合為空,則該操作沒有任何效果。指定集合與基本集合可以是類型兼容的。一個示例使用是@set_mergeset(set1,set2)//將set2合并到set1中16.7.5 set_excludeset該標(biāo)識符是從基本集合中刪除指定集合值的內(nèi)部方法。結(jié)果,基本集合保持不變,變成本身的子集,或者變成空集合。指定集合與基本集合可以是類型兼容的。一個示例使用是@set_excludeset(set1,set(123,456))/從set1中刪除值16.7.6 set_intersect該標(biāo)識符是對指定集合與基本集合求交集的內(nèi)部方法。結(jié)果,基本集合保持不變,變成本身的子集,或者變成空集合。指定集合與基本集合可以是類型兼容的。一個示例使用是@set_intersect(set1,set(123,456))//可能修改set116.7.7 set_doesintersect該標(biāo)識符是測試指定集合是否與基本集合存在交集的內(nèi)部方法。如果集合共享任何值,則該方法返回Boolean TRUE值。否則,它返回Boolean FALSE值。指定集合與基本集合可以是類型兼容的。一個示例使用是if@set_doesintersect(set1,set2)then...end16.7.8 set_getsize該標(biāo)識符是返回表示集合中的元素數(shù)的Number值的內(nèi)部方法。如果集合為空,則該方法返回零。一個示例使用是var cElements is number=@set_getsize(set1)16.8字段級方法(特定于String)16.8.1 string_getlength該標(biāo)識符是返回表示String長度的Number值的內(nèi)部方法。如果String為空,則該方法返回零。一個示例使用是var cChars is number=@string_getlength(string1)16.9 規(guī)則集級方法16.9.1 rulseset_postrules該標(biāo)識符是將指定規(guī)則集的規(guī)則張貼到當(dāng)前域上下文的議程的內(nèi)部方法。指定規(guī)則集可以具有“conditional”的Post_Attrib值。一個示例使用是@ruleset_postrules(domain1.ruleset1)雖然本發(fā)明是按照優(yōu)選實施例和一般關(guān)聯(lián)方法來描述的,但是優(yōu)選實施例和方法的變更和置換對于本領(lǐng)域的技術(shù)人員而言將是明顯的。因此,上面對優(yōu)選示例性實施例的描述不限定或約束本發(fā)明。在不脫離由所附權(quán)利要求限定的本發(fā)明的精神和范圍的情況下,還可以進(jìn)行其它改變、替換和變更。
權(quán)利要求
1.一種用于提供推理服務(wù)的方法,包括接收指定域的多條規(guī)則;識別至少一個與這些規(guī)則相關(guān)聯(lián)的前置條件,每個前置條件表示用于執(zhí)行規(guī)則的輸入;識別至少一個與這些規(guī)則相關(guān)聯(lián)的后置條件,每個后置條件表示來自規(guī)則執(zhí)行的輸出;接收對應(yīng)于所識別前置條件的輸入值;以及使用輸入值執(zhí)行這些規(guī)則的至少一部分,以產(chǎn)生輸出值,該輸出值對應(yīng)于所識別的后置條件。
2.如權(quán)利要求1所述的方法,其中這些規(guī)則包括第一規(guī)則;并且第一規(guī)則之一通過從補(bǔ)充規(guī)則庫裝載第二域來調(diào)用子推理,其中第二域的規(guī)則上的推理在第一規(guī)則的執(zhí)行恢復(fù)之前結(jié)束。
3.如權(quán)利要求1所述的方法,其中這些規(guī)則包括第一規(guī)則;并且第一規(guī)則之一通過從第一規(guī)則庫裝載第二域來調(diào)用子推理,其中第二域的規(guī)則上的推理在第一規(guī)則的執(zhí)行恢復(fù)之前結(jié)束。
4.如權(quán)利要求1所述的方法,其中這些規(guī)則包括第一規(guī)則;并且還包括在第一規(guī)則的執(zhí)行結(jié)束之后執(zhí)行多條第二規(guī)則,其中第二規(guī)則的執(zhí)行使用來自第一規(guī)則的輸出值,作為第二規(guī)則的輸入值。
5.如權(quán)利要求1所述的方法,還包括將字段標(biāo)識為可撤消字段;將不可撤消值賦給該可撤消字段;將一個或多個可撤消值賦給該可撤消字段;以及將該可撤消字段撤消回到該不可撤消值。
6.如權(quán)利要求1所述的方法,還包括在規(guī)則執(zhí)行開始之后,使用第一通信處理程序接收第二輸入值;以及在規(guī)則執(zhí)行結(jié)束之前,使用第二通信處理程序傳送輸出值。
7.如權(quán)利要求1所述的方法,還包括接收標(biāo)識第一字段的信息;識別將最終值賦給第一字段的第一規(guī)則;識別導(dǎo)致第一規(guī)則觸發(fā)的第二字段;以及識別將最終值賦給第二字段的第二規(guī)則。
8.如權(quán)利要求1所述的方法,其中執(zhí)行這些規(guī)則的至少一部分包括確定是觸發(fā)、舍棄還是掛起決策樹規(guī)則。
9.如權(quán)利要求8所述的方法,其中掛起決策樹規(guī)則包括識別導(dǎo)致決策樹規(guī)則掛起的二進(jìn)制語句;并且還包括使決策樹規(guī)則解除掛起,并且在導(dǎo)致決策樹規(guī)則掛起的二進(jìn)制語句處重新啟動執(zhí)行。
10.如權(quán)利要求1所述的方法,其中執(zhí)行這些規(guī)則的至少一部分包括當(dāng)執(zhí)行規(guī)則時實施單調(diào)推理。
11.如權(quán)利要求1所述的方法,其中這些規(guī)則影響最終定值字段,其中可將多個值賦給最終定值字段。
12.如權(quán)利要求1所述的方法,還包括將包含規(guī)則的規(guī)則庫的只讀映像存儲在存儲器中;以及將輸入和輸出值存儲在存儲器內(nèi)的客戶端特定信息塊中。
13.如權(quán)利要求1所述的方法,其中執(zhí)行這些規(guī)則的至少一部分包括確定由于沒有特定字段的第二輸入值而不能完成執(zhí)行;并且還包括使用初始化處理程序和包含規(guī)則的規(guī)則庫中的至少之一接收第二輸入值,初始化處理程序用于從用戶或應(yīng)用程序接收第二輸入值,規(guī)則庫用于識別特定字段的最后機(jī)會值。
14.如權(quán)利要求1所述的方法,其中執(zhí)行這些規(guī)則的至少一部分包括確定賦給字段的值是否違反約束;并且還包括如果賦給該字段的值違反約束,則執(zhí)行由該字段定義的違例操作。
15.如權(quán)利要求14所述的方法,其中違例操作包括終止規(guī)則執(zhí)行、將替換值賦給該字段、和使用初始化處理程序請求替代值中的至少之一。
16.如權(quán)利要求1所述的方法,其中這些規(guī)則形成二進(jìn)制規(guī)則庫中的指定域的至少一部分,該域標(biāo)識前置條件和后置條件。
17.如權(quán)利要求16所述的方法,其中規(guī)則庫包括一個或多個定義規(guī)則的編譯XML文檔。
18.如權(quán)利要求1所述的方法,其中執(zhí)行這些規(guī)則的至少一部分包括前向鏈接或后向鏈接這些規(guī)則。
19.如權(quán)利要求1所述的方法,還包括生成規(guī)則快照,規(guī)則快照標(biāo)識規(guī)則之一的當(dāng)前狀態(tài)以及導(dǎo)致該規(guī)則掛起的、與該規(guī)則相關(guān)聯(lián)的任何字段。
20.如權(quán)利要求1所述的方法,其中執(zhí)行這些規(guī)則的至少一部分包括使用推理引擎對象執(zhí)行這些規(guī)則的至少一部分。
21.如權(quán)利要求20所述的方法,其中推理引擎對象包括無狀態(tài)推理引擎對象或有狀態(tài)推理引擎對象。
22.如權(quán)利要求1所述的方法,其中接收多條規(guī)則包括接收與這些規(guī)則相關(guān)聯(lián)的位置;訪問該位置;以及從所訪問的位置檢索規(guī)則。
23.一種用于提供推理服務(wù)的系統(tǒng),包括存儲器,用于存儲指定域的多條規(guī)則;以及一個或多個處理器,共同用于識別與這些規(guī)則相關(guān)聯(lián)的前置條件,前置條件表示用于執(zhí)行規(guī)則的輸入;識別與這些規(guī)則相關(guān)聯(lián)的后置條件,后置條件表示來自規(guī)則執(zhí)行的輸出;接收對應(yīng)于前置條件的輸入值;以及使用輸入值執(zhí)行這些規(guī)則的至少一部分以產(chǎn)生輸出值,輸出值對應(yīng)于后置條件。
24.如權(quán)利要求23所述的系統(tǒng),其中這些規(guī)則包括形成第一規(guī)則庫的至少一部分的第一規(guī)則;第一規(guī)則之一通過從補(bǔ)充規(guī)則庫裝載第二域來調(diào)用子推理,其中第二域的規(guī)則上的推理在第一規(guī)則的執(zhí)行恢復(fù)之前結(jié)束。
25.如權(quán)利要求23所述的系統(tǒng),其中這些規(guī)則包括第一規(guī)則;并且第一規(guī)則之一通過從第一規(guī)則庫裝載第二域來調(diào)用子推理,其中第二域的規(guī)則上的推理在第一規(guī)則的執(zhí)行恢復(fù)之前結(jié)束。
26.如權(quán)利要求23所述的系統(tǒng),其中這些規(guī)則包括第一規(guī)則;并且所述一個或多個處理器還共同用于在第一規(guī)則的執(zhí)行結(jié)束之后執(zhí)行多條第二規(guī)則,其中第二規(guī)則的執(zhí)行使用來自第一規(guī)則的輸出值作為第二規(guī)則的輸入值。
27.如權(quán)利要求23所述的系統(tǒng),其中所述一個或多個處理器還共同用于將字段標(biāo)識為可撤消字段;將不可撤消值賦給該可撤消字段;將一個或多個可撤消值賦給該可撤消字段;以及將該可撤消字段撤消回到該不可撤消值。
28.如權(quán)利要求23所述的系統(tǒng),其中所述一個或多個處理器還共同用于接收標(biāo)識第一字段的信息;識別將最終值賦給第一字段的第一規(guī)則;識別導(dǎo)致第一規(guī)則觸發(fā)的第二字段;以及識別將最終值賦給第二字段的第二規(guī)則。
29.如權(quán)利要求23所述的系統(tǒng),其中所述一個或多個處理器還共同用于通過以下操作執(zhí)行這些規(guī)則的至少一部分確定是觸發(fā)、舍棄還是掛起決策樹規(guī)則,其中掛起決策樹規(guī)則包括識別導(dǎo)致決策樹規(guī)則掛起的二進(jìn)制語句;以及使決策樹規(guī)則解除掛起,并且在導(dǎo)致決策樹規(guī)則掛起的二進(jìn)制語句處重新啟動執(zhí)行。
30.如權(quán)利要求23所述的系統(tǒng),其中所述一個或多個處理器共同用于通過確定由于沒有特定字段的第二輸入值而不能完成執(zhí)行,來執(zhí)行這些規(guī)則的至少一部分;并且所述一個或多個處理器還共同用于使用初始化處理程序和包含規(guī)則的規(guī)則庫中的至少之一接收第二輸入值,初始化處理程序用于從用戶或應(yīng)用程序接收第二輸入值,規(guī)則庫用于識別特定字段的最后機(jī)會值。
31如權(quán)利要求23所述的系統(tǒng),其中所述一個或多個處理器共同用于通過確定賦給字段的值是否違反約束來執(zhí)行這些規(guī)則的至少一部分;并且所述一個或多個處理器還共同用于如果賦給該字段的值違反約束,則執(zhí)行由該字段定義的違例操作。
32.如權(quán)利要求23所述的系統(tǒng),其中所述一個或多個處理器還共同用于生成規(guī)則快照,規(guī)則快照標(biāo)識規(guī)則之一的當(dāng)前狀態(tài)以及導(dǎo)致該規(guī)則掛起的、與該規(guī)則相關(guān)聯(lián)的任何字段。
33.一種包含在至少一個計算機(jī)可讀介質(zhì)上的邏輯,在執(zhí)行時用于識別與指定域的多條規(guī)則相關(guān)聯(lián)的前置條件,前置條件表示用于執(zhí)行規(guī)則的輸入;識別與這些規(guī)則相關(guān)聯(lián)的后置條件,后置條件表示來自規(guī)則執(zhí)行的輸出;接收對應(yīng)于前置條件的輸入值;以及使用輸入值執(zhí)行這些規(guī)則的至少一部分以產(chǎn)生輸出值,輸出值對應(yīng)于后置條件。
34.一種用于提供推理服務(wù)的系統(tǒng),包括用于識別與指定域的多條規(guī)則相關(guān)聯(lián)的前置條件的裝置,其中前置條件表示用于執(zhí)行規(guī)則的輸入;用于識別與這些規(guī)則相關(guān)聯(lián)的后置條件的裝置,其中后置條件表示來自規(guī)則執(zhí)行的輸出;用于接收對應(yīng)于前置條件的輸入值的裝置;以及用于使用輸入值執(zhí)行這些規(guī)則的至少一部分以產(chǎn)生輸出值的裝置,其中輸出值對應(yīng)于后置條件。
35.一種用于提供推理服務(wù)的方法,包括將指定域的多條規(guī)則傳送到推理引擎,這些規(guī)則與前置條件和后置條件相關(guān)聯(lián),前置條件表示在執(zhí)行規(guī)則中由推理引擎使用的輸入,后置條件表示來自規(guī)則執(zhí)行的輸出;將對應(yīng)于前置條件的輸入值傳送到推理引擎;以及從推理引擎接收輸出值,輸出值對應(yīng)于后置條件。
36.如權(quán)利要求35所述的方法,其中將多條規(guī)則傳送到推理引擎包括將二進(jìn)制規(guī)則庫和規(guī)則庫位置的至少之一傳送到推理引擎。
37.如權(quán)利要求36所述的方法,其中規(guī)則庫位置包括統(tǒng)一資源定位符(URL)。
38.如權(quán)利要求35所述的方法,其中輸出值包括多個輸出值之一;推理引擎包括無狀態(tài)推理引擎;并且還包括將控制對象傳送到推理引擎,控制對象標(biāo)識推理引擎是否生成各自標(biāo)識輸出值之一的多個輸出消息、標(biāo)識所有輸出值的輸出文檔、以及規(guī)則快照的至少之一,規(guī)則快照標(biāo)識規(guī)則之一的當(dāng)前狀態(tài)以及導(dǎo)致該規(guī)則掛起的、與該規(guī)則相關(guān)聯(lián)的任何字段。
39.如權(quán)利要求35所述的方法,其中輸出值包括多個輸出值之一;推理引擎包括有狀態(tài)推理引擎;并且還包括調(diào)用推理引擎中的至少一個函數(shù),該至少一個函數(shù)用于以下項的至少之一識別輸出值之一,識別所有輸出值,生成規(guī)則快照,識別求解出輸出值之一的規(guī)則,將可撤消值賦給由規(guī)則使用的字段,將不可撤消值賦給由規(guī)則使用的字段,以及撤消由規(guī)則使用的字段的值,其中規(guī)則快照標(biāo)識規(guī)則之一的當(dāng)前狀態(tài)以及導(dǎo)致該規(guī)則掛起的、與該規(guī)則相關(guān)聯(lián)的任何字段。
40.一種用于提供推理服務(wù)的方法,包括接收指定域的多條第一規(guī)則,這些規(guī)則包括第一規(guī)則庫的至少一部分;將第一規(guī)則裝載到存儲器中;接收包括第二規(guī)則的補(bǔ)充規(guī)則庫;在存儲器中組合第二規(guī)則與第一規(guī)則;以及執(zhí)行第一和第二規(guī)則的至少一部分,以產(chǎn)生輸出值。
41.如權(quán)利要求40所述的方法,還包括接收包括第三規(guī)則的第二補(bǔ)充規(guī)則庫;在存儲器中組合第三規(guī)則與第一規(guī)則;以及執(zhí)行第一和第三規(guī)則的至少一部分,以產(chǎn)生第二輸出值。
42.如權(quán)利要求40所述的方法,其中第二規(guī)則僅在由第一規(guī)則庫定義的數(shù)據(jù)對象上操作。
43.如權(quán)利要求40所述的方法,其中當(dāng)?shù)诙?guī)則與第一規(guī)則沖突時,第一規(guī)則庫識別是否能使用第二規(guī)則。
44.如權(quán)利要求40所述的方法,其中第一規(guī)則庫和補(bǔ)充規(guī)則庫包括二進(jìn)制規(guī)則庫。
45.一種用于提供推理服務(wù)的系統(tǒng),包括存儲器,用于存儲指定域的多條第一規(guī)則,該多條第一規(guī)則包括第一規(guī)則庫的至少一部分;以及一個或多個處理器,共同用于接收包括第二規(guī)則的補(bǔ)充規(guī)則庫;在存儲器中組合第二規(guī)則與第一規(guī)則;以及執(zhí)行第一和第二規(guī)則的至少一部分,以產(chǎn)生輸出值。
46.如權(quán)利要求45所述的系統(tǒng),其中第二規(guī)則僅在由第一規(guī)則庫定義的數(shù)據(jù)對象上操作。
47.如權(quán)利要求45所述的系統(tǒng),其中當(dāng)?shù)诙?guī)則與第一規(guī)則沖突時,第一規(guī)則庫識別是否能使用第二規(guī)則。
48.如權(quán)利要求45所述的系統(tǒng),其中第一規(guī)則庫和補(bǔ)充規(guī)則庫包括二進(jìn)制規(guī)則庫。
49.一種包含在至少一個計算機(jī)可讀介質(zhì)上的邏輯,在執(zhí)行時用于接收指定域的多條第一規(guī)則,該多條第一規(guī)則包括第一規(guī)則庫的至少一部分;將第一規(guī)則裝載到存儲器中;接收包括第二規(guī)則的補(bǔ)充規(guī)則庫;在存儲器中組合第二規(guī)則與第一規(guī)則;以及執(zhí)行第一和第二規(guī)則的至少一部分,以產(chǎn)生輸出值。
50.一種用于提供推理服務(wù)的方法,包括將指定域的多條第一規(guī)則傳送到推理引擎,該多條第一規(guī)則包括第一規(guī)則庫的至少一部分;將包括第二規(guī)則的補(bǔ)充規(guī)則庫傳送到推理引擎;使推理引擎在存儲器中組合第二規(guī)則與第一規(guī)則;以及從推理引擎接收輸出值,推理引擎用于執(zhí)行第一和第二規(guī)則的至少一部分以產(chǎn)生輸出值。
51.如權(quán)利要求50所述的方法,其中將多條第一規(guī)則傳送到推理引擎包括將包含第一規(guī)則的二進(jìn)制規(guī)則庫和包含第一規(guī)則的規(guī)則庫的位置的至少之一傳送到推理引擎。
52.一種用于提供推理服務(wù)的方法,包括執(zhí)行指定域的多條規(guī)則中的至少一部分,這些規(guī)則的至少之一包括表達(dá)式;當(dāng)求解這些規(guī)則之一中的表達(dá)式所需的字段具有未知值時,掛起該規(guī)則;識別與導(dǎo)致決策樹規(guī)則掛起的表達(dá)式相關(guān)聯(lián)的二進(jìn)制語句;將已知值賦給導(dǎo)致該規(guī)則掛起的字段;使該規(guī)則解除掛起;以及在識別出的二進(jìn)制語句處重新啟動該規(guī)則的執(zhí)行。
53.如權(quán)利要求52所述的方法,其中這些規(guī)則的至少之一包括決策樹規(guī)則,決策樹規(guī)則中的表達(dá)式將決策樹規(guī)則分成至少兩個子樹。
54.一種用于提供推理服務(wù)的系統(tǒng),包括存儲器,用于存儲指定域的多條規(guī)則,這些規(guī)則的至少之一包括表達(dá)式;以及一個或多個處理器,共同用于執(zhí)行這些規(guī)則的至少一部分;當(dāng)求解這些規(guī)則之一中的表達(dá)式所需的字段具有未知值時,掛起該規(guī)則;識別與導(dǎo)致決策樹規(guī)則掛起的表達(dá)式相關(guān)聯(lián)的二進(jìn)制語句;將已知值賦給導(dǎo)致該規(guī)則掛起的字段;使該規(guī)則解除掛起;以及在識別出的二進(jìn)制語句處重新啟動該規(guī)則的執(zhí)行。
55.如權(quán)利要求54所述的系統(tǒng),其中這些規(guī)則的至少之一包括決策樹規(guī)則,決策樹規(guī)則中的表達(dá)式將決策樹規(guī)則分成至少兩個子樹。
56.一種包含在至少一個計算機(jī)可讀介質(zhì)上的邏輯,在執(zhí)行時用于執(zhí)行指定域的多條規(guī)則中的至少一部分,這些規(guī)則的至少之一包括表達(dá)式;當(dāng)求解這些規(guī)則之一中的表達(dá)式所需的字段具有未知值時,掛起該規(guī)則;識別與導(dǎo)致決策樹規(guī)則掛起的表達(dá)式相關(guān)聯(lián)的二進(jìn)制語句;將已知值賦給導(dǎo)致該規(guī)則掛起的字段;使該規(guī)則解除掛起;以及在識別出的二進(jìn)制語句處重新啟動該規(guī)則的執(zhí)行。
全文摘要
一種用于提供推理服務(wù)的方法,包括接收指定域的多條規(guī)則。該方法還包括識別與這些規(guī)則相關(guān)聯(lián)的前置條件和與這些規(guī)則相關(guān)聯(lián)的后置條件。前置條件表示用于執(zhí)行規(guī)則的輸入,而后置條件表示來自規(guī)則執(zhí)行的輸出。該方法還包括接收對應(yīng)于前置條件的輸入值。另外,該方法包括使用輸入值執(zhí)行這些規(guī)則的至少一部分,以產(chǎn)生輸出值。輸出值對應(yīng)于后置條件。
文檔編號G06N5/02GK1659589SQ03813434
公開日2005年8月24日 申請日期2003年4月18日 優(yōu)先權(quán)日2002年4月19日
發(fā)明者彼得·J·赫雷拉, 羅納德·卡斯, 柯克·D·威爾遜, 伊特-本·坦 申請人:電腦聯(lián)合想象公司