0

这与我之前的问题有关。如果我没有insert,它会按预期进入递归循环。但如果我确实有insert程序结束。我在这里想念什么?

rule "Recurse"
    when
        f : Fibonacci(value == 0)
        not Fibonacci(sequence == 0)
    then
        System.out.println(f.sequence + "/" + f.value);
        insert(new Fibonacci(f.sequence - 1));
        f.value = 0;
        update(f);
end
4

1 回答 1

3

为了解释这个例子,我们假设:

  • 系统中只有一个规则
  • 提供给规则引擎的初始事实集满足该规则中的条件
  • 该序列是一个正整数值

首先,我们考虑插入被注释掉的情况:

我们知道工作内存至少包含一个值 == 0 的对象,并且没有序列 == 0 的对象。(我发现更详细的形式 not 稍微更易读,您可以替换 not Fibonacci (.. .) 与 not ( 存在 Fibonacci(...)))。请注意,如果有一个对象同时满足这两个条件,则该规则是有效的。

结果将对象的值设置为零并通知引擎该对象已更改。然后遇到无限循环,因为系统中没有序列 == 0 的对象,我们已将值设置为该对象将触发规则触发。

现在,让我们考虑插入未注释的情况:

我们已经知道,最初的事实集至少会触发一次规则。结果是现在一个对象被放置在具有递减序列的工作内存中,并且 f 引用的对象的值设置为零(它没有从零更改)并更新。有一种机制可以满足结束条件,因为现在,在某些时候将插入一个具有零序列的对象。即满足结束条件。

简而言之:当存在序列为零的斐波那契对象时,引擎将退出。

我,err..,认为这个系统在输出斐波那契数列之前可能需要一些改变。您需要一种方法来引用前两个斐波那契数字来评估正在设置的数字,递归方法更加优雅;)

于 2012-07-13T22:45:46.967 回答