مقدمة ، تفشل ولا تتراجع
-
04-10-2019 - |
سؤال
هل هناك أي مسند للبناء في SWI-prolog سيفشل دائمًا ويمنع الماكينة من التراجع-إنه يمنع البرنامج من التنفيذ على الفور (هذا ليس ما fail/0
يفعل)؟ يمكنني استخدام التخفيضات ، لكني لا أحبها.
القيام بشيء مثل !, fail
ليست مشكلة بالنسبة لي ، ولكن من أجل تحقيق ما أريد ، يجب أن أستخدم التخفيضات في المزيد من المواقع وهذا ما لا يعجبني.
المحلول
يمكنك استخدام الاستثناءات. بناءً على سؤالك - يجب أن يساعد. أشير حلقة الوصل
نصائح أخرى
يمكنك استخدام الآلية المصممة بشكل صريح لمساعدتك على تحقيق شيء ما ، لكنك لا تحب ذلك؟
يمكنك دائمًا استخدام لا ، وهو السكر النحوي لفشل القطع
يتبادر بديلين إلى الذهن:
- تمر حول أ
backtrack(true)
أوbacktrack(false)
المصطلح من خلال الكود الذي تريد التحكم فيه ، وتفسيره في تعريف المتنبئين الذي تكتبه للفشل بسرعة إذا تم ضبطه علىbacktrack(false)
, ، أو للمتابعة إذاbacktrack(true)
. لاحظ أن هذا لن يمنع التراجع فعليًا ؛ يجب أن يمكّن فقط Fast Failure. حتى إذا كانت شجرة الإثبات الخاصة بك عميقة ، فإن هذا يجب أن يوفر طريقة سريعة لمنع تنفيذ رمز معين على التراجع. - استخدم الاستثناءات ، كما هو مقترح بواسطة xonix (+1). سيؤدي رمي استثناء إلى إنهاء بناء شجرة الإثبات على الفور ، ويمكنك تمرير أي بيانات مصطلح من خلال الاستثناء حتى المعالج ، متجاوزًا أي تنفيذ آخر - ربما يكون أسرع من الخيار الأول ، ولكن قد لا يكون محمولًا.
أنا شخصياً استخدمت كلتا الطريقتين من قبل - الأول حيث توقعت الحاجة قبل كتابة الكود ، وهو الأخير الذي لم أفعله.
سيء للغاية ، هذا ما يخفضه.
لا تنتمي إلى StackOverflow