Droolsのルール(d)の条件付きで名付け帰結条件という名前の結果

時には、各ルールの単一の制約の結果は、次の例を再現し、維持するために長く困難につながる、制限される場合があります。

rule "Give 10% discount to customers older than 60"
when
    $customer : Customer( age > 60 )
then
    modify($customer) { setDiscount( 0.1 ) };
end

rule "Give free parking to customers older than 60"
when
    $customer : Customer( age > 60 )
    $car : Car ( owner == $customer )
then
    modify($car) { setFreeParking( true ) };
end

:すでに一部のような、二番目のルールの拡張最初のルールを作ることによってこの問題を克服することができます

rule "Give 10% discount to customers older than 60"
when
    $customer : Customer( age > 60 )
then
    modify($customer) { setDiscount( 0.1 ) };
end

rule "Give free parking to customers older than 60"
    extends "Give 10% discount to customers older than 60"
when
    $car : Car ( owner == $customer )
then
    modify($car) { setFreeParking( true ) };
end

次のようにいずれの場合においても、デフォルト値に加えて、より顕著な効果は、単一のルールであってもよいように、この機能が定義され、従って、例えば、最初の2つのルールが圧縮されてもよいです。

rule "Give 10% discount and free parking to customers older than 60"
when
    $customer : Customer( age > 60 )
    do[giveDiscount]
    $car : Car ( owner == $customer )
then
    modify($car) { setFreeParking( true ) };
then[giveDiscount]
    modify($customer) { setDiscount( 0.1 ) };
end

最後のルールは、2つの結果、通常はデフォルト値、プラス「giveDiscount」と呼ばれる別のを持って、キーワードの活性化を使用して行い、顧客は、彼が車でないかどうか、限りKIEbaseとして60年にわたって見つけます。例に示すように命名活性化の結果はまた、追加の条件によって保護することができます。

rule "Give free parking to customers older than 60 and 10% discount to golden ones among them"
when
    $customer : Customer( age > 60 )
    if ( type == "Golden" ) do[giveDiscount]
    $car : Car ( owner == $customer )
then
    modify($car) { setFreeParking( true ) };
then[giveDiscount]
    modify($customer) { setDiscount( 0.1 ) };
end

if文の常に直接評価します。最後に、より複雑な例では、/ else文は、異なる条件を切り替えた場合、ネストされた使用方法を示しています。

rule "Give free parking and 10% discount to over 60 Golden customer and 5% to Silver ones"
when
    $customer : Customer( age > 60 )
    if ( type == "Golden" ) do[giveDiscount10]
    else if ( type == "Silver" ) break[giveDiscount5]
    $car : Car ( owner == $customer )
then
    modify($car) { setFreeParking( true ) };
then[giveDiscount10]
    modify($customer) { setDiscount( 0.1 ) };
then[giveDiscount5]
    modify($customer) { setDiscount( 0.05 ) };
end

ここでの目的は、以上の60歳のゴールデン顧客はシルバーに10%の割引と無料の駐車場が、わずか5%割引(無料無料駐車場なし)を与えることです。ブレークキーワードを使用して、「giveDiscount5」と呼ばれる結果を活性化していないために、この結果を達成するために行います。確かに、議題の配置の唯一の結果、LHSの残りの部分を許可すると、通常の状況を評価するために継続すること、また、任意の更なるパターンマッチの評価を破る防ぎます。もちろん、そうでない場合はそのLHS部分が到達することはありません、以下の結果が保護のいずれかの名前の中断条件は何の意味(とコンパイルエラー)を行うものではありませんアクティベートされていないことに注意してください。

おすすめ

転載: blog.csdn.net/top_explore/article/details/93877366