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

时间:2015-09-29 19:52:55

标签: pattern-matching clips expert-system

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

  1. Rule1检查大量简单事实,如果存在,则根据匹配的简单事实创建复杂的类实例i_complex
  2. Rule2也会查找简单的事实和i_complex,如果存在,则使用它们来创建更复杂的实例i_really_complex
  3. Rule3也会查找简单的事实i_complexi_really_complex,如果全部存在,则会在屏幕上显示内容。
  4. 我目前的做法是将大量简单事实从Rule1的LHS复制到Rule2Rule3的LHS。这显然不是完美的。

    我考虑过以下方案:

    • 将所有内容放在一个规则中。这实际上是我最喜欢的解决方案。问题是人们不能在规则的LHS上添加事实/实例。这意味着,例如,我无法检查是否满足i_complex的要求,如果是,则创建并断言它。然而,这必须正确匹配i_really_complex

      我想到了一个自我修改规则,它被称为/匹配两次:第一次在RHS上创建i_complex。第二次它可以匹配LHS上的i_complex并创建i_really_complex,依此类推。

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

1 个答案:

答案 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)))