0

我有一条规则,当满足某个条件时,它会撤回数千个事实。该规则位于一个模块中,该模块包含另外两个使用“not”语句的规则。我的问题是:

  1. 每次第一条规则撤回一个事实时,rete 网络是否会重新计算?
  2. 这是因为其他两条规则中的“非”陈述还是会发生这种情况?
  3. 有没有办法停止重新计算激活,直到第一条规则没有更多的事实可以撤回?

谢谢!

4

2 回答 2

1

如果不知道使用撤回事实类型的规则中的模式,就不可能得到准确的答案。

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

not Fact(...constraints...)

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

如果一个模式像

Fact(...constraints...)

在这些规则中的任何一条中,撤回 Fact(满足这些约束,如果有的话)会立即对网络中的任何未决激活和删除节点采取一些行动,前提是它之前已包含在内。

要避免 Rete 网络中发生的事情,您无能为力。

也就是说,不得不撤回数千个事实的必要性是相当可怕的。还剩多少?挑选少数几个并在全新的 Rete 重新开始可能会更便宜。或者使用一种不会将所有数千个都一次性暴露给引擎的设计模式。或者是其他东西。

于 2014-09-01T15:43:40.260 回答
0

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

于 2014-09-15T22:38:50.000 回答