日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jess笔记_(2)

發布時間:2024/3/7 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jess笔记_(2) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這里,將簡單介紹jess的規則語言(rule language),不知道翻譯得是否妥當,求指點.

? ?

1.語法基礎:

? ?

1.1.空格(whitespace)

? ?

Jess里面出了在引號里面的空格之外,其他的和c一樣,多了的少了的影響不大.因此,為了美觀,

? ?

? ?

就會寫成

? ?

? ?

1.2.符號(symbols)

? ?

jess的符號(symbols)定義和java的標識符(identifier)是差不多的.在jess里面,字母,數字,還有這些標點$ * .= + / < > _ ? #是可以作為它的合法符號.符號的開始不可以有數字,有的標點(? $ =)也是不可以作為符號的開頭的,但是在一些場合(比如這里).而其他的標點就可以用在各種的符號定義開頭上去.

? ?

jess的符號定義是大小寫敏感的(case sensitive).就是說,foo,FOO,Foo,都代表著不同的符號(foo,指程序員用來代表數據,功能或命令的變量).當然,這些所謂的"符號"都是用來表達變量的,表達到意思而且容易管理就好.像下面的符號,都是合法的.

? ?

? ?

? ?

jess里的其他,和java比較相似.布爾變量就是TRUE和FALSE,nil則是java里的null(空).不過基于大小寫敏感的尿性,TRUE是必須妥妥的大寫的,而nil就要求小寫.而符號crlf,表示的是換行.

? ?

? ?

1.3.jess.Value class

? ?

所有的jess的量,包括數字,符號,字符串等等,都可以說是一個叫jess.Value 的java類的實例(instance).當要做jess和java交互的時候就需要用上這個類.jess.Value的對象是不可變的,只要創建了出來,它的值就不可以改.你可以用type()來獲取jess.Value對象所包含的數據類型.這些值會在jess.RU類(RU是Rete Utilities,Rete是一種算法,可以說是jess的核心.)中作為一系列的常量枚舉出來.上面所說的符號(symbol)也是RU.ATOM中的一種類型.(atom,可以參考這里,這里有著和lisp相似的尿性,可以理解為封裝在RU里面)

? ?

1.4.數值(numbers)

? ?

jess的語法分析器(parser)分別用java的語法分析功能(parsing function) java.lang.Interger.parseInt 和 java.lang.Double.parseDouble 來分析整形和浮點型數值.

? ?

jess有三種數值類型:RU.INTEGER(對應java的int) RU.FLOAT(對應java的double) 和RU.LONG(就像java的long) .數值的類型會在語法分析(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或者其他語言里的數組(array).在jess里list是用來把代碼和數據結合起來的主要方法,一個list的概念比較廣泛.只要在開頭加上defrule,就可以用來定義rule.同樣的方法,也可以用來定義function.

? ?

有的人會選擇用類似java的{}的方式對付(),導致:

? ?

按照書上說,其實寫成:

? ?

? ?

會比較符合審美… 看著辦吧 呵呵``

? ?

只要層次分明就好,比較重要.對于有必要的時候,還是可以分開寫的.因為和{}一樣,()的層次清晰了對于代碼的維護比較友好.

? ?

2.2.調用函數(calling functions)

? ?

如果在命令行下輸入list,jess會以為你在調用函數,好比:

? ?

? ?

其中,+是函數.jess里面的是前綴表達式.當然,這些和中綴一樣是可以嵌套(nested)的.例如:

? ?

? ?

關于中綴表達式可以看看這里.

? ?

當然,神奇的jess還不止一個函數,例如:

? ?

輸出的函數:

? ?

? ?

? ?

運行clp的函數:

? ?

? ?

? ?

? ?

慎記,不可以反斜杠.否則:

? ?

? ?

還有的函數是long.我們不可以像在java那樣在jess里輸入一個很長的數值.這時候我們需要用long從一個字符串里創建出來.

? ?

? ?

就連給一個變量賦值都需要調用函數.bind的功能就是給變量賦值.關于變量,請看下面:

? ?

2.3.變量(variables)

? ?

jess的變量和其他的差不多,是一個由你命好名的容器,當然,容器存放的是你要的數據或者定義的數據.在其生命周期里,是允許任何類型的數值的.一個變量可以是一個簡單的符號(symbol),數值(number),字符串(string),列表(list)等等.

? ?

許多變量在命名的前面加上?(就如上一篇的?p等等)最好在命名變量的時候不要用除了- _其他的符號.而星號*是用來定義全局變量的.也如上一篇那樣,我們是不需要聲明一個變量的,要用一個就寫一個,比較方便.bind,就是用來聯系變量和它的值,例如:

? ?

? ?

? ?

? ?

這時候,?x就定義好了:

? ?

? ?

就相當于java或者c里面的 = 那樣.再如:

? ?

? ?

? ?

? ?

全局變量(global variables)

? ?

我們之前設的變量只要遇上jess的reset命令,都會被清除,因為reset會讓rule engine的內存清空,讓那些變量的存在時間變得短暫.

? ?

舉個例子:

? ?

? ?

? ?

我們設定的一個全局變量?*x* 即使在reset之后,還存在,而且存在的值并不是后來bind上去的字符串,而是繼續存在的一個數值3.與此同時,?n就比較悲劇,reset洗禮過后什么都沒有了``

? ?

多字段(multifields)

一種特殊的用法,在變量前加上$ 比如$?x.可以說,變量?x和多字段$?x只是不同的命名,不過在使用上會有不同.在下文會有提及.

? ?

2.4.其他(more about list)

? ?

如果你想創建一個list但不調用函數?這就需要create$了:

? ?

? ?

這時候,grocery-list包含的就是一個有著(eggs bread milk)的list了.這種只包含數據的list叫做無格式表(plain list 不會表達,暫且這樣命名)我們可以像數組那樣使用.例如:

? ?

? ?

有愛的是,這里的第二個就是第二個,和數組的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也不是就只有一個操作.舉個簡單例子,例如:

? ?

? ?

創建完畢grocery-list之后,對每一個元素都進行自身加上換行的輸出.

? ?

foreach可以對一個list進行方便的操作,例如創建等等.用foreach可以比較方便地定義循環.不過,更通用的會是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>+])

