سؤال

أثناء تعلم Prolog ، أحاول حل المشكلة التالية ، باستخدام المربعات:

اكتب AddOne2/ الذي تكون الوسيطة الأولى هي قائمة من الأعداد الصحيحة ، والتي هي حجة الثانية هي قائمة الأعداد الصحيحة التي تم الحصول عليها عن طريق إضافة 1 إلى كل عدد صحيح في القائمة الأولى. على سبيل المثال ، الاستعلام

       addone([1,2,7,2],X).

يجب أن يقدم

       X = [2,3,8,3].

لقد قمت بإنشاء الكود التالي:

addone([], _).
addone([E|Tail], [R|Rs]) :-
    NewE is E+1,
    append([R|Rs], [NewE], NewRs),
    addone(Tail, NewRs).

لكنها لا تعمل. هل يمكن لأحد أن يخبرني لماذا؟ لذا ، كيف يمكنني استخدام المربعات في Prolog؟

شكرًا!

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

المحلول

Anthares صحيح من حيث أنه عليك تحسين حالتك الأساسية. ومع ذلك ، فأنت تجعل الأمور غير فعالة للغاية مع append المكالمات. في Prolog ، يستغرق الأمر بعض الوقت للتعود على قوة التوحيد ، ولكن على سبيل المثال ، في هذه الحالة ، يساعدك ذلك على إعداد قائمة النتائج على الفور. حاول القيام بما يلي:

addone([E|Tail], [E1|Rs]) :-
    E1 is E+1,
    addone(Tail, Rs).

هذا هو حقا كل ما في الأمر. عن طريق وضع على الفور E1 في نمط وسيطتك الثانية ، قمت بالفعل بإنشاء العنصر الأول من قائمة النتائج الخاصة بك. العناصر المتبقية Rs سيتم إنشاؤها أثناء العودية. نمط مقدمة نموذجي للغاية.

نصائح أخرى

يجب أن يكون الجزء السفلي من عودتك addone([],[]). من أجل توصيل Newrs بـ [

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