2017-08-25 63 views
0

我一直在學習Drools,並且實現了一個簡單的程序。但是,輸出結果並不符合我的預期。流口水規則的意外輸出

規則.drl文件:

rule "Is of valid age" salience 10 
    when 
     $a: Applicant (getAge() > 18) 
    then 
     $a.setValid(true); 
     System.out.println($a.getName() + " is eligible for driving license!"); 
end 

rule "Can by alcohol" salience 1 
    when 
     $a: Applicant(isValid() == false); 
    then 
     System.out.println($a.getName() + " cannot buy alcohol!"); 
end 

在主我插入笑着申請對象:

Applicant applicant1 = new Applicant("Berat", 20, 2010); 
kieSession.insert(applicant1); 
kieSession.fireAllRules(); 
System.out.println(applicant1.getName() + " is of valid age: " + applicant1.isValid()); 

當我火了所有規則,對這個對象的輸出是:

培拉特有資格駕駛執照!
培拉特不能買酒!
培拉特有效年齡:真正

雖然,我給的規則優先級和顯着性的關鍵字,「可以通過醇」規則仍然被解僱。它不應該被解僱,因爲在第一個規則中,isValid(true)被執行,並且在第二個規則中isValid()== false檢查應該返回false,所以應該錯過部分。

+0

我認爲行爲是正確的突顯定義了優先級,所以高顯着性規則先執行,然後再執行另一個 – mhasan

+0

由於申請者對象的年齡超過18歲,因此應該執行setValid(true)以便在「Can by by alcohol」規則中, isValid()== false應該返回false,並且規則的部分不應該被執行。 – InstantCrush

回答

1

聲明

$a.setValid(true); 

不設置有效期爲true申請人,但這不會傳播到Drools的規則引擎。你需要

modify($a){ setValid(true) } 

對於其他較低顯着性規則來看正確的設置。

收回事實只是隱藏了問題。

0

我認爲顯着性只定義執行順序。

您可以在then條款的有效年齡規則中嘗試retract($a)

+0

這解決了我的問題,謝謝你的建議。 – InstantCrush