محرك الاستدلال لحساب مجموعة المطابقة وفقًا للقواعد الداخلية

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

سؤال

لدي مجموعة من الكائنات ذات السمات ومجموعة من القواعد التي ، عند تطبيقها على مجموعة الكائنات ، توفر مجموعة فرعية من تلك الكائنات. لتسهيل فهم ذلك ، سأقدم مثالًا ملموسًا.

أشيائي هي الأشخاص وكل منها لديه ثلاث سمات: بلد المنشأ والجنس والفئة العمرية (جميع السمات منفصلة). لدي مجموعة من القواعد ، مثل "جميع الذكور من الولايات المتحدة" ، والتي تتوافق مع مجموعات فرعية من هذه المجموعة الأكبر من الكائنات.

أنا أبحث عن إما Java "محرك الاستدلال" أو شيء مشابه ، والذي سيكون قادرًا على تعيين من القواعد إلى مجموعة فرعية من الأشخاص ، أو المشورة بشأن كيفية إجراء إنشاء خاص بي. لقد قرأت على محركات القواعد ، ولكن يبدو أن هذا المصطلح يستخدم بشكل حصري لأنظمة الخبراء التي تخرج من قواعد العمل ، وعادة ما لا تتضمن أي شكل من أشكال الاستدلال المتقدم. فيما يلي بعض الأمثلة على السيناريوهات الأكثر تعقيدًا التي يجب علي التعامل معها:

  1. أحتاج إلى تواصل القواعد. لذلك عندما يتم تقديمها مع كل من "تشمل جميع الذكور" و "استبعاد جميع الولايات المتحدة في الفئة العمرية من 10 إلى 20 ،" أنا مهتم فقط بالذكور خارج الولايات المتحدة ، والذكور داخل الولايات المتحدة الذين هم خارج 10 - 20 الفئة العمرية.

  2. قد يكون للقواعد أولويات مختلفة (محددة بشكل صريح). لذا فإن القاعدة التي تقول "استبعاد جميع الذكور" سيتجاوز قاعدة قائلة "تشمل جميع الذكور نحن".

  3. قد تكون القواعد متضاربة. لذلك يمكن أن يكون لدي كل من "تشمل جميع الذكور" و "استبعاد جميع الذكور" وفي هذه الحالة ، سيتعين على الأولويات تسوية المشكلة.

  4. القواعد متماثلة. لذا فإن "تشمل جميع الذكور" يعادل "استبعاد جميع الإناث".

  5. قد يكون للقواعد (أو بالأحرى مجموعات فرعية) قواعد ميتا (محددة بشكل صريح) المرتبطة بها. يجب تطبيق قواعد التعريف هذه في أي حال يتم تطبيق القاعدة الأصلية ، أو إذا تم الوصول إلى المجموعة الفرعية عن طريق الاستدلال. لذا ، إذا كانت قاعدة التعريف الخاصة بـ "استبعاد الولايات المتحدة" مرتبطة بالقاعدة "تشمل جميع الذكور" ، وأقدم للمحرك القاعدة "استبعاد جميع الإناث" ، فيجب أن تكون قادرة على الاستدلال على "استبعاد جميع الإناث" يعادل مجموعة "تشمل جميع الذكور" ، وعلى هذا النحو ، قم بتطبيق قاعدة "استبعاد الولايات المتحدة" بالإضافة إلى ذلك.

يمكنني في جميع الاحتمالات على الهواء مباشرة بدون البند 5 ، لكنني بحاجة إلى جميع الخصائص الأخرى المذكورة. يتم تخزين كل من القواعد والكائنات في قاعدة بيانات ويمكن تحديثها في أي مرحلة ، لذلك أحتاج إلى إنشاء "محرك الاستدلال" عند الحاجة وتدميره بعد ذلك.

هل كانت مفيدة؟

المحلول