? ?

和剛才的一樣,不過就只走一圈.用來判斷.

舉個例子:函數menber$ 可以發現plain list里是否有該元素,有就返回TRUE,否則返回FALSE.例如:

? ?

? ?

當然,和java或者c之類的一樣,是可嵌套(nested)的:

? ?

? ?

? ?

在命令行的jess下如果沒有輸入完而且代碼比較長的時候 不要按 方向鍵↑ 要不是的話 會都沒有的…

? ?

下一個,到類似for的東西,不過 這里是progn

? ?

3.4.progn

? ?

大概的格式如下:

? ?

(progn <expression>+)

? ?

只會反映出當下的布爾值,但是如果是類似循環的判斷,就比較類似for了,和while結合起來的時候.例如:

? ?

? ?

? ?

當然,可以由下面的方法改寫:

? ?

? ?

? ?

progn更多的在模式匹配(pattern matching)里會用上,因此還是有需要的.

? ?

下面的比較好玩,不過不常用:apply

? ?

3.5.apply

? ?

這個時候,我們可以像發號命令一樣用.大致格式如下:

? ?

(apply <function-name> <expression>+)

? ?

例如對幾個數,1 2 3 , 我們可以+,也可以-.這時候用apply就可以用:

? ?

? ?

? ?

3.6.eval and build

? ?

用法都是把jess數據變成代碼.他們的對象都是完整的jess表達式.而且帶有學習(learn)的功能.

? ?

eval和build用法是差不多的,不過因為歷史原因,eval用在

解析string并且返回結果(在基于字符串的函數調用的多).而build則用在規則的集合上.

? ?

eval的例子:

? ?

? ?

? ?

4.用deffunction定義函數

? ?

格式大致如下:

? ?

(deffunction <name> (<parameter>*) [<comment>] <expression>*)

? ?

deffunction的名字(name)必須是一個符號(symbol),每個參數(parameter)必須是變量名(variable name).

? ?

注釋(comment)不是必要的,用"雙引號"引起來說明函數的功能.最好可以簡潔地寫上注釋.至于expression,核心部分,你懂得.

? ?

在jess in action里面是這樣描述一個場景的:很好,偉大的我們現在在意見游戲公司里面上班,然后經營的搏斗游戲需要計算出兩個物體之間的距離,為了不用做重復輸入那樣的屌絲行為….

? ?

這個函數就不解釋了.只寫在jess里面的用法:

? ?

? ?

現在,到了多字段(multifields)的環節,用來求最小值.

說白了,就是每一個上面都搜索一次,然后取最小的返回.

? ?

? ?

? ?

? ?

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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。