شارك المقالة

تولّد القوائم الفرعية في Prolog باختيار كل عنصر أو استبعاده مع المحافظة على ترتيب العناصر الباقية. لذلك يصف المثال subsequence، ولا يولد ترتيبًا جديدًا للعناصر كما تفعل التبديلات.

الكود الكامل في SWI-Prolog

:- module(gc_26590, [list_subsequence/2]).

list_subsequence([], []).
list_subsequence([Head|Tail], [Head|Rest]) :-
    list_subsequence(Tail, Rest).
list_subsequence([_|Tail], Rest) :- list_subsequence(Tail, Rest).

استعلام للتجربة

?- findall(S, list_subsequence([a,b], S), All).

النتيجة All = [[a,b],[a],[b],[]].

الاختيار والاستبعاد

تعالج القاعدة الأولى القائمتين الفارغتين. تحتفظ القاعدة الثانية بالرأس، وتتجاوزه الثالثة. لقائمة من عنصرين تحصل على [a,b] و[a] و[b] و[]؛ لا تظهر [b,a] لأنها لا تحافظ على الترتيب.

التكرار والتكلفة

عدد اختيارات الإدراج والاستبعاد لقائمة بطول n هو 2 أس n. إذا احتوت القائمة على قيم مكررة فقد تتكرر قائمة ناتجة رغم اختلاف مواضع الاختيار. استخدم setof عند حاجتك إلى نواتج متميزة مع فهم أنه يغير طريقة جمع النتائج وترتيبها. تجنب توليد كل القوائم الفرعية لقائمة ضخمة دون حاجة.

احفظ التعريفات في ملف بامتداد .pl ثم حمّله في SWI-Prolog. يُكتب الاستعلام عند المحث بعد تحميل الملف، ولا تنسخ الرمز ?- داخل ملف التعريفات. يتضمن الكود اسم module خاصًا بالدرس لتجنب تعارض الأسماء عند تحميل أمثلة متعددة.

شاهد أيضًا
مقالات ذات صلة
🚫 مانع الإعلانات مفعل

يجب إيقاف مانع الإعلانات لاستكمال تصفح الموقع