← أحدث الأبحاث
💻 computer science

{log}: From a Constraint Logic Programming Language to a Formal Verification Tool

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

المؤلفون الأصليون: Maximiliano Cristiá, Alfredo Capozucca, Gianfranco Rossi

نُشر 2026-03-13
📖 4 دقيقة قراءة☕ قراءة في استراحة قهوة

المؤلفون الأصليون: Maximiliano Cristiá, Alfredo Capozucca, Gianfranco Rossi

البحث الأصلي مرخَّص بموجب CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/). هذا شرح مولَّده بالذكاء الاصطناعي للبحث أدناه. لم يكتبه المؤلفون ولم يصادقوا عليه. وللتحقق من الدقة التقنية، يرجى الرجوع إلى البحث الأصلي. اقرأ إخلاء المسؤولية الكامل

تخيل أنك تقوم ببناء آلة معقدة، مثل روبوت ينظم مكتبة. عادةً، يتعين عليك القيام بوظيفتين مختلفتين تماماً:

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

غالباً ما لا يتطابق هذان الشيئان تماماً. قد تكتب دليلاً يقول "التقط الكتاب الأحمر"، لكن الكود قد يقول بالخطأ "التقط الكتاب الأحمر و الأزرق أيضاً". التحقق مما إذا كانا متطابقين أمر صعب، بطيء، وعرضة للخطأ البشري.

تقدم هذه الورقة أداة تسمى {log} (تُنطق "setlog") والتي تحل هذه المشكلة عبر دمج الوظيفتين في وظيفة واحدة. إنها تحول لغة البرمجة نفسها إلى "آلة إثبات".

إليك تفصيل لكيفية عملها، باستخدام بعض التشبيهات من الحياة اليومية:

1. الكود "المتحول" (ثنائية البرنامج-الصيغة)

في معظم لغات البرمجة، يكون الكود مثل الوصفة: "اخلط الدقيق، أضف البيض، اخبز". إنه مجرد قائمة من الخطوات.
في {log}، الكود يشبه الحرباء. يمكنه تغيير شكله بناءً على كيفية النظر إليه.

  • كـ برنامج: يمكنك تشغيله لجعل الروبوت يتحرك.
  • كـ مواصفات: يمكنك النظر إلى نفس الأسطر من الكود والتساؤل: "هل تضمن هذه الوصفة أنني لن أحرق الكعكة؟"

لأن الكود هو نفسه المواصفات، فأنت لست بحاجة لترجمة أفكارك من "دليل بشري" إلى "كود حاسوبي". فهما الشيء نفسه. إذا كان الكود صحيحاً، فالمواصفات صحيحة، والعكس صحيح.

2. قوة "المجموعات" الخارقة

السر وراء {log} هو أنه يعامل المجموعات (مجموعات الأشياء) والعلاقات (كيفية اتصال الأشياء ببعضها) كلغة أصلية له.

  • تخيل أن لديك صندوقاً من قطع الليغو. في البرمجة العادية، عليك كتابة حلقات تكرارية معقدة للعثور على قطعة حمراء محددة.
  • في {log}، تقول فقط: "أعطني القطعة الحمراء"، أو "أرني جميع القطع المتصلة بالقطعة الزرقاء".
    تمتلك الأداة "عقلاً رياضياً" مدمجاً (محلل/solver) يستطيع فوراً معرفة ما إذا كان طلبك ممكناً أو إذا كان يؤدي إلى تناقض. هي لا تخمن فحسب؛ بل تستخدم المنطق الرياضي لإثبات الإجابة.

3. "آلة الحالة" (قصة كتاب أعياد الميلاد)

لإثبات نجاح هذا الأمر، يستخدم المؤلفون مثالاً كلاسيكياً: كتاب أعياد الميلاد.

  • الهدف: نظام يتذكر أعياد ميلاد الناس ويذكرك عندما يحين يومهم الكبير.
  • آلة الحالة: فكر في النظام كشخصية في مسرحية. لديه "حالة حالية" (من الموجود في الكتاب) و"عمليات" (إضافة اسم، حذف اسم، التحقق من التاريخ).
  • السحر: باستخدام {log}، يمكنك كتابة قواعد إضافة اسم. بعد ذلك، يمكنك فوراً سؤال الكمبيوتر: "إذا أضفت اسماً، هل سيتعطل النظام؟" أو "إذا أضفت شخصين بنفس الاسم، هل سيتعامل النظام مع الأمر بسلاسة؟"

4. "مفتش السلامة" (مولد شروط التحقق)

عادةً، يتطلب التحقق مما إذا كان الكود آمناً أن يقرأه إنسان ويقول: "هممم، أعتقد أن هذا آمن".
تمتلك {log} مفتش سلامة مدمجاً (يُسمى VCG).

  • عندما تكتب قاعدة (مثل "يمكنك إضافة اسم فقط إذا لم يكن موجوداً بالفعل في الكتاب")، يقوم المفتش تلقائياً بتوليد قائمة من أسئلة "ماذا لو".
  • سؤال: "ماذا لو كان الكتاب فارغاً؟"
  • سؤال: "ماذا لو كان الاسم عبارة عن رقم؟"
    الأداة تقوم بعد ذلك بإجراء إثبات رياضي للإجابة بـ "نعم" أو "لا". وإذا قالت "لا، هذا يكسر القواعد"، فهي لا تتوقف فحسب؛ بل تعطيك مثالاً مضاداً (Counterexample). تقول لك: "إليك سيناريو محدد يفشل فيه الكود الخاص بك: حاول إضافة 'أليس' بينما 'أليس' موجودة بالفعل". وهذا يساعدك على إصلاح الخطأ البرمجي فوراً.

5. "مولد حالات الاختبار" (مختبر الضغط)

بمجرد التحقق من صحة الكود، تحتاج إلى اختباره للتأكد من أنه يعمل في العالم الحقيقي.
عادةً، يتعين على الإنسان التفكير في كل الأشياء الغريبة التي قد تسير بشكل خاطئ (مثل: "ماذا لو حاولت إضافة عيد ميلاد لشخص غير موجود؟").
تمتلك {log} مختبر ضغط يقوم بهذا نيابة عنك.

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

لماذا يعد هذا أمراً هاماً؟

فكر في أدوات أخرى مثل Agda أو Dafny. إنها تشبه المختبرات عالية المستوى والمصممة خصيصاً. هي قوية، لكنها تتطلب منك تعلم طريقة تفكير جديدة وصارمة للغاية.

{log} تشبه "السكين السويسري".

  • تبدأ كلغة برمجة قياسية (برمجة المنطق المقيد).
  • ولكن مع إضافة بعض الأدوات الإضافية، تصبح نظام تحقق رسمي (Formal Verification System).
  • لا تتطلب منك التبديل بين "وضع البرمجة" و"وضع الإثبات". أنت تكتب مرة واحدة، والأداة تتولى الباقي: تشغيل البرنامج، وإثبات سلامته، واختباره.

الخلاصة

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

غارق في أبحاث مجالك؟

تصلك نشرة يومية بأحدث الأبحاث المطابقة لكلماتك البحثية المفتاحية — مع ملخصات تقنية، بلغتك.

جرّب Digest →