سؤال

أنا أقرأ 'فن برولوغ' كتاب ووجدت ممارسة يقرأ 'تحديد مجموع العلاقة (ليستوفينتيغرز ، سوم) الذي يحمل إذا كان المبلغ هو مجموع ليستوفينتيغرز ، دون استخدام أي المسند المساعد' .لقد توصلت إلى هذا الحل:

sum([],Sum).
sum([0|Xs], Sum):-sum(Xs, Sum).
sum([s(X)|Xs], Sum):-sum([X|Xs],s(Sum)).

الذي لا يعمل تماما كما أريد أن.

?- sum([s(s(0)),s(0),s(s(s(0)))],X).
true ;
false.

كنت أتوقع أن يكون س

s(s(s(s(s(s(0))))))

اعتقدت أن المشكلة هي أن لدي ل' تهيئة 'مجموع إلى 0 في أول' التكرار ' ولكن هذا سيكون إجرائي جدا وللأسف أنا لست عرضة تماما في برولوغ لجعل هذا العمل.أي أفكار أو اقتراحات?

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

المحلول

أفضل طريقة لتعريب المشكلة هي أولا تبسيط الاستعلام الخاص بك:

?- sum([0],S).

true
?- sum([],S).

true

حتى بالنسبة لأولئك ، يمكنك الحصول على إجابة أي S سوف تفعل.مثل

?- sum([],s(s(0))).
yes

منذ [] لا يمكن التعامل معها إلا من خلال حقيقتك ، يجب أن يكمن الخطأ في هذه الحقيقة بالذات.لقد ذكرت:

sum([], Sum).

وهو ما يعني أن مجموع [] هو مجرد أي شيء.ربما كنت تعني 0.

خطأ آخر يخفي في القاعدة الأخيرة...بعد إصلاح الخطأ الأول ، نحصل على

?- sum([0],Sum).
Sum = 0
?- sum([s(0)],Sum).
no

هنا ، البند الأخير هو المسؤول.يقرأ:

sum([s(X)|Xs], Sum):-sum([X|Xs],s(Sum)).

قواعد العودية هي صعبة نسبيا لقراءة في برولوغ.إن أبسط طريقة لفهمها هي أن ننظر إلى :- (وبالتالي السهم من اليمين إلى اليسار) معنى:

شريطة أن تكون الأهداف على الجانب الأيمن صحيحة
نستنتج ما هو موجود على الجانب الأيسر

لذا ، بالمقارنة مع الكتابة غير الرسمية ، تشير الأسهم إلى الاتجاه المعاكس!

للاستعلام لدينا ، يمكننا النظر في استبدال مثيل التالية Xs مع [] و X مع 0.

sum([s(0)| [] ], Sum) :- sum([0| []],s(Sum)).

إذن هذه القاعدة تقرأ الآن من اليمين إلى اليسار:المقدمة, sum([0],s(Sum)) صحيح, ...ومع ذلك ، نحن نعرف ذلك فقط sum([0],0) يحمل ، ولكن ليس هذا الهدف.لذلك ، هذه القاعدة لا تنطبق أبدا!ما كنت تقصده كان عكس ذلك:

sum([s(X)|Xs], s(Sum)):-sum([X|Xs],Sum).

نصائح أخرى

يجب أن يكون نص البند الأول كما يلي:

sum([], 0).

مع هذا التغيير, الفراغ true العودة يذهب بعيدا وكنت تركت مع مشكلة واحدة:الجملة الثالثة تعكس منطق الجمع.يجب أن يكون

sum([s(X)|Xs], s(Sum)) :- sum([X|Xs], Sum).

لأن عدد s/1 المصطلحات في الحجة اليسرى ل sum/2 يجب أن يكون مساويا لعدد منهم في الحجة الصحيحة.

أنا لا أتابع منطقك حقا، ما هو مع كل هياكل الأجيال الغريبة على WeBSingle تطفو.

لن يكون أسهل وأبسط للقيام بشيء مثل هذا؟

أولا، حدد الحل الخاص بك في اللغة الإنجليزية العادية، وبالتالي:

  • مجموع قائمة فارغة هو 0.
  • يتم الحصول على مجموع القائمة غير الفارغة عن طريق إضافة رأس القائمة إلى مجموع ذيل القائمة.

من هذا التعريف، يتبع ProLology مباشرة:

giveacodicetagpre.

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