Clips:匹配由许多事实和基于这些事实创建的实例组成的复杂模式
Clips: matching complex patterns consisting of many facts and instances whose creation is based on these facts
我想将复杂模式与剪辑相匹配:它涉及简单事实的检测,第二步是检测更复杂的实例,这些实例的创建需要处理简单的事实。目前,我用三个规则来解决这个问题:
Rule1
检查大量简单事实,如果存在,则根据匹配的简单事实创建一个复杂的 class 实例 i_complex
。
Rule2
也寻找简单的事实和 i_complex
,如果存在,则使用它们来创建更复杂的实例 i_really_complex
.
Rule3
还会查找简单的事实,i_complex
和 i_really_complex
,如果全部存在,则在屏幕上打印一些内容。
我目前的做法是将大量简单事实从Rule1
的LHS复制粘贴到Rule2
和Rule3
的LHS。这显然并不完美。
我考虑过以下备选方案:
一切尽在一条规则之中。这实际上是我最喜欢的解决方案。问题是不能在规则的 LHS 上添加 facts/instances。这意味着,例如,我无法检查是否满足 i_complex
的要求,如果满足,则创建并声明它。然而,这是正确匹配 i_really_complex
.
所必需的
我想到了一个自修改规则called/matched两次:第一次在RHS上创建i_complex
。第二次它可以在 LHS 上匹配 i_complex
并创建 i_really_complex
等等。
匹配这种模式的首选方法是什么?
在所有其他条件相同的情况下,我建议选择最易于维护的方法。因此,一些简单的规则会比一个笨重的大型 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)))
我想将复杂模式与剪辑相匹配:它涉及简单事实的检测,第二步是检测更复杂的实例,这些实例的创建需要处理简单的事实。目前,我用三个规则来解决这个问题:
Rule1
检查大量简单事实,如果存在,则根据匹配的简单事实创建一个复杂的 class 实例i_complex
。Rule2
也寻找简单的事实和i_complex
,如果存在,则使用它们来创建更复杂的实例i_really_complex
.Rule3
还会查找简单的事实,i_complex
和i_really_complex
,如果全部存在,则在屏幕上打印一些内容。
我目前的做法是将大量简单事实从Rule1
的LHS复制粘贴到Rule2
和Rule3
的LHS。这显然并不完美。
我考虑过以下备选方案:
一切尽在一条规则之中。这实际上是我最喜欢的解决方案。问题是不能在规则的 LHS 上添加 facts/instances。这意味着,例如,我无法检查是否满足
所必需的i_complex
的要求,如果满足,则创建并声明它。然而,这是正确匹配i_really_complex
.我想到了一个自修改规则called/matched两次:第一次在RHS上创建
i_complex
。第二次它可以在 LHS 上匹配i_complex
并创建i_really_complex
等等。
匹配这种模式的首选方法是什么?
在所有其他条件相同的情况下,我建议选择最易于维护的方法。因此,一些简单的规则会比一个笨重的大型 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)))