CLIPS程式技巧

  • 格式:doc
  • 大小:198.00 KB
  • 文档页数:21

CLIPS程序技巧练习一 (安装与设定)●下载程序及安装 (/)●请下载示范程序(.tw/WebUsers/ftlin/course/空间逻辑/ex 1-3ICstrategies.CLP),供练习一、二、三使用。

●请尝试交谈式操作⏹窗口操作⏹load:加载「纯文字文件(.txt)」的应用程序 (*.clp)⏹reset:重置。

不移除应用程序,但是所有参数均重设成原默认值。

⏹clear:移除程序,必须重新加载(其它)程序,始能执行。

●交谈式简易操作⏹CLIPS是类似LISP 的人工智能(AI)语言。

⏹所有的表达式均为函数(function),写在( … ) 之内,运算子(operator)位于第一位,其余操作数(operand)跟随在后。

运算子和各操作数之间均以空格隔开(不是逗号)。

空格只要一格以上即可,多空无妨。

⏹请试 (+ 1 2) ,看会发生什么结果?⏹(+ 1 3 5)⏹请自行试其它的表达式。

●实务上,仍须写成应用程序。

●请注意:括号要双双对对!!! 请养成良好的程序格式习惯,会减少很多程序除错的时间和体力!!!练习二 (简易程序)●TXT档案格式;扩展名: CLP●主要包括二部份: deffacts, defrule 【此二字均是「保留字」,视为operator】●deffacts 定义已知的事实, defrule 定义推理规则●; 注记行●事实以串行表示。

如: (Relation X Y Z)●?X 代表变量。

如: (Relation ?X ?Y ?Z )●英文字之大小写有别!!! 例如:(duck) 和 (Duck) 是不同的fact。

●请注意双引号"之使用,不能用Words里的双引号。

WordPad 或小作家的双引号才行。

●仅注记行及字符串得用中文。

指令及变量均须英文字母(及合法之符号)。

●推理方法为「型态比对」(pattern matching),同位之常数要相同,变量可以对应变量或常数。

元素个数要相同。

=>左(上)方之所有事实均比对成功后,该规则被启动(activate)并置入议程(agenda)之中。

议程依一定之策略(strategy)次序执行(fire)已被启动之规则的=>右(下)方各指令。

●各规则之启动,系因左(上)方事实成立。

换言之,一旦事实有所增减,专家系统即会自动找寻有那些规则可被启动,或议程内原被启动之规则,不再可以启动,而自议程撤下。

●以下是可执行的应用程序实例。

;------------------------------------------------------; 例:都市发展策略; 宣告基本信念;目标/策略关系 [策略本身是一种次目标](deffacts goal-strategies(gs "都市发展策略" "减少失业率") ; 都市发展策略: 减少失业率(gs "减少失业率" "吸引厂商") ; 减少失业率策略: 吸引厂商(gs "吸引厂商" "降低通信成本") ; 吸引厂商策略: 降低通信成本(gs "吸引厂商" "充足的网络建设") ; 吸引厂商策略: 充足的网络建设(gs "降低通信成本" "民营化") ;降低通信成本策略: 民营化);推理规则; 推出所有的目标--策略关系 (策略本身也是一种次目标)(defrule t-gs(gs ?x ?y)(gs ?y ?z)=>(assert (gs ?x ?z)) ;已知之事实用 deffacts。

后来推论所得者用assert。

(printout t "欲达成" ?x "可采取" ?z "之策略" crlf));---------------------------------------------------------------------------------- ;实例结束;---------------------------------------------------------------------------------- 【作业】●会推导出「欲达成减少失业率可采取民营化之策略」,合理吗?●请将「城乡发展」相关文献之知识改写成专家系统之形式,以CLIPS推理,看结论是否合理?并讨论其问题出在何处?如何修正,可以使推理合理化?练习三 (数据定义与逻辑比较)●用 deftemplate 定义某一数据型态之纲目(schema),再用描述该数据型态之实例。

如下,我们先定义city数据型态,再描述Glasgow市之各属性值。

