Jess 7.2p2——Java平台规则引擎官方文档翻译1
Jess 7.2p2——Java平臺規則引擎官方文檔翻譯1
本博客轉載自本體小本營。
1.入門
1.1.需求
在使用Jess前請先確認JVM是否正確安裝并能正常工作。
使用JessDE集成開發環境,你需要Eclipse SDK的3.1版或更新版本,這個可以從http://www.eclipse.org獲得。安裝JessDE前請確認Eclipse是已經安裝并能正常工作。
Jess類庫為另一種語言擔任譯員,這種語言我在本文檔中稱為Jess語言。Jess語言是一種高度專業化的Lisp形式語言。
我會認為讀者你是將使用這兩種或其中一種語言的一個程序員。并且所有的讀者都至少有起碼Java基礎。另外你必須有一個Java運行系統和知道如何以一個簡單的方法使用這個系統。你應該知道如何用它來:
運行一個Java應用程序
處理如CLASSPATH變量的配置問題
編譯Java源文件集(可選)
如果你沒有對Java的環境有基本的熟悉,那么我建議你購買了關于java的基礎的書籍。對與各種平臺的Java軟件以及豐富的教程和文檔可以免費從http://java.sun.com上獲得。
對于那些將要使用jess語言編寫程序的讀者,我假定你們已經熟悉了一般程序編寫的原理。我會說明整個Jess語言,所以熟悉Lisp是不需要(雖然熟悉是有些用的)。此外,在可能范圍內,我將努力說明基于規則系統的最重要的概念,因為它們適用于Jess。再次,我將假定讀者對這些概念有了一定的熟悉程度和了解更多。如果不熟悉基于規則系統,你也許應當考慮購買一本關于這一主題的書籍。
許多讀者都希望提高Jess的能力,無論是通過向Jess語言加入的命令(用JAVA語言寫)或以Java應用的方式嵌入Jess庫。另外一些人會想用Jess語言的Java集成能力來從Jess語言程序調用Java函數。在本文檔專門針對這類讀者的一些章節中,我將承擔適度Java編程的知識。我不會教Java語言任何方面的知識,有興趣的讀者可到您當地的書店參閱相關書籍。
這個文檔包含了一個目錄,在很多書上這些主題也都被列舉出來。
1.2.準備
1.2.1.安裝包的組成
Jess提供一個可用于所有支持平臺的單獨的.zip壓縮包。這個單獨的文件壓縮包包含在Windows,UNIX,或Macintosh系統上使用Jess的所有你需要(除了JVM你必須自己安裝)的資源。當Jess是解壓后,你應該有一個命名為jess71a2 /的目錄。在這個目錄路徑有下列文件和子目錄:
README 快速開始指導.
LICENSE 關于Jess使用的您的權利信息.
bin 一個包含Windows 批處理文件(jess.bat)和一個UNIX腳本(Jess)的目錄,你可以使用它們啟動Jess命令提示符.
lib 該目錄含有作為一個Java檔案文件的Jess本身。注意,這不是一個“點擊”存檔文件,你不可以通過雙擊它運行Jess。這是要注意的。在這個目錄的jsr94.jar包中又包含了符合JSR - 94 (javax.rules)的API。
docs/ 這是一個文檔,以“index.html”為首頁的Jess手冊。.
examples/jess 一個包含使用Jess語言編寫的小程序的目錄.
examples/xml 一個包含使用JessML, Jess’s XML規則語言編寫的小程序的目錄.
eclipse JessDE, 是Jess集成開發環境, 提供支持Eclipse 3.0的插件集。看這里的安裝說明。
src (Optional) 如果這個目錄存在,它包含全部的Jess規則引擎和開發環境的源代碼,包括一個構建它的Ant腳本。
1.2.2.命令行界面
Jess有一個交互的命令行界面。分布包括兩個你能運行Jess命令提示符的腳本:其中一個用于Windows,另一個用于UNIX。它們兩個都在bin/ directory目錄下。運行適合你系統的那一個,然后你應該看到以下的界面:
C:\Jess71a2> bin\jess.batJess, the Rule Engine for the Java Platform Copyright (C) 2006 Sandia Corporation Jess Version Jess71a2 9/5/2006Jess>這就是Jess的命令。嘗試計算一個前綴數學表達式”(+ 2 2)”。不要忘記那些括號!
Jess> (+ 2 2)
4
Jess計算了此函數,并打印結果。在這份文檔的下一章,我們會發現Jess規則語言本身的語法。
通過Jess命令行執行Jess代碼編寫的文件,可以使用批處理命令:
Jess> (batch “examples/jess/sticks.clp”)
Who moves first (Computer: c Human: h)?
在前面的例子應注意到,在Jess>提示符后鍵入命令,Jess將在下一行響應命令。我將在整個這本文檔中遵循本約定。
直接從操作系統提示符執行這樣的Jess程序,你可以把程序的名字作為Jess腳本的一個參數,這樣就可以啟動:
C:\Jess71a2> bin\jess.bat examples\jess\sticks.clp
Jess, the Rule Engine for the Java Platform
Copyright (C) 2006 Sandia Corporation
Jess Version Jess71a2 8/28/2006
Who moves first (Computer: c Human: h)?
jess.console類是一個簡單的jess命令行界面的圖形版。你在窗口的底部輸入一個命令,結果就會出現在滾動窗口之上。試著從Jess71a2路徑下鍵入下面命令:
C:\Jess71a2> java -classpath lib\jess.jar jess.Console
1.2.3.Java程序設計語言與Jess
要在你的Java程序中把Jess做為庫使用,文件jess.jar(在lib目錄下)必須是以一個標準的擴展名安裝在類路徑之下,或者對你的開發工具配置后能夠識別它。做好這些工作的細節是隨系統和環境而定的,但在設置一個類路徑時通常涉及修改環境變量,并且安裝一個標準的擴展名,簡單來說就是復制jess.jar到你的$(JAVA_HOME)/jre/lib/ext路徑下。可查閱Java文檔或介紹Java的文本以了解更多的細節。
1.2.4.Jess例子程序
有一些簡單的例子程序(在examples/jess和examples/xml目錄下),您可以用這些程序測試你的Jess是否已經安裝正確。這些程序包括fullmab.clp,zebra.clp和wordgame.clp。fullmab.clp是關于猴子與香蕉問題的經典版本。要從命令行運行它,只需要輸入:
C:\Jess71a2> bin\jess examples\jess\fullmab.clp
和要運行的問題,就會在屏幕上輸出結果。任何Jess代碼的文件都可以以這種方式運行。像使用批處理函數一樣在命令行給一個Jess文件名就可以運行了。因此,一般你只需要保證文件是以:
Jess> (reset)
(run)
結束或根本沒有規則將運行。zebra.clp和wordgame.clp程序是兩個典型的例子,它們是用來展示Jess如何處理復雜情況的程序。這些例子都產生大量的局部模式匹配,因此它們運行非常慢而且使用了大量的內存。另外的例子包括sticks.clp (互動游戲)和frame.clp (一個使用jess的java集成能力建立圖形界面的演示)。
XML的例子在單獨的子目錄下,每個子目錄中都包含有運行例子說明的自述文件。
2.Jess開發環境
Jess 7包括一個基于Eclipse的開發環境。這個開發環境有一個編輯器,一個調試器和一個Rete網絡視圖。在將來發布的版本中將包含更多組件(規則瀏覽器和其它工具)。
2.1.安裝JessDE
Jess開發環境(JessDE)是作為一個插件集支持流行的開源的集成開發環境Eclipse;該插件支持Eclipse 3.1及其更新版本。應該注意的是JessDE僅僅工作在完全的” Eclipse SDK “上——較小的”二進制運行平臺”是不能運行的。
安裝JessDE,首先要退出Eclipse,然后從Jess71a2/eclipse解壓縮所有文件到頂層的Eclipse的安裝路徑。確認在你的eclipse安裝目錄有一個名為” plugins/gov.sandia.jess_7.0.0 “的目錄存在,然后重新啟動Eclipse。
注意!如果你只是從以前的版本的JessDE更新,你必須在Eclipse的命令行使用”-clean “命令開關,強制更新緩存中有關JessDE插件的信息。如果你不這樣做,很多的JessDE的選項可能被禁用,安裝后你只需要這樣做一次。
2.1.1.驗證你的安裝
在“Help”菜單下選擇“about Eclipse SDK”。在” about Eclipse SDK “主窗口有一個有Jess標志的按鈕。單擊“Plug-in Details”,如果JessDE已安裝妥當,你將發現三個或四個Jess相關插件在列表上——在我的Eclipse中,它們出現在底部。
然后使用“New Project”向導建立一個Java工程。在新的工程中創建一個新文件并命名為“hello.clp”。這個文件會在一個Jess的編輯器中打開,這個編輯器有一個帶紅色“J”字的銀色小球的圖標。輸入一些Jess代碼,如下:
(printout t “Hello, World” crlf)
你應該看到合適的語法被高亮顯示。如果看到,祝賀你!工作一切正常!JessDE其他功能的信息。
2.1.2.更多的細節
JessDE編輯器在你的Jess文件中能夠標示出語法錯誤和警告。你很可能希望這些標記能出現在Eclipse的“Problems”視圖中,盡管在默認情況下它們可能沒有顯示出來。安裝完成JessDE后,重新啟動Eclipse,在Problems的視圖,在標題欄點擊“Filters”的圖標,然后選擇標著” Jess Problem “(如果沒有被選中的話)多選項。你的Problems視圖應該馬上就會顯示Jess錯誤和警告。
要使用Rete網絡視圖,你需要安裝Eclipse圖形編輯框架(GEF)。你可以從Eclipse工程項目頁面得到GEF,或通過Eclipse的內置式更新管理器安裝它。然后打開這一視圖,在“Jess Debugger”組之下Eclipse的“Show view”對話框找到它。那么在Jess編輯窗口中當光標停在某一內部規則時,Rete網絡視圖將會為這項規則顯示出編譯的網絡。
2.2.使用JessDE
2.2.1.Jess語言編輯器
JessDE編輯器可以編輯“.clp”格式的文件。在默認情況下你建立的任何 “.clp”格式的文件都將使用JessDE編輯器打開。沒有單獨Jess的視圖,或是Jess項目類型;我們期望大多數人都將使用JessDE工具來寫Jess/Java混合應用組成的Jess程序,因此JessDE工具將用在Java項目的文件中。在Jess語言代碼中JessDE使用你的Java項目的類路徑以解決Java中類名稱問題——例如,調用defclass函數。
編輯器有您期望的一個現代程序編輯器所應具有的全部功能。
可定制的語法變色
你可以使用Eclipse全局參數對話框中的“Jess Editor”表來改變默認的顏色。
提供模板,槽和函數名的幫助內容
在許多不同地方使用JessDE編輯器你可引用Eclipse的” Content Assist “功能;JessDE將使輸入Jess代碼變得更容易。在輸入時可以使用快捷鍵Alt-’ / ‘彈出選擇列表清單。
自動修復代碼的“Quick fix”助手
這個功能默認使用Ctrl-1快捷鍵,快速匹配能立即知道怎樣定義未定義的deftemplates,并為現有的deftemplates(如果它們在相同的文件里被定義)增加新的槽。
實時錯誤檢測標記和錯誤高亮顯示
當你輸入有錯誤和警告時將被高亮顯示
代碼自動格式化
當你輸入時代碼自動縮進。你可以從”Source”菜單下選擇”Format”命令來格式化一個全部的緩沖區
使用大綱視圖快速導航
Eclipse大綱視圖列出了所有在緩沖區中定義的結構;你可以點擊其中任何一個就能夠迅速定位到它
圓括號匹配和自動插入
當你輸入一個’(‘或’”’符號,JessDE就會插入匹配的符號。當你的光標移動到下一個圓括號時,JessDE會顯示與之相匹配的圓括號。
通過懸停獲得Jess函數和結構在線幫助
快速訪問Jess手冊中每一個函數和結構類型的描述。
支持deftemplates 和 deffunctions的懸停幫助
如果你將你的滑鼠移動到一個deftemplate或deffunction的名字上,任何代碼處,JessDE都將顯示一個關于這個模板或函數信息的”tooltip”。
Jess程序的運行和調試命令
你可以使用正常Eclipse 的” Run… “菜單或由右擊導航項或在編輯窗口運行或調試Jess程序。
2.2.2.文件之間的關聯
有時候一個.clp文件依靠其他的.clp文件中的代碼先被閱讀執行。例如,rules.clp 也許需要templates.clp中的定義。沒有這些定義,rules.clp將會出現語法錯誤。為了解決這個問題,你可以使用require*函數。”require*”讓你清楚的聲明這些關聯。
如果一個文件rules.clp依靠在Java中執行的Jess命令,你可以僅僅為了這個目標創建一個特殊的文件處理這個問題(你也許稱之為ruledepends.clp),這個特殊的文件包括了編輯器中使rule.clp文件能夠正確解析的所有聲明。如果你添加”(require* ruledepends)”到rules.clp中,僅當這個外部文件存在的話才會解析,因為它有可能正在開發中。當你部署代碼時,你不需要部署ruledepends.clp,只要rules.clp能夠從Java代碼中取得所需聲明。
“require”機制代替了JessDE的早期版本中的”Source dependencies”屬性表,”Source dependencies”屬性表已不再被支持。
2.2.3.Rete網絡視圖
使用JessDE的”Rete Network View”你可以即時看到一個衍生自任何規則的Rete網的圖形展示。當這個視圖是打開時(你可以使用Eclipse中的”Windows | View | Other…”對話框打開它),它會顯示基于編輯器插字符所在規則的Rete網絡,你可以用這個實時看到修改規則所對應的Rete網絡變化。圖表的布局方式是遠勝于你能從Jess視圖命令中得到的—-因為這樣沒有重疊和交叉線,而且每一列的高度都可變。
2.2.4.Jess調試器
JessDE調試器可以讓你調試一個在.clp文件中定義的Jess程序。它具有您期望的圖形調試器所具有的所有功能:你可以暫停和恢復程序,或以步進方式執行。當程序停止時,執行堆棧的內容將會顯示出來,這樣你就可以檢查在每個堆棧結構中定義的變量。選擇的堆棧結構也可以導航到被執行的源碼處。在編輯器窗口的左手邊緣處,你可以通過右鍵單擊某一規則在任何.clp文件中設置(或清除)斷點。斷點僅能設在函數(內置或用戶自定義)中,所以你不能在defrule 或者deftemplate結構中打斷程序執行。然而,你能夠在一個調用規則 的左邊或右手邊的函數中暫停。
3.Jess 語言基礎
大多數時間你是在使用Jess語言編寫Jess規則。如果你從來沒有使用過Lisp,第一次使用Jess規則語言也許看起來就有點奇怪了,但它并不需要太長時間來學習。回報也是豐厚的,你將使用非常少的代碼表達復雜的邏輯關系。
在這一章,我們將看到Jess語言的基礎語法。在后面的章節中,我們再來學習怎樣定義像事實與規則這樣的高級概念,但現在我們將學習最基礎的。
在本語言指導中,我將使用一個非正規的符號來描述語法。在< >中的基本串是必須提供的數據類型,在方括號中([])的內容是可選的,以 + 結束表示可以出現一次或多次,以 * 結束表示可以出現零次或更多。一般來說, Jess的輸入格式是自由的。換行不具有特殊的含義,僅被處理為空格,而異常將被標識。
3.1.符號
符號是Jess語言的一個核心概念。符號是非常類似于其他語言中的標識符。Jess符號包括字母,數字和下面的標點符號:$*=+/<>_?#.。一個符號不能以數字開始,可以以一些特殊的標點符號開始(這些字符作為操作員當出現在符號開始時有著特殊的意義)
Jess符號對于大小寫敏感。foo,FOO,和Foo是不同的符號。
最佳的符號是由字母,數字,下劃線和破折號組成。破折號是傳統的分隔符。如下所示為合法的符號:
foo first-value contestant#1 _abc
Jess中有三種特殊的符號。零,和java中的空值有點類似;真和假是Jess中的布爾類型的值。
3.2.數字
Jess分別使用Java函數parseInt(java.lang.String), parseLong(java.lang.String)和parseDouble(java.lang.String)來解析整型,長整型和浮點型數字。參考本文檔中關于這些方法精確的語法描述。如下為合法的數字:
3 4. 5.643 5654L 6.0E4 1D
3.3.字符串
Jess中的字符串是用雙引呈來標識的(“).。反斜線能夠區分嵌入的引號。注意Jess的字符串和Java的字符串在一些重要的地方是不一樣的。首先,不會認識轉義序列。比如說你不能用一個”\n”字符串來換行。另一方面,真正的換行可以通過雙引號中的字符串來實現。他們是字符串的一部分。如下為合法的字符串:
“foo” “Hello, World” “\”Nonsense,\” he said firmly.” “Hello,
There”
最后一個字符串相當于Java中的字符串”Hello,\nThere”.。
3.4.列表
Jess中的另一個基礎語法元素是列表。列表是由圓括號和空,符號,數字,字符串和其他列表組成。如下所示為合法的列表:
(+ 3 2) (a b c) (“Hello, World”) () (deftemplate foo (slot bar))
Jess中列表的第一個元素(Lisp中稱為列表的car)通常被稱列表的頭。
3.5.注釋
Jess支持兩種類型的程序注釋。Lisp風格的行注釋和C風格的塊注釋。行注釋是以分號開頭,延伸到文本中本行的最后。這里有一個行注釋的例子:
; This is a list
(a b c)
塊注釋就和他們在C語言中的用法一樣:他們以兩個特征符”/“開始,以”/”結束。塊注釋不能嵌套。
/*
Here is an example of a list (commented out):
(a b c)
*/
注釋可以在Jess程序的任何地方出現,包括模板和規則的結構里。
3.6.函數調用
和Lisp一樣,Jess中的所有代碼(控制結構,分配,程序調用)都是以函數調用的方式進行的。沒有操作器,一切都是函數調用。然而,有些函數的名字使它們看起來像是Java操作器,在這種情況下,它們就和它們的Java 副本工作的非常相似。
Jess中的函數調用可以理解為簡單的列表。函數調用采用前綴表示,如果一個列表的頭部是一個已經存在的函數的符號,那么它就可以稱為是一個函數調用。舉例來說,用+函數來算2和3相加的表達式應該寫為(+ 2 3)。在計算時,這個表達式的結果是數字5(不是一個僅包含數字5的列表!)。通常來說,在合適的時候表達式都被看作是這樣并通過上下文求值。你可以在Jess>提示符后鍵入表達式。Jess計算表達式并打印出結果:
Jess> (+ 2 3)
5
Jess> (+ (+ 2 3) (* 3 3))
14
注意你可以嵌套調用函數;外部函數是形成內部函數調用計算的因素。
Jess自身帶有大量的內置函數,它們可以用來做一切事情,如數學計算,程序控制和字符處理,讓你能夠使用Java的API函數。當然你也可以在Jess語言或者是Java語言中定義自己的函數。
其中一個最經常用的函數是printout,它是用來發送文本到Jess的標準輸出窗口,或者是輸出到一個文件中。完善的解釋你必須等待,但是現在,你所要了解的都包含在下面這個例子中:
另一個常用的函數是batch,它是用來計算一個包含Jess代碼文件的。要運行Jess源文件examples/jess/hello.clp,你可以鍵入:
Jess> (batch "examples/jess/hello.clp") Hello, world!Jess自帶的其他的所有函數的詳細說明都在Jess function guide.。
3.7.變量
Jess中程序變量是以問號開始的標識符。問號也是變量名的一部分。名字可以包括字母,數字,破折號,下劃線,分號和星號的任何組合。
一個變量可以看作是一個簡單的符號,數字,字符串或者是一個列表。你可以用bind函數來為變量指定一個值。
變量在第一次使用前不需要聲明(全局變量除外)。
想在Jess提示符后看到變量 的值,你只需要鍵入變量的名字:
3.7.1.全局變量(默認全局)
你在Jess提示符后或者任何Jess語言程序頂層創建的所有變量, 當重置命令運行的時候都將被清除。這樣就使它們稍嫌短暫,對于暫時性變量它們很好用,在標準理解的前提下不是永久全局變量。要創建不被reset銷毀的全局變量,你可以用全局結構:
(defglobal [? = ]+)
全局變量的名稱必須是以星號開頭以星號結束。合法的全局變量如下:
?a ?all-values ?counter
當全局變量建立以后,它會被初始化賦值。當reset命令隨后執行的時候,這個變量可能會用相同的值重新設置,當然這取決于reset-globals的屬性設置。有一個稱為set-reset-globals的函數可以用來設置這個屬性。如例所示:
您可以閱讀Jess function guide.中有關set-reset-globals和相關的get-reset-globals函數的信息。
3.8.控制流
Java中控制流(分支和循環,異常處理等)都是由一些特殊的語法和關鍵字如if,while,for,和try等來引導的。在Jess中,就如我們前面說過的,所有的一切都是函數調用,控制流也不例外。因此,Jess包含有那些名為if,while,for,和try以及foreach等函數。這些函數就和Java體系中相同名稱的結構工作起來類似。
3.8.1.簡單循環
例如,如下 是Jess中的一個“while”循環示例:
Jess> (bind ?i 3) 3 Jess> (while (> ?i 0)(printout t ?i crlf)(-- ?i)) 3 2 1 FALSEWhile循環的第一個參數是一個布爾表達式。While函數計算它的第一個參數,如果它為真,就計算它所有其他的參數。它一直進行這個過程直到它的線一個參數值為假。一個while循環總是返回FALSE.
Jess中內置有一些其他的循環函數。詳情參看Jess function index.中關于for和foreach的有關描述。Jess中有一個break函數,可以有來跳出循環,也可以很早的從一個規則的右手邊返回.
總結
以上是生活随笔為你收集整理的Jess 7.2p2——Java平台规则引擎官方文档翻译1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ 课程作业 类与对象2——构造函数
- 下一篇: java美元兑换,(Java实现) 美元