是DSS和ES选修课的一项实验作业。
之前没想通的时候看了很多篇相关的文章,但是都没能实现老师的一些要求。直到某天夜里复习另一门课的时候突然灵光一现就有了想法,分享一下实现的思路。(也许对之后选修这门课的学弟学妹们有帮助hhh)
首先说明一下这里要求的产生式规则:
l R1:有毛发→哺乳动物;
l R2:能产乳→哺乳动物;
l R3:哺乳动物∧吃肉→食肉动物;
l R4:哺乳动物∧有蹄→有蹄动物;
l R5:食肉动物∧颜色是黄褐色∧有深色斑点→猎豹;
l R6:食肉动物∧颜色是黄褐色∧有黑色条纹→老虎;
l R7:有蹄动物∧颜色是白色∧有黑色条纹→斑马。
推理树画的话很简单,下图是我在notability里画的,字有些潦草qwq
老师的具体要求是:
根据给出的规则进行正向推理,推出动物名称(仅限一种),显示动物名称,并要求选择“重新输入基本动物属性”或者“退出系统”;推出多于一种的动物名称,或者没有推出动物名称,提示没有相应规则或基本动物属性输入有误,要求选择“重新输入基本动物属性”或者“退出系统”。
写规则还是挺简单的,推理树里圆圈的属性编写提问的规则
比如:(第一次用博客园,不知道代码这样插对不对w)
1 ;**************************** 2 ;rule twYMF: 3 ; 进行程序描述,提问有毛发否 4 ;**************************** 5 6 (defrule twYMF 7 (declare (salience 100)) 8 ?x <- (start) => 9 (printout t crlf crlf crlf 10 "这个程序将帮助你一步步地进行动物分类" crlf crlf 11 "有毛发吗?" crlf 12 "选择 y / n -> ") 13 (retract ?x) 14 (assert (YMF =(read))))
然后是推理的规则
比如:
1 ;**************************** 2 ;rule rule1: 3 ; 规则1 有毛发或能产乳--是哺乳动物 4 ;**************************** 5 6 (defrule rule1a 7 (declare(salience 99)) 8 (YMF y) 9 => 10 (assert (BRDW y))) 11 12 (defrule rule1b 13 (declare(salience 99)) 14 (NCR y) 15 => 16 (assert (BRDW y))) 17 18 (defrule rule1c 19 (declare(salience 99)) 20 (YMF n) 21 (NCR n) 22 => 23 (assert (BRDW n)))
分类结果的规则
比如:
1 ;**************************** 2 ; rule result1: 3 ; 分类结果1:猎豹 4 ;**************************** 5 6 (defrule result1 7 (declare (salience 95)) 8 (LB y) 9 (LH n) 10 (BM n) 11 => 12 (printout t crlf crlf 13 "分类结果:猎豹" crlf crlf) 14 (assert(succeed))) 15 16 ;****************************
成功(有单一的分类结果)
如下:
1 ;**************************** 2 ;rule resultSucceed: 3 ; 有分类结果 4 ;**************************** 5 6 (defrule resultSucceed 7 (declare(salience 94)) 8 (succeed) 9 => 10 (printout t crlf crlf 11 "以上是分类结果,你可以选择:" crlf crlf 12 "1)重新输入基本动物属性;" crlf 13 "2)退出系统。" crlf 14 "请输入数字1或2:") 15 (assert(choice_a =(read)))) 16 17 ;****************************
“推出多于一种的动物名称,或者没有推出动物名称,提示没有相应规则或基本动物属性输入有误 ”
这条要求一开始挺迷惑的,后来我分析了一下,思路如下图,给大家参考一下:
(同样是在notability里写的,字好潦草QwQ)
(这里的 N 不是没有结果的意思,是没有具体分类结果的,也就是最后运行不成功的情况)
写代码的话比如这样:
1 ;**************************** 2 ;rule fail: 3 ; 没有分类结果 4 ;**************************** 5 ;**************************** 6 ; 无具体分类结果分析 7 ; 三种都不是 8 (defrule rulefail1 9 (declare(salience 95)) 10 (LB n) 11 (LH n) 12 (BM n) 13 => 14 (assert(fail))) 15 16 ; LB,LH,YT中同时存在两个以上的y 17 (defrule rulefail2a 18 (declare(salience 95)) 19 (LB y) 20 (LH y) 21 => 22 (assert(fail))) 23 24 (defrule rulefail2b 25 (declare(salience 95)) 26 (LB y) 27 (BM y) 28 => 29 (assert(fail))) 30 31 (defrule rulefail2c 32 (declare(salience 95)) 33 (LH y) 34 (BM y) 35 => 36 (assert(fail))) 37 38 (defrule rulefail2d 39 (declare(salience 95)) 40 (LB y) 41 (LH y) 42 (BM y) 43 => 44 (assert(fail)))
再比如这样:
1 ; 有毛发为n且能产乳为n 即BRDW为n,此时什么都不是 2 3 (defrule rulefail3 4 (declare(salience 95)) 5 (BRDW n) 6 => 7 (assert(fail))) 8 9 ; 吃肉为n且有蹄为n 仅BRDW 10 11 (defrule rulefail4 12 (declare(salience 95)) 13 (CR n) 14 (YT n) 15 => 16 (assert(fail)))
定义的resultFail规则
1 ;**************************** 2 3 (defrule resultFail 4 (declare(salience 94)) 5 (fail) 6 => 7 (printout t crlf crlf 8 "没有相应规则或基本动物属性输入有误,你可以选择:" crlf crlf 9 "1)重新输入基本动物属性;" crlf 10 "2)退出系统。" crlf 11 "请输入数字1或2:") 12 (assert(choice_b =(read)))) 13 14 ;****************************
再多的代码就不放了,自己思考比较好哦_(:з」∠)_
(以及大家可以猜猜是哪个学校的哪位老师的作业hhh,听说每年的要求都一样)
欢迎一起讨论!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?