مشكلة في الكتابة LHS من يرول قوانين / جبوس أين أنا مطابقة حقيقة واحدة ومن ثم استخدام هذه الحقيقة لتحديد ما إذا كانت حقيقة أخرى موجود
-
03-07-2019 - |
سؤال
وأنا باستخدام يرول (لأول مرة) للتعبير عن بعض القواعد وأنها تعمل بشكل جيد حتى الآن. ولكن لقد أعطيت حالة جديدة بأنني لست قادرا على التعبير عنها في لغة قواعد واضحة للغاية.
وأساسا أنا بحاجة إلى تنفيذ إجراء على حساب اللاعبين إذا كان لديهم رصيدا مستحقا على حساب هناك بين مبلغ معين، حيث لم تقدم على دفعة في الأسبوع الماضي، وحيث أنها لم تقم بإجراء الدفع في 4 أسابيع مشاركة أكبر من أو يساوي خصم الأسبوعية. هناك بعض القواعد الأخرى ولكني إزالة لهم في محاولة لتبسيط القاعدة لهذا السؤال. إنها القاعدة الأخيرة التي تسبب لي مشكلة.
rule "The broken rule"
salience 10
no-loop
when
Player( $playerNumber : playerNumber )
$a : Account( // balance between £5 and £100 and no arrangement
playerNumber == $playerNumber &&
accountBalanceInPence >= 500 &&
accountBalanceInPence <= 10000
)
not ( // no payment in last week
exists AccountTransaction(
playerNumber == $playerNumber &&
transactionDate >= oneWeekAgo &&
transactionCode == "P" // payment
)
)
/* It's this next bit that is broken */
not ( // no payment > (weekly cost * 4) paid within last 4 weeks
$deduction : AccountTransaction( // a recent transaction
playerNumber == $playerNumber &&
transactionDate >= fourWeeksAgo &&
transactionCode == "D" // deduction
)
exists AccountTransaction( // the payment
playerNumber == $playerNumber &&
transactionDate >= fourWeeksAgo &&
transactionCode == "P" // payment
amountInPence >= ($deduction->amountInPence * 4)
)
)
then
// do some action to the account
end
والمشكلة هي أنه لا يعمل فقط، وأظل الحصول على استثناءات org.drools.rule.InvalidRulePackage القيت. كنت مجرد التخمين في بناء الجملة ولكن لم يتمكن من العثور على سبيل المثال والتي أظهرت ما أحاول القيام به. هل من الممكن؟
ورسالة الخطأ الأصلي الكاملة هي:
"unknown:50:3 mismatched token: [@255,1690:1695='exists',<39>,50:3]; expecting type RIGHT_PAREN[54,4]: unknown:54:4 mismatched token: [@284,1840:1852='amountInPence',<7>,54:4]; expecting type RIGHT_PAREN[54,22]: unknown:54:22 Unexpected token '$payment'"
وبعد محاولة اقتراح في أول تعليق الخطأ هو:
"[50,3]: unknown:50:3 mismatched token: [@255,1690:1695='exists',<39>,50:3]; expecting type RIGHT_PAREN[54,4]: unknown:54:4 mismatched token: [@284,1840:1852='amountInPence',<7>,54:4]; expecting type RIGHT_PAREN[54,45]: unknown:54:45 mismatched token: [@293,1881:1881='*',<71>,54:45]; expecting type LEFT_PAREN[55,3]: unknown:55:3 mismatched token: [@298,1890:1890=')',<12>,55:3]; expecting type THEN"
المحلول
ونعم كما كنت تفكر، تحتاج إلى وضع صريحة "و" داخل "وليس" نمط للانضمام اليهم معا.
والمرة الوحيدة التي لا تحتاج إلى "و" هو في المستوى الأعلى:
وعلى سبيل المثال
when Foo() Bar()
لا يحتاج الى أحد "و"
ولكن هذا هو ضمنيا نفس
when Foo() and Bar()
وهكذا يبدو الحل الصحيح. عدم وجود مستوى عال "و" يبدو أن الاتفاقية في معظم لغات القاعدة (التي تعود إلى فيديو كليب!)
نصائح أخرى
وبعد بعض أكثر القرصنة حول ما يلي لا يسبب أي أخطاء وقت التشغيل (على الرغم من أنني لست متأكدا ما اذا كان "تصحيح" بعد). I أعاد كتابة بند لوضع موجود حول كل الحقائق واستخدمت أقحم وتجميعها.
not ( // no payment > (weekly cost * 4) paid within last 4 weeks
exists (
AccountTransaction( // a recent transaction
playerNumber == $playerNumber &&
transactionDate >= fourWeeksAgo &&
transactionCode == "D" // deduction
$recentDeducation : amountInPence
) and
AccountTransaction( // the payment
playerNumber == $playerNumber &&
transactionDate >= fourWeeksAgo &&
transactionCode == "P" // payment
amountInPence >= ($recentDeducation * 4)
)
)
)
وشكرا على كل مساعدة حتى الآن.
وماذا عن ($deduction->amountInPence * 4)
؟ أعتقد، و->
ينبغي أن يكون .
بدلا من ذلك.