【问题标题】:How to write JESS defrule "if a value not exist in a list, then printout a warning"如何编写 JESS defrule“如果列表中不存在值,则打印出警告”
【发布时间】:2016-11-25 17:21:38
【问题描述】:

我是 JESS 的新手,Java 的中级。

我有“cList”作为特殊商品列表(包括“必需”和“区域”商品), 和“xList”作为所有商品的列表(包括“必需”和“非必需”商品) 我想制定一个规则:如果 'cList' 中不存在状态为 'essential' 的 'xList' 中的 'x',则打印“缺少基本商品 'x'。”

需要明确的是,我的系统模式与 Jess71p2 中的定价引擎示例相同。

  • cList 与 CatalogItems 相同
  • xList 与 OrderItems 相同

我从 Java 类中声明 deftemplate。 这是定义模板;

    (import com.aisy.entity.*)
    (deftemplate oldList(declare (from-class oldList)))
    (deftemplate xList  (declare (from-class xList)))
    (deftemplate cList  (declare (from-class cList)))

这是 xList.java

    package com.aisy.entity;
    import java.sql.Timestamp;
    public class xList {
            private Long id_commodity;
            private String commodity;
            private String essentiality;
            private Timestamp update;

        public xList() {
            super();
        }

        public xList(Long id_commodity, String commodity, String essentiality, Timestamp update) {
            super();
            this.id_commodity = id_commodity;
            this.commodity = commodity;
            this.essentiality = essentiality;
            this.update = update;
        }

        public Long getId_commodity() {
            return this.id_commodity;
        }

        public void setId_Commodity(Long id_commodity) {
            this.id_commodity = id_commodity;
        }

        public String getCommodity() {
            return this.commoditty;
        }

        ....getter and setter methods for the rest fields
    }

这是 cList.java;

    public class cList {
        private Long id_commodity;
        private String commodity;
        private String price;
        private Double final_price;

        public cList(Long id_commodity, String commodity, String price, Double final_price) {
            super();
            this.id_commodity = id_commodity;
            this.commodity = commodity;
            this.price = price;
            this.final_price = final_price;
        }

        public cList() {
            super();
        }

            ...common getter and setter methods for all fields

这里是warning.java;

    public class warning {
        private final String description;
        public warning(String aDescription) {
        description = aDescription;
        }

        public String getDescription() {
        return description;
        }
    }

这里是defrule;

    (defrule 
       (xList (commodity ?essential_commodity) (essentiality /essential/))
       (not(cList (commodity ?essential_commodity)))
        => (add ( new warning "Missing essential commodity" ?essential_commodity))
    )

我尝试将一些信息放到 xList 和 cList 的数据库中:

    xList("100000", "PEANUT", "2.45");
    xList("100003", "BREAD", "1.5");

    cList("100000", "PEANUT", "ESSENTIAL");
    cList("100002", "CAKE", "ESSENTIAL");
    cList("100003", "BREAD", "NON ESSENTIAL" );

因此,如果我运行我的规则引擎,结果应该是

   "Missing essential commodity 100002"

但我目前的结果是:

    "Missing essential commodity 100000"
    "Missing essential commodity 100002"

如何解决这个问题?

已编辑:07/22/2016 添加了 xList.java 和 cList.java

【问题讨论】:

  • 也许您在创建和插入事实时犯了一个错误。没有代码就无法判断。

标签: conditional rule not-exists expert-system jess


【解决方案1】:

当然,确切的语法取决于您要匹配的事实的确切性质。下面的规则是假设有许多“xList”事实,每个事实分别在“commodity”和“essentiality”槽中列出商品的名称及其本质,并且只有一个包含列表的 cList 事实的所有基本商品。空白多字段(“$?”)匹配基本商品前后的任意数量的列表元素。

(defrule 
   (xList (commodity ?essential_commodity) (essentiality essential))
   (not (cList $? ?essential_commodity $?))
    =>
   (assert (warning
       (str-cat "Missing essential commodity" ?essential_commodity))))

【讨论】:

  • 实际上,有很多 cList 事实。所有的deftemplate都是从java类声明的,所以'warning'是一个类。我仍然收到错误。
【解决方案2】:

欧内斯特快到了:

(defrule 
   (xList (commodity ?essential_commodity) (essentiality essential))
   (not (cList (commodity ?essential_commodity)))
=>
   (assert (warning (description ?essential_commodity)))
)

注意:调用不是列表甚至不包含的类“-List”令人不安(而且它肯定会混淆 Ernest)。类应该被称为somethingCommodity,并且字段名称可能被限制为“id”、“name”等。

【讨论】:

  • 我很抱歉我的令人困惑的例子。实际上,我用非英语语言编写了类和方法,因此我将其替换为让您理解,但忘记考虑这些事情。我的系统模式与 Jess71p2 中的定价引擎示例相同。我已经尝试了您的代码,并将结果放在我的帖子中。但是,它仍然没有解决我的问题。
  • 我添加了一对缺失的括号! @Zsy,如果没有具体的错误消息,我们无法猜测什么不适合您。
  • @ErnestFriedman-Hill 啊,很高兴你看看我的代码。我开始失去联系。 :-]
猜你喜欢
  • 2021-11-21
  • 1970-01-01
  • 2022-11-25
  • 2012-03-28
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多