标签: rete

Prolog回溯VS Rete回溯

在我的课上,我学习了Prolog回溯算法和Rete forprop算法,但我也被告知Rete可以用来做backprop.

这是如何运作的?它与Prolog回溯的方式类似/不同?


例如,这是我给出的练习之一:

(R1) 24fingers and antennas => origin(mars)
(R2) shy and 5feet => origin(mars)
(R3) shy and 4arms => origin(venus)
(R4) looksDownWhenTalking => shy
(R5) fleesWhenSeen => shy
Run Code Online (Sandbox Code Playgroud)

目标是通过以下事实找到外星人的起源:

(F1) fleesWhenSeen
(F2) 4arms
Run Code Online (Sandbox Code Playgroud)

在Prolog中,我们将通过模式匹配origin(X)规则的RHS 的目标来解决它.规则与R1,R2和R3匹配,因此首先会触发R1,我们会尝试解决24fingers and antennas失败的子目标.

然后我们将回溯到开头并触发R2,最终将失败,最后回溯并触发R3,这成功.

因此X,venus在成功查询中结束绑定,算法结束.


现在,我们如何使用rete backprop算法解决相同的练习?

我天真地假设我们将使用一个子目标列表,从origin(X)开始,触发RHS与子目标匹配的规则.

但是,当一些子目标失败时,我不清楚Rete算法如何处理回溯,或者一旦它解决了某个目标子集,它将如何知道它已经成功.

rule-engine prolog backtracking rete

9
推荐指数
1
解决办法
632
查看次数

如何使用Rete算法

我怎样才能在java中使用Rete算法?

我需要编写自己的算法实现吗?

或者是否已经实施了库?

java algorithm rete

6
推荐指数
2
解决办法
8816
查看次数

JBoss Drools是否真的并行执行所有规则?

我已经阅读了很多关于JBoss Drools的文档但是找不到关于是否所有规则同时执行的肯定答案(当然它们是同时被触发的).更具体地,对于单个输入和1000个规则的规则集,在每个规则中执行"何时"条件和"然后"条件,逐个顺序执行,或者同时并行执行.

一方面,当选择节点被折叠时,rete算法意味着并行性.然而,节点优化后评估顺序?beta内存和连接节点看起来应该同时执行,但它们是什么?

此外,Drools文档提到"顺序模式",默认情况下这是关闭的.什么是开启,并行模式?并且有一个maxThreads选项暗示线程.

另一方面,我被告知代码不使用线程,因此同时进行评估,但大部分顺序执行.

有没有人见过任何证明这种情况的文件?

谢谢!

java concurrency rule-engine drools rete

5
推荐指数
1
解决办法
4829
查看次数

Drools 规则写作最佳实践

我一直在阅读一篇关于 Drools 性能的文章(JBoss Drools \xe2\x80\x93 Performance and Memory Internals),它解释了如何创建 Rete 树和节点,Drools 如何索引它们,以及为什么增加 Drools 中的对象数量几乎不会影响执行它所花费的总时间。\n以智能方式编写的规则可以大大减少 Rete Tree 中的节点数量,从而进一步提高性能。

\n\n

我想知道是否有 Drools 规则编写最佳实践,这样我就可以以一种可以尽快执行的方式编写它们。

\n\n

谢谢。

\n

rule-engine drools rete

5
推荐指数
1
解决办法
5603
查看次数

NRules:匹配集合

我正在尝试找出 BRE NRules 并得到一些有效的示例,但很难匹配集合。

IEnumerable<Order> orders = null;

When()
    .Match<IEnumerable<Order>>(o => o.Where(c => c.Cancelled).Count() >= 3)
    .Collect<Order>(() => orders, o => o.Cancelled);

Then()
    .Do(ctx => orders.ToList().ForEach(o => o.DoSomething()));
Run Code Online (Sandbox Code Playgroud)

基本上我想要的是,如果有 3 个订单被取消,那么执行一些操作。但我似乎无法在集合上获得匹配,单个变量确实有效。

该程序:

var order3 = new Order(123458, customer, 2, 20.0);
var order4 = new Order(123459, customer, 1, 10.0);
var order5 = new Order(123460, customer, 1, 11.0);

order3.Cancelled = true;
order4.Cancelled = true;
order5.Cancelled = true;

session.Insert(order3);
session.Insert(order4);
session.Insert(order5);

session.Fire();
Run Code Online (Sandbox Code Playgroud)

我在这里做错了什么?

c# rete nrules

2
推荐指数
1
解决办法
4084
查看次数

Rete网络没有Beta网络?

我正在尝试为示例规则绘制Rete网络,该规则在不同模式的变量之间没有绑定。我知道使用beta网络来确保不同模式下的弯曲变量保持一致。

(defrule R1
  (type1 c1 c2)
  (type2 c3)
 =>
)

(defrule R2
  (type2 c3)
  (type3 c4 v1)
  (type4 c5 v1)
 =>
) 
Run Code Online (Sandbox Code Playgroud)

在R1中,两个模式之间没有绑定变量,那么我该如何在Rete网络中合并它们的结果?在R2中,两个规则绑定了变量,而第三个没有绑定。如何在网络中结合这三个规则?我在这种情况下搜索了Rete网络示例,但未找到任何示例。我试图绘制网络,下面是我的网络。这样对吗?

更新:基于加里的答案的新网络

在此处输入图片说明 谢谢

expert-system clips rete

2
推荐指数
1
解决办法
141
查看次数

如何在NRules中进行最佳写规则定义

NRules SimpleRule的代码定义了以下规则:

public class PreferredCustomerDiscountRule : Rule
{
    public override void Define()
    {
        Customer customer = null;
        IEnumerable<Order> orders = null;

        When()
            .Match<Customer>(() => customer, c => c.IsPreferred)
            .Collect<Order>(() => orders,
                o => o.Customer == customer,
                o => o.IsOpen,
                o => !o.IsDiscounted);

        Then()
            .Do(ctx => ApplyDiscount(orders, 10.0))
            .Do(ctx => LogOrders(orders))
            .Do(ctx => orders.ToList().ForEach(ctx.Update));
    }
        ...
}
Run Code Online (Sandbox Code Playgroud)

我想知道为什么条件是单独的pareameters而不是仅使用&&运算符,即以下将具有相同的效果?

public class PreferredCustomerDiscountRule : Rule
{
    public override void Define()
    {
        Customer customer = null;
        IEnumerable<Order> orders = null;

        When()
            .Match<Customer>(() => customer, …
Run Code Online (Sandbox Code Playgroud)

c# rete nrules

1
推荐指数
1
解决办法
1367
查看次数