gpt4 book ai didi

java - 如何顺序地为同一类型的事实编写规则?

转载 作者:太空宇宙 更新时间:2023-11-04 09:56:51 26 4
gpt4 key购买 nike

我们正在尝试为相同类型的对象编写规则。有些 typeA 的对象具有属性 valid=true 、valid=false 、valid=NA 。条件是我们想要按顺序触发规则,使得

facts valid=="true"&& space=="true"如果它没有为所有提供的事实提供输出,那么它应该转到下一个规则facts valid=="NA"&& space=="true"如果提供的任何事实没有给出输出,那么我们只想采用第三条规则事实有效==“假”&&空间==“真”。

如果第一条规则本身给出输出,那么我们不想进入下一条规则。

我们的代码片段如下所示:

**TypeA a =new TypeA();
a.setValid("true");
a.setSpace("false");

TypeA b = new TypeA();
b.setValid("true");
b.setSpace("true");

TypeA c=new TypeC();
b.setValid("NA");
b.setSpace("true");

TypeA d=new TypeC();
d.setValid("false");
d.setSpace("true");
List<TypeA> typeAList=new ArrayList<>();
typeAList.add(a);
typeAList.add(b);
typeAList.add(c);
typeAList.add(d);**

//创建KieBase的代码

**kieBase.newStatelessKieSession().execute(typeAList);**

**rule "5"
salience 5
when
$typeA: TypeA(valid=="true" && space=="true")
then
System.out.println("location found at A");
end

rule "4"
salience 4
when
$typeA: TypeA(valid=="NA" && space=="true")
then
System.out.println("location found at B");
end

rule "3"
salience 3
when
$typeA: TypeA(valid=="false" && space=="true")
then
System.out.println("location found at C");
end**

我们希望输出仅作为“在 A 找到的位置”,因为其中一个事实满足了此条件。但它返回的输出为“在 A 找到的位置”、“在 B 找到的位置”、“在 C 找到的位置”

最佳答案

请记住,规则引擎的要点是将事实与规则进行匹配,然后触发所有相关的规则。在您的情况下,所有规则都可以触发,因为您将所有 4 个事实添加到工作内存中。第一条规则找到匹配的事实 b 并触发,第二条规则找到匹配的事实 c 并触发,最后第三条规则找到匹配的事实 d 并触发。这都是有意的行为。也就是说,我确实看到了解决该问题的两种潜在方法:

1) 您可以在第二条规则中添加一个条件,即未找到任何与第一条规则匹配的事实。你的 LHS 看起来像这样:

when
$typeA: TypeA(valid=="NA" && space=="true")
not (exists (TypeA(valid=="true" && space=="true")))

这可行,但根据您想以这种方式编写的规则数量,这很快就会变得很麻烦。

2) 您可以使用规则流组以更受控的方式触发规则。在您的情况下,每个规则都将位于其自己的组中,并且在组执行结束时,您可以检查由第一个规则修改的 boolean 事实(您可以在基本类型上创建事实),以确定是完成执行还是转到下一组。您也可以对议程组执行相同的操作,并将算法的“智能”放置在主程序中而不是规则流中。 (为此仍然需要 boolean 事实)

希望这有帮助。

关于java - 如何顺序地为同一类型的事实编写规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54039024/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com