سؤال

هل هناك أي مسند للبناء في SWI-prolog سيفشل دائمًا ويمنع الماكينة من التراجع-إنه يمنع البرنامج من التنفيذ على الفور (هذا ليس ما fail/0 يفعل)؟ يمكنني استخدام التخفيضات ، لكني لا أحبها.

القيام بشيء مثل !, fail ليست مشكلة بالنسبة لي ، ولكن من أجل تحقيق ما أريد ، يجب أن أستخدم التخفيضات في المزيد من المواقع وهذا ما لا يعجبني.

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

المحلول

يمكنك استخدام الاستثناءات. بناءً على سؤالك - يجب أن يساعد. أشير حلقة الوصل

نصائح أخرى

يمكنك استخدام الآلية المصممة بشكل صريح لمساعدتك على تحقيق شيء ما ، لكنك لا تحب ذلك؟

يمكنك دائمًا استخدام لا ، وهو السكر النحوي لفشل القطع

يتبادر بديلين إلى الذهن:

  1. تمر حول أ backtrack(true) أو backtrack(false) المصطلح من خلال الكود الذي تريد التحكم فيه ، وتفسيره في تعريف المتنبئين الذي تكتبه للفشل بسرعة إذا تم ضبطه على backtrack(false), ، أو للمتابعة إذا backtrack(true). لاحظ أن هذا لن يمنع التراجع فعليًا ؛ يجب أن يمكّن فقط Fast Failure. حتى إذا كانت شجرة الإثبات الخاصة بك عميقة ، فإن هذا يجب أن يوفر طريقة سريعة لمنع تنفيذ رمز معين على التراجع.
  2. استخدم الاستثناءات ، كما هو مقترح بواسطة xonix (+1). سيؤدي رمي استثناء إلى إنهاء بناء شجرة الإثبات على الفور ، ويمكنك تمرير أي بيانات مصطلح من خلال الاستثناء حتى المعالج ، متجاوزًا أي تنفيذ آخر - ربما يكون أسرع من الخيار الأول ، ولكن قد لا يكون محمولًا.

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

سيء للغاية ، هذا ما يخفضه.

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