给定CLIPS事实与模板,如何用规则中assert命令填充multislot
CLIPS规则实现:生成指定tree事实
问题描述
现有CLIPS的事实集合定义:
(deffacts Liste-MST (mst (arc 1 2)) (mst (arc 2 3)) (mst (arc 2 5)) (mst (arc 1 4)))
同时定义了模板:
(deftemplate tree (multislot arc))
需要编写CLIPS规则,通过assert命令生成目标事实:
(tree (arc 1 2)(arc 2 3)(arc 2 4)(arc 2 5)(arc 1 4))
解决方案
方式一:灵活收集现有arc并补充新增项
这种方式会自动收集所有mst事实中的arc槽值,再补充目标中需要的(arc 2 4),适合后续mst事实可能变动的场景:
(defrule build-target-tree ;; 收集所有mst事实的arc内容 (collect ?all-arcs <- (mst (arc $?))) => ;; 合并收集到的arc与新增的(arc 2 4),断言生成tree事实 (assert (tree (arc $?all-arcs) (arc 2 4))) )
方式二:固定匹配现有事实并直接断言
如果mst事实固定不变,也可以直接匹配所有现有mst事实,然后在断言时写出所有需要的arc项:
(defrule build-target-tree (mst (arc 1 2)) (mst (arc 2 3)) (mst (arc 2 5)) (mst (arc 1 4)) => (assert (tree (arc 1 2) (arc 2 3) (arc 2 4) (arc 2 5) (arc 1 4))) )
内容的提问来源于stack exchange,提问作者Honoré De Marseille
相关产品推荐
相关产品推荐

