قرار يوحد البروتوكول
-
19-09-2019 - |
سؤال
لماذا هذا العمل:
power(_,0,1) :- !.
power(X,Y,Z) :-
Y1 is Y - 1,
power(X,Y1,Z1),
Z is X * Z1.
وهذا يعطي استثناء فائض المكدس؟
power(_,0,1) :- !.
power(X,Y,Z) :-
power(X,Y - 1,Z1),
Z is X * Z1.
المحلول
لأن العمليات الحسابية يتم تنفيذها فقط على البنود من خلال is
المشغل أو العامل. في مثالك الأول، يرتبط Y1 نتيجة حساب Y - 1. في وقت لاحق، يحاول النظام إثبات قوة جملة (X، Y - 1، Z1)، والتي تنحس مع الطاقة (X 'و Y' Z ') ملزمة X' = x، y '= y - 1، z' = z. هذا ثم يرفض مرة أخرى، لذلك Y '' = y - 1 - 1، الخ
Prology هو في المقام الأول توحيد المصطلحات - الحساب، في "الشعور المشترك"، يجب أن يطلب من ذلك صراحة.
نصائح أخرى
كلا التعاريف لا تعمل بشكل صحيح.
انصح
?- pow(1, 1, 2).
التي حلقات لكل من التعريفات لأن الفقرة الثانية يمكن تطبيقها بغض النظر عن الوسيطة الثانية. قطع البند الأول لا يمكن التراجع عن هذا. البند الثاني يحتاج إلى هدف Y > 0
قبل الهدف المتكرر. استخدام (is)/2
لا تزال فكرة جيدة للحصول على الحلول الفعلية.
الأفضل (للمبتدئين) هو أن تبدأ الخليفة الحسانية أو CLPFD. وتجنب prolog-cut. كليا.
انظر على سبيل المثال: Prolog Purricate - حلقة لانهائية