CLIPS程式技巧

本文档通过一系列练习介绍CLIPS专家系统的安装配置、基础知识、资料定义、逻辑推理等内容,并探讨程序控制、物件导向程式设计等高级主题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 练习一 (安装与设定)
练习二 (简易程式)简易程式
练习三 (资料定义与逻辑比较)
练习四 (模组化)模组化
练习五 (读取资料)读取资料
练习六 拓朴演算法
练习七 物件导向程式设计
练习八 程序控制与平行处理
撰写程式经常发现的问题
实例讨论
专家有何特殊不同之处 和用网页来表达有何不同
Procedure/non-procedure languages
哲学思考
练习一 (安装与设定)
下载程式及安装 (http://www.ghg.net/clips/CLIPS.html)
请下载示范程式(http://www.bp.ntu.edu.tw/WebUsers/ftlin/course/空间逻辑/ex 1-3 ICstrategies.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
(rate-of-jobless x y z K)
=>
(if (> y 0.05)
then
(assert (status-of-jobless glasgow serious))
(printout t x "在" z "年的失业率十分严重" crlf)
else
(assert (status-of-jobless glasgow no-problem))
(printout t x "在" z "年没有失业问题" crlf)
)
)
练习四 (模组化)
可以分别写在不同档案
分别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)
)
练习六 拓朴演算法
【注意:请在CLIPS的执行环境下,将Execution/Options/Strategy设定为Breadth】
CLIPS练习「拓朴学」(topology) 或称「图论」(graph)之基本表示法.
http://www.bp.ntu.edu.tw/WebUsers/ftlin/course/空间逻辑/ex6-1 graph-basic.clp
侦测回圈之存在.
http://www.bp.ntu.edu.tw/WebUsers/ftlin/course/空间逻辑/ex6-2 loop.clp
延伸树之演算.
http://www.bp.ntu.edu.tw/WebUsers/ftlin/course/空间逻辑/ex6-3 spanning-tree.clp
树状结构之广度优先搜寻法 (Breadth First Search)
http://www.bp.ntu.edu.tw/WebUsers/ftlin/course/空间逻辑/BFS-tree.clp
【学习重点: (1) defclass 指令的用法. 详练习七!! (2) 演算法 (algorithm)】
树状结构之深度优先搜寻法 (Depth First Search)
http://www.bp.ntu.edu.tw/WebUsers/ftlin/course/空间逻辑/DFS-tree.clp
【学习重点: stack, push, pop】
【作业】
修改上述程式,让操作者可以(1)自行增加节点及连结,如已经存在,应提醒已经存在,不必再加;(2)自行删减连结(不删节点,只删连结),若该连结本不存在,应提醒该连结本不存在,无法删去,(3)输入二个节点名称,系统告知二者之间是否存在路径
请自行建构一个具有多个回圈,ex6-2 loop.clp程式能够找到多少回圈
【讨论】
图论之各种(程序性)演算法,以「规则式」来撰写,有何其便利及困难之处
【作业—树状资料结构】
读入一连串的数目,以左方小於等於根,右方大於根之规则,建成树状资料结构,并输出成一资料档.
【作业—中序】
读入上一题所建之树的资料档,依中序列印出其由小而大的顺序.
提示:
每一个node要有一个编码(ID),左右子点及父点均是指向其ID,而不是指向资料内容本身.
Node的格式如:
(node ID value left-ID right-ID parent-ID)
【讨论—divide, conquer and merge】
如何将一个复杂的问题切割(divide)成小的子问题,分别解决(conquer)之后再加以合并(merge)
在上例,排序问题被切成「建树」及「中序」二个子问题,透过档案加以结合.子问题的程式可以分别独立撰写,互不影响其所设定的local variable的命名.如是,子问题如同软体零组件,可以交由不同国家/设计团队开发,运用其低廉的人力,但他们仅知其一,不知其二,而由系统规划分析人员加以组装之.
练习七 物件导向程式设计
http://www.bp.ntu.edu.tw/WebUsers/ftlin/course/空间逻辑/ex7 物件导件基本技巧.clp
【Word 版:http://www.bp.ntu.edu.tw/WebUsers/ftlin/course/空间逻辑/ex7 物件导件基本技巧MSword.doc】
练习八 程序控制与平行处理
http://www.bp.ntu.edu.tw/WebUsers/ftlin/course/空间逻辑/ex8 程序控制及平行作业 -- OO之现勘准备作业.clp
本练习模拟营建署审议开发案现勘筹备作业之流程
【注】
目前(2005)CLIPS的OO仅能描述ISA的关系,尚不能描述HAS或其他关系.但仍能用原来的 predicate来描述各种关系.
撰写程式经常发现的问题:
(建议)步骤:
以「查询者」之身分,设定问题情境.【谁问什麼问题 】
以「领域专家」之身分,回答问题,建构知识体系(决策树).
绘制「事件图」(决策树)
以「知识工程师」之身分,撰写程式.
找「查询者」及「领域专家」进行测试,修正程式.
程式的正确性:只好多翻翻手册,问问有经验的人.
逻辑流程
问题的前后次序
重复问问题
中文语意不清,不明确 【User Interface】
出现Y/N 殊途同归.不须问该问题,因为Y/N之结果一样.
有不可能发生的路径
问题的本质:判断/决策树
诊断:汽车,电脑
分类:古迹,动物 (terminals 为 Classes)
指认:古迹,动物 (terminals 为 instances)
简单的问题结构可以用decision tree来表达.复杂的问题便会需要graph.
知识的体系化,结构化
让领域专家成为知识工程师(合为一人).
领域专家与知识工程师之间的沟通十分困难,经常造成专家系统的失败.如今,我们让领域专家成为知识工程师(合为一人).希望能突破此一困境.
chunk:片断知识
有效的将片断知识予以系统化,尤其当新的知识进来,或删去旧知识,而仍旧保持明晰的系统(仍维持是decision tree)
尽量避免预设的问答次序.(宜采用switch…case…default指令)
可以将已知的资料(库)建立於deffacts/instances,让查询者有案例可参考.
化简(精致化)
逻辑已经是正确
如何缩短决策步骤 = 去除不必要之步骤
如何设定default 值 (尤其是多选项)
【User Interface】
如何让专家与一般使用者正确了解用词之语意
如何很快的了解到(感知到)使用者与专家之间的知识差距
应请查询者做专家系统测试,以了解使用者之查询需求.
应使用查询者可以理解或者回答之语句.
如使用「术语」,应能让查询者进一步查询该术语之意义.
应确认程式设计者与查询者的「语意」是否相同 (是否对问答之用词有相同之理解).
实例讨论
【王文君:法律专家系统】
可以纳入全部法条,变成一部「电子书」.
可以加入案例(判例)及说明,参考.利用「案例式推理」的方法,撷取条件最近似之案件,提供查询者参考.
【分类问题】
鸟类辨识,电脑问题诊断,古迹分级,…均是「分类问题」.
分类有其目的.目的不同,分类的准则(属性)不同,其结果也不同.
分类的述词:
需要二种述词
IS (X, A, V): X的A属性值为V
CLASS (X, Y): X 的类别为Y
X 为待分类之物件集合
A = {A1, A2, A3, …} 【可以有不同的属性,如体积,重量,价格…】
V = {VA1, VA2, VA3, …} 【不同属性,分别对应不同的值域】
Y = {Y1, Y2, Y3, …}
例:
X 为所有中国建筑之集合
A = {屋群型式,屋顶型式,楼层数,建材}
V屋群型式= {独栋式,四合院,三合院,连栋式街屋}
V屋顶型式= {歇山式,硬山式,悬山式,燕尾,平屋顶 }
V 楼层数 = 自然数系
V建材 = power set of {木,石,砖,竹,水泥,钢骨} 【容许多种建材混用】
Y = {官式建筑,民居,窑洞,吊脚楼,庙,家祠,…}
规则
某类建筑型式构成要素之规则
IS(x, 屋群型式, 四合院) IS(x, 歇山式) CLASS(x, 官式建筑)
类型及次类型之间的关系规则
CLASS(x, 窑洞) CLASS(x, 民居)
以首阶逻辑描述之分类体系,即便是「树状」的,其层级顺序并非固定的.亦即,不一定要先就A1分类,再依A2, A3,…依序分类.
首阶逻辑描述之分类体系容许「网络结构」,让一个子类同时(可能)属於不同的父类.例如:歇山式的四合院建筑可能是官式建筑,宫殿,也可能是国家剧场(如中正纪念馆之国家剧院,音乐厅)
上述首阶逻辑之分类体系,其基本事实之描述是「表格式」的.
专家有何特殊不同之处 和用网页来表达有何不同
语言的表述能力(expression power).
各种(电脑)语言的表述能力是否一样
某些概念或者问题,用某种语言比较容易表述.
可以用网页来表达树状,网络的知识结构.
「祖先问题」是一个「树状结构」问题.
可否用「网页」来表述祖先问题
不能用网页,一次「全部」推论出「所有的」祖先或子孙.
要加上以下之能力才行
推论
仍然要建立「庞大的」资料库.
是否容许网页具有「搜寻」,「网页编辑器(维基百科)」的功能
功能程式一定要用ES来写吗
Google可以不经首页,直接找到某页.
网页:必须一页一页去找.
也必须沿者决策树一层一层往下走.
对使用者而言,无差别.
STRATEGY(程序控制策略):这是专家系统的特色之一.
Procedure/non-procedure languages
传统的程式语言(例如:FORTRAN, C, VB)大多是程序性语言(procedural languages),程式指令的顺利相当重要.次序不同就会得到不同的结果.
许多人工智能(AI)语言,是「非程序语言」.专家系统CLIPS即是.数学的联立方程式也是.理论上(理想上),指令,规则的顺序无关紧要.
程序性语言的重点是HOW to do, 要把演算程序步骤详细的写出来.
非程序性语言的重点是 WHAT to do, 只要把问题要素的关系,规则讲清楚即可,不必考虑解决的步骤为何.(事实上,领域专家也经常说话顚三倒四,并不按一定的次序想起规则)
联立方程式是一种non-procedure language
方程式的顺序不重要
存在二种(以上)的解题程序.
解题程序之控制,在程式执行时,才由使用者决定.(程序性语言必须於程式撰写时同时决定各模组之执行顺序).
概念的层级.高阶概念(专业术语)是从低阶概念建构上来的;例如,「容积率」是由「土地面积」,「建筑面积」,「除法」等基本概念所构成.使用高阶概念,会十分便利,迅捷.但是,必要时仍然可以用低阶概念来重述高阶概念.程式语言亦复如此.CLIP是一种相当高阶的语言,具有许多「浮现」出来的能力(例如程序控制),但它仍然是可以用程序语言来表达(但就会十分繁琐费事).
这是一个专业化,模组(具)化的分工过程.资讯系统因为如此分工,才使系统的发展变得相当有弹性,可以多样化的组合(重构),结果,成长相当快速.必须注意的是,分工只是一个面向;另一个面向是整合.资讯系统因为有清楚定义的分工和整合界面,才能够多而不乱,快速累积知识,产生知识的综效力量.(知识分工反而造成零碎,片断化,这是各知识领域之间未能有效整合之故).
从知识论来说,我们企图建构一种知识整合平台,让不同的知识能够源源不断的新陈代谢,而不失其系统性,结构性.(如何整合不同专家的知识 )
使用某一种语言,得到了某一种便利,但也必然会受到它所带来的限制.自然语言正如矿泉水,有许多杂质,也充满了养分;电脑程式语言就像蒸馏水,十分纯净,可以医疗使用,避免细菌感染,但是毫无养分.所以,就单一事件而言,有所取舍.但是,交替使用,则可兼得其利.正如,太阳之下,必有阴影,有白天,必有黑夜.但是,太阳会旋转,会使每一个地方都有白天与黑夜.是故,在多元的社会,多元的认知中,经常要从不同角度去看问题,要「毋意,毋必,毋固,毋我」,不要死守一方,要多元观照.语言也是一样.不要限制自己「只能」用一种语言.「如筏喻者,法尚应舍,何况非法 」,再多高强的语言,都无需坚持只使用该种语言.
有些问题先天本质上就是网络式,无法化成树状结构.
哲学思考
【符号系统可以表述所有的现实世界吗 】
NO! 哥德尔(Kurt G del, 1906/4/28 -1978/1//14,http://www.edp.ust.hk/math/history/3/3_157.htm)证明了「具内在一致性之符号系统无法对应到现实世界的所有陈述」.例如:「我说的话都是谎话」是一种诡论(paradox)陈述.这种诡论便无法被「具内在一致性之符号系统」所处理.
不过,「具内在一致性之符号系统」的确可以处理「非真即假」的命题逻辑及首阶逻辑体系.近来,更有人引进模糊理论,归纳法,设证法,多值逻辑,等非传统逻辑之符号系统.这些新的符号系统究竟能走多远 值得讨论.
这里面有一个很根本的「语意」问题.我们知道,有些语意是蕴含在「语法」之内,也就是说,语句的文法结构决定了某些语意.例如:「下雨天留客天天留我不留」.不同的断句(语法结构),会有完全相反的意思.但是,哥德尔也同时告诉我们,语法(具内在一致性之符号系统)不能完全涵盖所有的现实世界的陈述.易言之,有些语意仍然是无法用语法来涵括的.究竟什麼是「语意」呢 或者什麼是「意义」呢 恐怕还是得伤伤脑筋吧!
相对於现实世界,数学是一个抽象系统.「1」可以代表一个人,也可以代表一颗树.到了二十世纪初期,更发展出了「符号系统」.符号系统可以说是数学的进一步抽象化.其实,被抽象化的不只是数学而已,它也抽象化了逻辑系统.数学,逻辑是符号系统的实例.那麼,符号系统也揭示了存在著其他的(理念)世界.在下图,我们标示了现实世界,数学,逻辑,符号系统,其他世界的关系.圆圈的包含关系说明它们之间的「不完全(替代)性」.
科学哲学家卡尔波普(Karl Popper)曾划分了三个世界:物理世界,心理世界,知识世界.人类心智活动所发现的知识世界似乎是独立於物理和心理之外.数理世界是知识世界的一部份.二十世纪初期的哲学家们(或者只是数学家们和符号逻辑学家们 )致力於建构一个「具内在一致性之符号系统」,希望能以它来打造「坚固」的知识世界.不过,似乎没那麼简单.不单是哥德尔的「不完全理论」揭示了它的局限性,现象学,诠释学也一再挑战它.
现象学大师胡赛尔(Edmund Husserl, 1859-1938),受过严谨的自然科学训练.但是他认为弥漫二十世纪初期的实证主义是一种「不完善的理性」,忽视了认识论的问题,没有考虑感官认知和诠释的问题.他希望建构一个完全的理性主义来代替残缺不全的理性主义.所以,胡赛尔所质疑的是哲学的危机.只有正视哲学问题,才能正确的对待科学问题.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值