Clips:匹配由许多事实和基于这些事实创建的实例组成的复杂模式

Clips: matching complex patterns consisting of many facts and instances whose creation is based on these facts

我想将复杂模式与剪辑相匹配:它涉及简单事实的检测,第二步是检测更复杂的实例,这些实例的创建需要处理简单的事实。目前,我用三个规则来解决这个问题:

  1. Rule1 检查大量简单事实,如果存在,则根据匹配的简单事实创建一个复杂的 class 实例 i_complex
  2. Rule2 也寻找简单的事实和 i_complex,如果存在,则使用它们来创建更复杂的实例 i_really_complex.
  3. Rule3 还会查找简单的事实,i_complexi_really_complex,如果全部存在,则在屏幕上打印一些内容。

我目前的做法是将大量简单事实从Rule1的LHS复制粘贴到Rule2Rule3的LHS。这显然并不完美。

我考虑过以下备选方案:

匹配这种模式的首选方法是什么?

在所有其他条件相同的情况下,我建议选择最易于维护的方法。因此,一些简单的规则会比一个笨重的大型 and/or 自修改复杂规则更好。

使用同一组初始模式的规则将共享模式,因此为多个规则复制模式不会造成很大的计算负担,但确实会使规则更难维护,因为这些通用模式发生了变化将需要跨多个规则制定。

在你的情况下,如果 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)))