سؤال

لماذا هذا العمل:

   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 لا تزال فكرة جيدة للحصول على الحلول الفعلية.

الأفضل (للمبتدئين) هو أن تبدأ أو وتجنب كليا.

انظر على سبيل المثال: Prolog Purricate - حلقة لانهائية

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