使用无状态知识会话改变LHS状态的Drools

使用无状态知识会话改变LHS状态的Drools,drools,Drools,我在这里列出我的问题 人们可以进出房间 一个人可以是学生、老师或HOD 学生有一个名为status的属性,可以手动或自动更新 以下是我的活动: 人们进入房间 为每个学生更新属性状态 这是我的规则 如果进入房间的人是教师,则打印“教师输入” 如果进入房间的人数超过30,请通知我 如果学生上课时间超过20小时,则更新状态以完成 现在我想要1和3组合在一起。 比如: 4.如果属性状态为“完成”的学生进入教室,请提醒老师 正如我先前所说,这两件事是分开来的。因此,用两种不同的规则处理它更容易。但是,当我

我在这里列出我的问题

  • 人们可以进出房间
  • 一个人可以是学生、老师或HOD
  • 学生有一个名为status的属性,可以手动或自动更新
  • 以下是我的活动:

  • 人们进入房间
  • 为每个学生更新属性状态
  • 这是我的规则

  • 如果进入房间的人是教师,则打印“教师输入”
  • 如果进入房间的人数超过30,请通知我
  • 如果学生上课时间超过20小时,则更新状态以完成
  • 现在我想要1和3组合在一起。
    比如: 4.如果属性状态为“完成”的学生进入教室,请提醒老师

    正如我先前所说,这两件事是分开来的。因此,用两种不同的规则处理它更容易。但是,当我想创建一个规则,它是规则4中1和3的组合,那么我必须验证进入房间的人是否是学生,以及他是否具有属性“complete”

    但是,即使在验证他是否是学生之前加载status属性,对我来说也很糟糕。因此,我想调用一个方法,仅当

    “一个人是学生,有一条规则试图加载属性状态”

    我计划通过LHS中的方法调用来实现,这并不简单


    有没有其他方法,我可以处理这个问题?

    在大多数情况下,使用小规则识别特定情况比使用复杂规则尝试识别混合情况要好。我不清楚的是,你是否想用第4条规则取代第3条规则。我将保留规则3并创建规则4,如下所示:

    when
        PersonEnteringRoom($p: person, $r: room, person.type == "Student", person.status == "Complete") // status was set by rule 3.
        Room(this == $r, $t: currentTeacher != null) //the relation could be stablished by rule 1
    then
        Notifier.notify($t, "The student has completed the course", $p);
    end
    
    当然,这个规则是否适用于您取决于其他因素,比如您的执行周期

    希望有帮助