我希望将复杂模式与剪辑相匹配:它涉及检测简单事实,第二步是检测更复杂的实例,其创建需要处理简单事实。目前,我采用三条规则来处理这个问题:
Rule1
检查大量简单事实,如果存在,则根据匹配的简单事实创建复杂的类实例i_complex
。Rule2
也会查找简单的事实和i_complex
,如果存在,则使用它们来创建更复杂的实例i_really_complex
。Rule3
也会查找简单的事实i_complex
和i_really_complex
,如果全部存在,则会在屏幕上显示内容。我目前的做法是将大量简单事实从Rule1
的LHS复制到Rule2
和Rule3
的LHS。这显然不是完美的。
我考虑过以下方案:
将所有内容放在一个规则中。这实际上是我最喜欢的解决方案。问题是人们不能在规则的LHS上添加事实/实例。这意味着,例如,我无法检查是否满足i_complex
的要求,如果是,则创建并断言它。然而,这必须正确匹配i_really_complex
。
我想到了一个自我修改规则,它被称为/匹配两次:第一次在RHS上创建i_complex
。第二次它可以匹配LHS上的i_complex
并创建i_really_complex
,依此类推。
匹配这样的模式的首选方法是什么?
答案 0 :(得分:1)
在所有其他条件相同的情况下,我建议选择最易维护的方法。因此,一些更简单的规则将比一个大的笨重和/或自我修改复杂规则更好。
使用相同的初始模式集合将为规则共享模式,因此复制多个规则的模式不会有很大的计算负担,但它确实使规则更难以维护需要跨多个规则制定常见模式。
在你的情况下,如果i_complex仅作为检测到简单事实的结果而生成,则i_complex的存在表明这些事实存在,因此这些简单事实的条件不需要包含在其他规则中在i_complex上匹配。类似地,i_really_complex的存在将表明存在简单的事实和i_complex。
如果i_complex或i_really_complex不包含匹配的简单事实中的所有变量值,您可以将这些值包含在实例中,或者创建事实来表示这些值。
例如,这些规则:
(defrule rule1
(a ?x)
=>
(assert (conclusion 1 ?x)))
(defrule rule2
(a ?x)
(conclusion 1 ?x)
(b ?x)
=>
(assert (conclusion 2 ?x)))
(defrule rule3
(a ?x)
(conclusion 1 ?x)
(b ?x)
(conclusion 2 ?x)
(c ?x)
=>
(assert (conclusion 3 ?x)))
可以改写为:
(defrule rule1
(a ?x)
=>
(assert (conclusion 1 ?x)))
(defrule rule2
(conclusion 1 ?x)
(b ?x)
=>
(assert (conclusion 2 ?x)))
(defrule rule3
(conclusion 2 ?x)
(c ?x)
=>
(assert (conclusion 3 ?x)))
如果您需要在后续规则中验证前提条件是否为真,则可以使用逻辑条件元素:
(defrule rule1
(logical (a ?x))
=>
(assert (conclusion 1 ?x)))
(defrule rule2
(logical (conclusion 1 ?x)
(b ?x))
=>
(assert (conclusion 2 ?x)))
(defrule rule3
(logical (conclusion 2 ?x)
(c ?x))
=>
(assert (conclusion 3 ?x)))