Java Drools 6.0.3规则-为什么此代码在无限循环中运行?

Java Drools 6.0.3规则-为什么此代码在无限循环中运行?,java,eclipse,drools,rules,expert-system,Java,Eclipse,Drools,Rules,Expert System,当一个病人得到诊断时,我试图展示一些信息。显示这一点的规则是“即时诊断” 这里的问题是,此代码不显示任何打印消息。。。在无限循环中运行 package com.sample rule "sem sintomas 1" salience 100 when $p : Paciente() forall($s : Sintomas(idPessoa != $p.getId())) then $p.setDiagnostico("sem sintomas definidos")

当一个病人得到诊断时,我试图展示一些信息。显示这一点的规则是“即时诊断” 这里的问题是,此代码不显示任何打印消息。。。在无限循环中运行

package com.sample

rule "sem sintomas 1"
salience 100
when
    $p : Paciente()
    forall($s : Sintomas(idPessoa != $p.getId()))
then
    $p.setDiagnostico("sem sintomas definidos");
    update($p);
end

rule "sem sintomas 2"
salience 90
when
    $s1 : Sintomas(sintoma == "dores")
    $s2 : Sintomas(sintoma == "manchas")
    $p : Paciente(id == $s1.getIdPessoa(), id == $s2.getIdPessoa(), diagnostico == "")
then
    $p.setDiagnostico("sem sintomas definidos");
    update($p);
end

rule "gripe"
salience 60
when
    $s1 : Sintomas(sintoma == "febre")
    $s2 : Sintomas(sintoma == "dores")
    $p : Paciente(id == $s1.getIdPessoa(), id == $s2.getIdPessoa(), diagnostico == "")
then
    $p.setDiagnostico("gripe");
    update($p);
end

rule "enxatema 1"
salience 80
when
    $s1 : Sintomas(sintoma == "febre")
    $s2 : Sintomas(sintoma == "dores")
    $s3 : Sintomas(sintoma == "manchas")
    $p : Paciente(id == $s1.getIdPessoa(), id == $s2.getIdPessoa(), id == $s3.getIdPessoa(), diagnostico == "", idade >= 15)
then
    $p.setDiagnostico("enxatema");
    update($p);
end

rule "enxatema 2"
salience 70
when
    $s1 : Sintomas(sintoma == "febre")
    $s2 : Sintomas(sintoma == "manchas")
    $p : Paciente(id == $s1.getIdPessoa(), id == $s2.getIdPessoa(), diagnostico == "", idade < 15)
then
    $p.setDiagnostico("enxatema");
    update($p);
end

rule "resfriado"
salience 50
when
    $s1 : Sintomas(sintoma == "febre")
    $p : Paciente(id == $s1.getIdPessoa(), diagnostico == "")
then
    $p.setDiagnostico("resfriado");
    update($p);
end

rule "Imprime diagnosticos"
salience 40
when
    $s : Sintomas()
    $p : Paciente(id == $s.getIdPessoa(), diagnostico != "")
then
    System.out.println("Paciente " + $p.getNome() + " com diagnóstico: " + $p.getDiagnostico());
end

感谢所有的帮助,

您必须使用约束来避免循环

$p : Paciente(diagnostico == "")
在规则“sem sintomas 1”中也是如此

建议:您应该使用

modify( $p ){ setDiagnostico("...") }
而不是更新

这些id值(“001”,…)很奇怪:它们不识别症状,也不识别患者,因为这样它们就不会与症状一起存储。通常情况下,一个人用一个键(如ICD-10)识别症状,患者会有一个症状键列表。然后,一条规则可以根据症状的存在与否来确定疾病


我不知道你的身份证是什么意思。自始至终大量使用显著性表明有些事情不对劲。只有在最后一条规则中,您才能使用(低)显著性来打印每个患者的结果

欢迎来到SO。请看这篇关于如何提出一个相对容易帮助的问题的有用文章。不要使用到pastebin&Co.的链接。它们迟早会消失,然后问题就没用了。
modify( $p ){ setDiagnostico("...") }