; 定义city数据型态(deftemplate city(slot name)(slot area)(slot population)(slot popu-year)(slot popu-year-type)(slot rate-of-jobless)(slot rate-of-jobless-year)(slot rate-of-jobless-year-type)); 描述Glasgow市之各属性值(deffacts basic-data-of-Glasgow(city(name Glasgow)(population 600000)(popu-year 1980)(popu-year-type s)(rate-of-jobless 0.168)(rate-of-jobless-year 1996)(rate-of-jobless-year-type y)))●逻辑比较要放在RHS,用IF-THEN-ELSE,如下例:(defrule determine-the-degree-of-jobless(city (name ?x) (rate-of-jobless ?y) (slot rate-of-jobless-year ?z)) =>(if (> ?y 0.05)then(assert (status-of-jobless ?x serious))(printout t ?x "在" ?z "年的失业率十分严重" crlf)else(assert (status-of-jobless ?x no-problem))(printout t ?x "在" ?z "年没有失业问题" crlf)))【作业–新增数据及规则】(1)自行以deffacts之指令,增加1-2个城市的数据。

(2)执行练习三之程序,看是否正确判断城市之失业问题。

(3)加入以下的规则:「若X在z年的失业率十分严重,则X应找寻新的发展策略。

」练习四 (模块化)●可以分别写在不同档案●分别load各檔●或者写成一批次档(如下,扩展名BAT),再以 load batch指令一次加载,例如:⏹(load "C:/Documents and Settings/ftlin/My Documents/courses/空间逻辑/信息城市/模块化/ex4 -- 变量中文意义.CLP")⏹(load "C:/Documents and Settings/ftlin/My Documents/courses/空间逻辑/信息城市/模块化/ex4 -- 目标策略关系.CLP")练习五读取数据●用read读取一个字;用readline读取一个句子(数个字)。

●用bind 将读取的字(句),指派给某一变数●请注意执行过程中,Facts窗口内容的变化。

(read 或readline所读入之数据会出现在Facts窗口)●由键盘读取数据:●相关指令: read(defrule test-read(initial-fact)=>(printout t "Name a primary color" crlf); 【printout 后面的 t 代表输出到屏幕】(assert (color (read))); 【单独的 read代表由键盘输入】)●由键盘读取一行字,并存于某变量,以供后续使用。

●相关指令:(readline) 、(bind …)(defrule test-readline(initial-fact)=>(printout t "Enter input" crlf)(bind ?string (readline)); 【bind 指令:将由键盘读入之文字存于变量 ?string之中】(assert-string (str-cat "(" ?string ")"))); 【str-cat 指令:将数个字符串连成一个字符串】●开启档案,并写入、读取、增加一行字。

●相关指令: open, close, printout, readline, read(defrule test-read(initial-fact)=>(open "test.dat" rfile "w"); 【档案test.dat位于与程序相同之目录中】; 【可以加上路径,以存取位于其它目录之档案】; 【rfile为「简称」,尔后程序中均使用简称,不用(含路径之)文件名称】; 【w表示本档案仅能从头「写入」,会覆盖原有文字;不能读取】(printout rfile "This is the first test line. " crlf); 【printout后加上档案简称,将字符串输出于该档案】(close); 【关闭档案,档案游标将回到档案开头】(open "test.dat" rfile "r"); 【r表示本档案仅能被读取,不能写入】(printout t (readline rfile) crlf); 【readline后加上档案简称,表示由该档案读取一行字符串】(close)(open "test.dat" rfile "a");【a表示该档案仅能由文末写入新字(串),不会覆盖原有数据】(printout rfile "This is the 2nd test line. " crlf)(close))【完整程序范例—亲属】; 本程序可以推论亲属关系; 本程序使用了以下之述词(predicate); ( A X Y) 代表: X 是 Y 的长辈;(deffacts names(A "甲" "乙")(A "乙" "丙")(A "乙" "丁")(A "乙" "戊")(A "丁" "己"))(defrule ancestor(A ?X ?Y)(A ?Y ?Z)=>(assert (A ?X ?Z)))(defrule ask=>(printout t "请输入长辈的名字:")(bind ?x (read))(assert (person ?x))(printout t crlf))(defrule answer(person ?x)(A ?x ?y)=>(printout t ?y "是" ?x "的晚辈" crlf))【作业—新增数据并存盘】增加上述「亲属」程序之功能:询问新的亲属关系,写入数据文件。