jess笔记_(2)
這里,將簡單介紹jess的規(guī)則語言(rule language),不知道翻譯得是否妥當,求指點.
? ?
1.語法基礎:
? ?
1.1.空格(whitespace)
? ?
Jess里面出了在引號里面的空格之外,其他的和c一樣,多了的少了的影響不大.因此,為了美觀,
? ?
? ?
就會寫成
? ?
? ?
1.2.符號(symbols)
? ?
jess的符號(symbols)定義和java的標識符(identifier)是差不多的.在jess里面,字母,數(shù)字,還有這些標點$ * .= + / < > _ ? #是可以作為它的合法符號.符號的開始不可以有數(shù)字,有的標點(? $ =)也是不可以作為符號的開頭的,但是在一些場合(比如這里).而其他的標點就可以用在各種的符號定義開頭上去.
? ?
jess的符號定義是大小寫敏感的(case sensitive).就是說,foo,FOO,Foo,都代表著不同的符號(foo,指程序員用來代表數(shù)據(jù),功能或命令的變量).當然,這些所謂的"符號"都是用來表達變量的,表達到意思而且容易管理就好.像下面的符號,都是合法的.
? ?
? ?
? ?
jess里的其他,和java比較相似.布爾變量就是TRUE和FALSE,nil則是java里的null(空).不過基于大小寫敏感的尿性,TRUE是必須妥妥的大寫的,而nil就要求小寫.而符號crlf,表示的是換行.
? ?
? ?
1.3.jess.Value class
? ?
所有的jess的量,包括數(shù)字,符號,字符串等等,都可以說是一個叫jess.Value 的java類的實例(instance).當要做jess和java交互的時候就需要用上這個類.jess.Value的對象是不可變的,只要創(chuàng)建了出來,它的值就不可以改.你可以用type()來獲取jess.Value對象所包含的數(shù)據(jù)類型.這些值會在jess.RU類(RU是Rete Utilities,Rete是一種算法,可以說是jess的核心.)中作為一系列的常量枚舉出來.上面所說的符號(symbol)也是RU.ATOM中的一種類型.(atom,可以參考這里,這里有著和lisp相似的尿性,可以理解為封裝在RU里面)
? ?
1.4.數(shù)值(numbers)
? ?
jess的語法分析器(parser)分別用java的語法分析功能(parsing function) java.lang.Interger.parseInt 和 java.lang.Double.parseDouble 來分析整形和浮點型數(shù)值.
? ?
jess有三種數(shù)值類型:RU.INTEGER(對應java的int) RU.FLOAT(對應java的double) 和RU.LONG(就像java的long) .數(shù)值的類型會在語法分析(parse)的時候被推測出來.特別注意的是,RU.LONG并不是用得很多.
? ?
1.5.字符串(strings)
? ?
jess里字符串用雙引號""包圍著,就像
? ?
? ?
這樣的東西,很顯然的字符串.
? ?
然而,有的東西還是和java很像的.例如:
? ?
? ?
不過,\n可是沒有效果的.
? ?
結果是:
? ?
? ?
字符串代表著RU.STRING里面jess.Value的對象.
? ?
1.6.注釋(comments)
? ?
? ?
注釋使用;的,例如
? ?
? ?
這些就是注釋``不解釋``
? ?
? ?
2.結構(adding some structure)
? ?
顯然,就這樣的個體,很獨立,無聊``` 正題``讓他們結合起來``(put these "words" together to "sentences" in jess``)
? ?
2.1.Lists(列表,不知應該如何翻譯,暫且不翻譯)
? ?
jess里的基本結構就是List,用一對括號()包圍起來的.一下的都是合法的lists:
? ?
? ?
? ?
list有點像java或者其他語言里的數(shù)組(array).在jess里list是用來把代碼和數(shù)據(jù)結合起來的主要方法,一個list的概念比較廣泛.只要在開頭加上defrule,就可以用來定義rule.同樣的方法,也可以用來定義function.
? ?
有的人會選擇用類似java的{}的方式對付(),導致:
? ?
按照書上說,其實寫成:
? ?
? ?
會比較符合審美… 看著辦吧 呵呵``
? ?
只要層次分明就好,比較重要.對于有必要的時候,還是可以分開寫的.因為和{}一樣,()的層次清晰了對于代碼的維護比較友好.
? ?
2.2.調用函數(shù)(calling functions)
? ?
如果在命令行下輸入list,jess會以為你在調用函數(shù),好比:
? ?
? ?
其中,+是函數(shù).jess里面的是前綴表達式.當然,這些和中綴一樣是可以嵌套(nested)的.例如:
? ?
? ?
關于中綴表達式可以看看這里.
? ?
當然,神奇的jess還不止一個函數(shù),例如:
? ?
輸出的函數(shù):
? ?
? ?
? ?
運行clp的函數(shù):
? ?
? ?
? ?
? ?
慎記,不可以反斜杠.否則:
? ?
? ?
還有的函數(shù)是long.我們不可以像在java那樣在jess里輸入一個很長的數(shù)值.這時候我們需要用long從一個字符串里創(chuàng)建出來.
? ?
? ?
就連給一個變量賦值都需要調用函數(shù).bind的功能就是給變量賦值.關于變量,請看下面:
? ?
2.3.變量(variables)
? ?
jess的變量和其他的差不多,是一個由你命好名的容器,當然,容器存放的是你要的數(shù)據(jù)或者定義的數(shù)據(jù).在其生命周期里,是允許任何類型的數(shù)值的.一個變量可以是一個簡單的符號(symbol),數(shù)值(number),字符串(string),列表(list)等等.
? ?
許多變量在命名的前面加上?(就如上一篇的?p等等)最好在命名變量的時候不要用除了- _其他的符號.而星號*是用來定義全局變量的.也如上一篇那樣,我們是不需要聲明一個變量的,要用一個就寫一個,比較方便.bind,就是用來聯(lián)系變量和它的值,例如:
? ?
? ?
? ?
? ?
這時候,?x就定義好了:
? ?
? ?
就相當于java或者c里面的 = 那樣.再如:
? ?
? ?
? ?
? ?
全局變量(global variables)
? ?
我們之前設的變量只要遇上jess的reset命令,都會被清除,因為reset會讓rule engine的內存清空,讓那些變量的存在時間變得短暫.
? ?
舉個例子:
? ?
? ?
? ?
我們設定的一個全局變量?*x* 即使在reset之后,還存在,而且存在的值并不是后來bind上去的字符串,而是繼續(xù)存在的一個數(shù)值3.與此同時,?n就比較悲劇,reset洗禮過后什么都沒有了``
? ?
多字段(multifields)
一種特殊的用法,在變量前加上$ 比如$?x.可以說,變量?x和多字段$?x只是不同的命名,不過在使用上會有不同.在下文會有提及.
? ?
2.4.其他(more about list)
? ?
如果你想創(chuàng)建一個list但不調用函數(shù)?這就需要create$了:
? ?
? ?
這時候,grocery-list包含的就是一個有著(eggs bread milk)的list了.這種只包含數(shù)據(jù)的list叫做無格式表(plain list 不會表達,暫且這樣命名)我們可以像數(shù)組那樣使用.例如:
? ?
? ?
有愛的是,這里的第二個就是第二個,和數(shù)組的a[0]代表第一個有所不同.
? ?
關于list的還有 first$ 和 rest$
? ?
? ?
? ?
? ?
$first指的是把一個pliant list 的第一項顯示出來,而rest$則是列出第二項開始的后面所有的元素.
? ?
更有愛的是,list是可以連在一起的.添加的方式很方便.例如:
? ?
? ?
這里新建了一個list,把之前的那個?grocery-list也連在一起了.
? ?
當然,自我添加的方式:
? ?
這時候,之前的more-groceries的值是不變的.
? ?
最后,有一個類似第幾個的訪問方式:nth$
? ?
? ?
? ?
? ?
? ?
? ?
3.流控制(control flow)
? ?
有了list的存在,我們就應該對之有所操作.例如:
? ?
apply , build , eval , foreach , if/then/else , progn , while
? ?
由最常用的開始說起:
? ?
3.1.foreach
? ?
foreach會對一個plain list的每個元素進行你所要的設定,操作等.大致的格式如下:
? ?
(foreach <variable> <list> <expression>+)
? ?
expression 可以理解為你要對之的操作. 當然,expression也不是就只有一個操作.舉個簡單例子,例如:
? ?
? ?
創(chuàng)建完畢grocery-list之后,對每一個元素都進行自身加上換行的輸出.
? ?
foreach可以對一個list進行方便的操作,例如創(chuàng)建等等.用foreach可以比較方便地定義循環(huán).不過,更通用的會是while.
? ?
3.2.while
? ?
while不解釋,和很多都類似的.大致格式如下:
? ?
(while <Boolean expression> do <expression>+)
? ?
一般說來就是條件為真時候做到條件為假.例如:
? ?
? ?
? ?
如果wile的條件總是真的話,是停不了的…
? ?
(當然 還在增加,到溢出還在工作….)
? ?
下一個,到if/then/else
? ?
3.3.if/then/else
? ?
當然,也不解釋,畢竟比較熟悉的用法.語法聲明大概如下:
? ?
(if <Boolean expression> then <expression>+ [else <expression>+])
? ?
和剛才的一樣,不過就只走一圈.用來判斷.
舉個例子:函數(shù)menber$ 可以發(fā)現(xiàn)plain list里是否有該元素,有就返回TRUE,否則返回FALSE.例如:
? ?
? ?
當然,和java或者c之類的一樣,是可嵌套(nested)的:
? ?
? ?
? ?
在命令行的jess下如果沒有輸入完而且代碼比較長的時候 不要按 方向鍵↑ 要不是的話 會都沒有的…
? ?
下一個,到類似for的東西,不過 這里是progn
? ?
3.4.progn
? ?
大概的格式如下:
? ?
(progn <expression>+)
? ?
只會反映出當下的布爾值,但是如果是類似循環(huán)的判斷,就比較類似for了,和while結合起來的時候.例如:
? ?
? ?
? ?
當然,可以由下面的方法改寫:
? ?
? ?
? ?
progn更多的在模式匹配(pattern matching)里會用上,因此還是有需要的.
? ?
下面的比較好玩,不過不常用:apply
? ?
3.5.apply
? ?
這個時候,我們可以像發(fā)號命令一樣用.大致格式如下:
? ?
(apply <function-name> <expression>+)
? ?
例如對幾個數(shù),1 2 3 , 我們可以+,也可以-.這時候用apply就可以用:
? ?
? ?
? ?
3.6.eval and build
? ?
用法都是把jess數(shù)據(jù)變成代碼.他們的對象都是完整的jess表達式.而且?guī)в袑W習(learn)的功能.
? ?
eval和build用法是差不多的,不過因為歷史原因,eval用在
解析string并且返回結果(在基于字符串的函數(shù)調用的多).而build則用在規(guī)則的集合上.
? ?
eval的例子:
? ?
? ?
? ?
4.用deffunction定義函數(shù)
? ?
格式大致如下:
? ?
(deffunction <name> (<parameter>*) [<comment>] <expression>*)
? ?
deffunction的名字(name)必須是一個符號(symbol),每個參數(shù)(parameter)必須是變量名(variable name).
? ?
注釋(comment)不是必要的,用"雙引號"引起來說明函數(shù)的功能.最好可以簡潔地寫上注釋.至于expression,核心部分,你懂得.
? ?
在jess in action里面是這樣描述一個場景的:很好,偉大的我們現(xiàn)在在意見游戲公司里面上班,然后經營的搏斗游戲需要計算出兩個物體之間的距離,為了不用做重復輸入那樣的屌絲行為….
? ?
這個函數(shù)就不解釋了.只寫在jess里面的用法:
? ?
? ?
現(xiàn)在,到了多字段(multifields)的環(huán)節(jié),用來求最小值.
說白了,就是每一個上面都搜索一次,然后取最小的返回.
? ?
? ?
? ?
? ?
5.調整程序的行為(fine-turning a function's behavior)
? ?
正如上面說,nth$是由1開始算起的,和很多的不同,由0算起.但是,如果不習慣的話,還是可以調整的.用的是defadvice:(大概就是把他們都往前挪一位 開個新的list)
? ?
? ?
? ?
? ?
解除的方法,就是undefadvice
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
? ?
轉載于:https://www.cnblogs.com/iamfongbao/archive/2012/12/12/2815336.html
總結
以上是生活随笔為你收集整理的jess笔记_(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Common Lisp学习之一:初识CL
- 下一篇: 本体推理中jess和jena区别