波霸奶绿天下第一!用CLIPS做动物分类专家系统!

是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,听说每年的要求都一样)

欢迎一起讨论!

猜你喜欢

转载自www.cnblogs.com/bbnltxdy/p/12092433.html
今日推荐