هناك مجموعة من حلال SLD المشابهة لـ Prolog المدمجة لـ Java ؛ النهج المفضل لدي هو الاستخدام Mini-Kanren ل Scala, ، نظرًا لأن هذا نظيف ويسمح لك باستخدام Scala للتعامل مع نتائج الاستعلامات بتكاسل ، لكنني لم أستخدمها في أي عمق. نرى مترجم/مترجم مقدمة مضمن لجافا للحصول على خيارات أخرى ، وكذلك إجابة روس.

تعامل SLD Solvers مع جميع معاييرك ، شريطة أن يكون لديهم بعض الميزات الإضافية التي يمتلكها Prolog:

  1. تزامن القواعد: معالجة الأهداف الأساسية SLD ؛
  2. قد يكون للقواعد أولويات مختلفة: تسمح قاعدة قطع Prolog بتمثيل النفي ، شريطة أن تكون الاستعلامات قابلة للتخلص ؛
  3. قد تكون القواعد متضاربة: مرة أخرى ، مع التخفيض ، يمكنك التأكد من عدم تطبيق الجمل ذات الأولوية المنخفضة إذا تم استيفاء أهداف أولوية أعلى. هناك بعض الطرق للقيام بذلك.
  4. القواعد متماثلة: مع القطع ، يتم ضمان هذا بسهولة للمنصات القابلة للتصوير.
  5. قد يكون للقواعد (أو بالأحرى مجموعات فرعية) قواعد ميتا (محددة بشكل صريح) المرتبطة بها: يبدو أن مثالك يشير إلى أن هذا يعادل 4 ، لذلك لست متأكدًا من أنني أحصل على ما أنت عليه هنا.

مزايا وعيوب حلول SLD على الوصف الأدوات القائمة على المنطق هي:

  1. القوة البرمجية ، المرونة: يمكنك عمومًا العثور على حلول برمجة لنصوص النمذجة ، حيث قد تتطلب منك منطق الوصف إعادة التفكير في النماذج الخاصة بك. ولكن بالطبع ، فإن غياب قناة القناة يعني أن الحلول المنطقية الوصف تجبرك على أن تكون نظيفًا ، والتي قد تكون بمثابة انضباط جيد.
  2. المتانة: تعد حلول SLD تقنية مفهومة جيدًا ، في حين أن الأدوات المنطقية الوصف ليست في كثير من الأحيان خطوات عديدة من ولادتها في أطروحة الدكتوراه.
  3. غياب الأدوات الدلالية: الوصف منطق له روابط لطيفة مع منطق من الدرجة الأولى ومنطق النموذج ، ويمنحك مجموعة غنية جدًا من التقنيات التي تسببها. مرونة مقدمة عادة ما تجعل هذا صعبًا للغاية.

إذا لم يكن لديك خبرة خاصة في منطق الوصف ، فإنني أوصي بحل SLD.

نصائح أخرى

بالنسبة للحالة التي تصفها ، أعتقد أنك سترغب في استخدام السلاسل للخلف ، بدلاً من التسلسل للأمام (أنظمة Rete مثل التسلل تتزايد إلى الأمام ، في سلوكها الافتراضي).

الدفع tuprolog. من السهل ربط Java ، جافا نقي 100 ٪ ، ويمكن بالتأكيد القيام بالاستدلال الذي تريده. ستحتاج إلى فهم ما يكفي عن Prolog لوصف مجموعة القواعد الخاصة بك.

بروفا يمكن أيضًا القيام بالاستدلال والتعامل مع أنظمة القواعد المعقدة.

هذا يبدو إلى حد كبير مثل الوصف المنطقي والقواعد المعرفة بالنسبة لي. لديك مفاهيم وأدوار وفرد.

إذا كنت ترغب في طرح مشكلتك كمنطق قائم على المنطق ، فيجب أن تكون على ما يرام في تصميم مشكلتك وتنفيذ سبب لها.

