مشكلة في الكتابة LHS من يرول قوانين / جبوس أين أنا مطابقة حقيقة واحدة ومن ثم استخدام هذه الحقيقة لتحديد ما إذا كانت حقيقة أخرى موجود

StackOverflow https://stackoverflow.com/questions/415907

  •  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)؟ أعتقد، و-> ينبغي أن يكون . بدلا من ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top