CLIPS规则R1执行后工作内存(WM)最终状态及lista元素变化原因咨询
拆解CLIPS规则R1的执行过程:为啥lista最后只剩b、c、d?
先把核心信息摆出来:
- 初始工作内存(WM):
(lista e b a c d e a)(lista1 a c a d e e f g)
- 规则R1的代码:
(defrule R1 ?f <- (lista $?x ?a $?y) (lista1 $?p ?a $?q ?a $?r) => (retract ?f) (assert (lista $?x $?y)) )
第一步:搞懂规则R1的逻辑
别被变量名?a误导——这只是个普通变量,它的作用拆解成3步:
- 从
lista事实里抓出任意一个元素绑定到?a,同时把这个元素前后的内容分别存在$?x(前面的所有元素)和$?y(后面的所有元素); - 检查
lista1事实里是否至少有两个和?a相同的元素(也就是?a在lista1里是重复出现的); - 如果满足上面两个条件,就删掉原来的
lista,然后把$?x和$?y拼起来,生成一个去掉了这个?a元素的新lista。
第二步:找出lista1里的重复元素
看lista1的内容(lista1 a c a d e e f g),里面重复出现的元素有两个:
a:出现2次(第1、3位)e:出现2次(第5、6位)
所以规则R1会反复匹配lista里的a和e,直到lista里再也没有这两个元素为止。
第三步:一步步追踪执行过程
初始lista:(e b a c d e a)
- 第一次执行(匹配
?a = e):抓出lista里的第一个e,删掉它后,lista变成(b a c d e a); - 第二次执行(匹配
?a = a):抓出lista里的a,删掉它后,lista变成(b c d e a); - 第三次执行(匹配
?a = e):抓出lista里的e,删掉它后,lista变成(b c d a); - 第四次执行(匹配
?a = a):抓出lista里最后一个a,删掉它后,lista变成(b c d)。
此时lista里剩下的b、c、d,在lista1里都没有重复出现(b根本没出现,c和d各只出现一次),规则R1找不到匹配的模式,执行就停止了。
这就是为啥最后lista里只剩b、c、d,对应选项C的结果。
内容的提问来源于stack exchange,提问作者user12240282
相关产品推荐
相关产品推荐

