logo资料库

jess运用 安装 语法.docx

第1页 / 共34页
第2页 / 共34页
第3页 / 共34页
第4页 / 共34页
第5页 / 共34页
第6页 / 共34页
第7页 / 共34页
第8页 / 共34页
资料共34页,剩余部分请下载后查看
Jess 7.0p1——Java 平台规则引擎 运行一个 Java 应用程序 处理如 CLASSPATH 变量的配置问题 编译 Java 源文件集(可选) 1.入门 1.1.需求 Jess 是一个用 java 语言编写的程序库。因此要使用 Jess 你需要 Java 虚拟机(JVM)。你可以 从 Sun Microsystems 上免费得到一个非常适合用于 Windows, Linux,Solaris 上的 JVM。 Jess 7 是兼容所有版本的 Java,从开始的 JDK 1.4 到现在的最新版本 JDK1.5。版本更老的编 号为 4.x 的 Jess 兼容 JDK 1.0,5.x 版本兼容的是 JDK1.1,Jess 6 工作在 JDK1.2 及以上版本。 在使用 Jess 前请先确认 JVM 是否正确安装并能正常工作。 使 用 JessDE 集 成 开 发 环 境 , 你 需 要 Eclipse SDK 的 3.1 版 或 更 新 版 本 , 这 个 可 以 从 http://www.eclipse.org 获得。安装 JessDE 前请确认 Eclipse 是已经安装并能正常工作。 Jess 类库为另一种语言担任译员,这种语言我在本文档中称为 Jess 语言。Jess 语言是一种高 度专业化的 Lisp 形式语言。 我会认为读者你是将使用这两种或其中一种语言的一个程序员。并且所有的读者都至少有起 码 Java 基础。另外你必须有一个 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.bat Jess, the Rule Engine for the Java Platform Copyright (C) 2006 Sandia Corporation Jess Version Jess71a2 9/5/2006 Jess> 这就是 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 的标准输出窗口,或者是输 出到一个文件中。完善的解释你必须等待,但是现在,你所要了解的都包含在下面这个例子 中: Jess> (printout t "The answer is " 42 "!" crlf) The answer is 42! 另一个常用的函数是 batch,它是用来计算一个包含 Jess 代码文件的。要运行 Jess 源文件 examples/jess/hello.clp,你可以键入: ess> (batch "examples/jess/hello.clp") Hello, world! Jess 自带的其他的所有函数的详细说明都在 Jess function guide.。 3.7.变量 Jess 中程序变量是以问号开始的标识符。问号也是变量名的一部分。名字可以包括字母,数 字,破折号,下划线,分号和星号的任何组合。 一个变量可以看作是一个简单的符号,数字,字符串或者是一个列表。你可以用 bind 函数 来为变量指定一个值。 Jess> (bind ?x "The value") "The value" 变量在第一次使用前不需要声明(全局变量除外)。 想在 Jess 提示符后看到变量 的值,你只需要键入变量的名字: Jess> (bind ?a 123) 123 Jess> ?a 123 3.7.1.全局变量(默认全局) 你在 Jess 提示符后或者任何 Jess 语言程序顶层创建的所有变量, 当重置命令运行的时候都 将被清除。这样就使它们稍嫌短暂,对于暂时性变量它们很好用,在标准理解的前提下不是 永久全局变量。要创建不被 reset 销毁的全局变量,你可以用全局结构: (defglobal [? = ]+) 全局变量的名称必须是以星号开头以星号结束。合法的全局变量如下: ?*a* 当全局变量建立以后,它会被初始化赋值。当 reset 命令随后执行的时候,这个变量可能会 用相同的值重新设置,当然这取决于 reset-globals 的属性设置。有一个称为 set-reset-globals 的函数可以用来设置这个属性。如例所示: ?*all-values* ?*counter*
Jess> (defglobal ?*x* = 3) TRUE Jess> ?*x* 3 Jess> (bind ?*x* 4) 4 Jess> ?*x* 4 Jess> (reset) TRUE Jess> ?*x* 3 Jess> (bind ?*x* 4) 4 Jess> (set-reset-globals nil) FALSE Jess> (reset) TRUE Jess> ?*x* 4 您可以阅读 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 FALSE While 循环的第一个参数是一个布尔表达式。While 函数计算它的第一个参数,如果它为真, 就计算它所有其他的参数。它一直进行这个过程直到它的线一个参数值为假。一个 while 循 环总是返回 FALSE. Jess 中内置有一些其他的循环函数。详情参看 Jess function index.中关于 for 和 foreach 的有 关描述。Jess 中有一个 break 函数,可以有来跳出循环,也可以很早的从一个规则的右手边 返回 1. What is JESS
分享到:
收藏