هناك بعض المناطق المجانية المتاحة ، يمكن العثور على قائمة هنا.

لاحظ ومع ذلك ، أن هذا هو نهج معقد ولكنه قوي.

قد ترغب في إلقاء نظرة خاصة على Kaon2 و حفر عند استخدام جافا.

أعتقد أنه يمكنك استخدام نوع من خوارزمية ID3 لاستخراج مجموعة من القواعد من الحالة الأولية لكائناتك. لا أعرف أي تطبيق Java ملموس ، على الرغم من أن ويكيبيديا تشير إلى تطبيقات مختلفة من Ruby إلى C (لا يمكنني نشر أكثر من ارتباط تشعبي واحد :-)) ، لكنها ليست خوارزمية صلبة للتعلم.

بمجرد أن تبني شجرة القرار ، يمكن التعبير عنها بتنسيق القاعدة ، يمكنك استخدامها لمعرفة الفئة التي تنتمي إلى الأشياء الخاصة بك: لجميع الذكور من الولايات المتحدة ، إلى جميع الإناث بين 10 و 20 ، ... وعندما يتم تحديث شخص ما كائناتك في قاعدة البيانات ، يمكنك إعادة بناء شجرة القرار.

حسنًا ، قد يكون هذا إجابة غبية. لكنني سأحاول على أي حال .... يمكنك استخدام Beanshell لجعل أشياء مثل هذا:

  • قم بإنشاء أمر محدد بسيط (شيء مثل SELECT (inicialset ، paramname ، paramvalue)) يعيد عناصر مجموعة في inicialset وتتناسب مع المعاملات الخاصة بك.

  • قم بإنشاء بعض الثوابت التي يمكن أن تساعدك في كتابة نصوص Beanshell لطيفة.

وبهذه الطريقة يمكنك كتابة قواعدك كنصوص بسيطة وقواعد العش.

إذا هذا

أحتاج إلى تواصل القواعد. لذلك عندما يتم تقديمها مع كل من "تشمل جميع الذكور" و "استبعاد جميع الولايات المتحدة في الفئة العمرية من 10 إلى 20 ،" أنا مهتم فقط بالذكور خارج الولايات المتحدة ، والذكور داخل الولايات المتحدة الذين هم خارج 10 - 20 الفئة العمرية.

سوف يصبح نصًا مثل هذا:

originalSet = getOriginalSet(); //Get all from DB

//elements in originalSet that have gender=male
males = select(originalSet, PARAM.GENDER, GENDER.MALE);

//elements in males that have age in [10,20]
youngMaleGuys = select(males, PARAM.AGE, AGE.10_20);

//Exclude from
males.removeAll(youngMaleGuys);

notYoungUSMaleGuys = select(males, PARAM.COUNTRY, COUNTRY.US);

males.removeAll(notYoungUSMaleGuys);

return resp;

بالطبع ، هذا يمتص. لقد صنعتها الآن. ولكن يمكنك كتابة أوامر لطيفة للغاية وإيجاد طريقة لجعل هذا أكثر قابلية للقراءة.

ليس بهذه السرعة ، ولكن من السهل mantain والقراءة (على ما أظن). ولا يتعين عليك القلق بشأن الطلب

هذا هو. حاولت. قون

واحدة من أقوى محركات قواعد الإنتاج المستندة إلى Java (محرك الاستدلال) هي JBOSS.

http://jboss.org/drools

سأكون صادقًا ، ما لم يحصل تطبيقك أكثر تعقيدًا ، فإن استخدام محرك القواعد يكون مبالغة. من ناحية أخرى ، إذا أصبح التطبيق أكبر من اللازم ولديه الكثير من القواعد المتضاربة ، فسوف يفشل في توفير نتيجة.

إذا تمكنت من التحكم في مجال العميل أو المشكلات بشكل أفضل ، فسيكون من الأفضل تجنب محركات الاستدلال تمامًا.

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