سؤال

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

Example:
?- mxAli([4,2,9,8],[1,9,5,2,3,8],A).
A=[2,8] or A=[9,8]

8،2 و 8،9 غير صالح هنا.

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

فكرتي هي أنني، أو prolog، تحتاج إلى مواصلة البحث بعد فهرس العنصر الحالي. من شأنها أن تجعل المحاذاة العكسي غير صالحة؟

تحرير: سيتعين عليه مواصلة البحث، بعد فهرس العنصر الحالي في كلا القوائم. كما هو الحال في المثال أعلاه، عندما يجد 2، يبدأ البحث عن العنصر التالي في الفهرس 2 وفي الفهرس 5. (العنصر الأول 1)

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

المحلول

وسيتم استخدام طريقة ساذجة للتحقق من المحاذاة append/3, ، أي شيء مثل:

append(_, [El | T1], L1),
append(_, [El | T2], L2),
...

أين L1 و L2 هي القوائم المحددة، و El هو عنصر يجب أن يشاركوه. في وقت لاحق يمكنك التحقق مما إذا T1 و T2 محاذاة.

ما يلي هو الحل الكامل:

align(L1, L2, [El | T]) :-
    append(_, [El | T1], L1),
    append(_, [El | T2], L2),
    align(T1, T2, T).

align(_L1, _L2, []).

% Test, executed at consult time
:- align([4,2,9,8], [1,9,5,2,3,8], Alignment), writeln(Alignment), fail; true.

يطبع الاختبار:

[2, 8]
[2]
[9, 8]
[9]
[8]
[]

نصائح أخرى

المفتاح لا يفكر مجدغيا كثيرا ولكنه يمضي الحالات التي يجب أن يكون فيها المسند صحيحا.

هنا سأظل في الحالات أن قائمة المحاذاة (الوسيطة الثالثة) فارغة وأنها ليست فارغة. من أجل الحالة غير المختارة تصف ما يجب أن يحتفظ به للعنصر الأول من قائمة الإخراج واستخدام العودية لبقية القائمة.

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