停止rete激活

时间:2014-09-01 14:04:58

标签: jess rete

我有一条规则可以在满足某个条件时收回成千上万的事实。此规则位于一个模块中,该模块包含两个使用" not"声明。我的问题是:

  1. 每次第一条规则撤回事实时,是否会重新计算rete网络?
  2. 这是因为"不是"其他两条规则中的陈述还是会发生的呢?
  3. 有没有办法停止重新计算激活,直到第一条规则没有更多要收回的事实?
  4. 谢谢!

2 个答案:

答案 0 :(得分:1)

如果不知道使用收回事实类型的规则中的模式,就无法获得准确的答案。

显然,如果Fact是那种类型,而规则#2和#3只包含

not Fact(...constraints...)

直到最后一个事实事实(满足约束条件,如果有的话)从工作内存中删除,才会发生任何巨大的事情:然后可能必须创建一个额外的节点,这取决于不是CE的其他节点);这可以继续取决于非CE之后的内容并导致终端节点,即激活。

如果是

这样的模式
Fact(...constraints...)

在任何这些规则中,撤回事实(满足这些约束,如果有的话)会导致对网络中任何待处理的激活和删除节点的一​​些立即操作,前提是它已被包含在内。

你没有太多办法可以避免在Rete网络中发生的事情。

尽管如此,必须收回成千上万的事实是相当可怕的。剩下多少?选择少数几个并从一个全新的Rete重新开始可能会更便宜。或者使用一种设计模式,不会将所有数千个同时暴露给引擎。或者别的什么。

答案 1 :(得分:0)

我们编写了一个惰性算法,可以避免重新生成部分匹配和激活,直到规则可能已准备就绪。懒惰你可以使用显着性来延迟评估规则。 http://blog.athico.com/2013/11/rip-rete-time-to-get-phreaky.html