# برمجة منطقية

البرمجة المنطقية (بالإنجليزية: Logic programming) هي بمفهومها العام استعمال المنطق الرياضي من أجل برمجة الحاسوب. ويستعمل المنطق لغة تصريحية للتعبير عن المشكلة. خلاف الكثير من لغات البرمجة التقليدية فإن المبرمج في البرمجة المنطقية لا يقوم بحل المشكلة بشكل كامل، وانما يقع على عاتقه مسؤولية جزئية في حل المشكلة، وهي بتمثيل القضايا والمعارف بصفة منطقية (logical form)، ويقع الجزء الآخر لحل المشكلة على ما يدعى بمبرهن القضايا (theorem-prover) أو مولد النماذج (model-generator) الذي يقوم بحل المشكلة بشكل فعال.

## علم المنطق

بكل الأحوال تستخدم اللغات المنطقية تكتيك السلسلة الخلفية لعملية الاستنتاج (backward reasoning) ويتم التعامل مع البرنامج على انه تساؤل يجب الإجابة عليه والبحث عن اجابته.
تعتمد اللغات المنطقية على قوانين هورن الممثلة بالشكل التالي:
H :- B1, …, Bn.
بحيث H هو الدالة الهدف و B1...n هي قضايا يجب البحث عن حلها لحل القضية الرئيسية.
ويمكن تأويلها بشكل إجرائي على الشكل:
كي تحل\تظهر H اظهر\حل B1 وقم بحل\اظهار B2...... إلى Bn
وبلغة المنطق الرياضي يمكن القول أن الجملة السابقة تكافئ:
B1 and … and Bn → H
مبرمجي اللغات المنطقية المحترفين يستخدمون تفسيرات إجرائية ليكتبوا برامجهم وتفسيرات تصريحية للتأكد من خلو الهدف من اخطاء والوصول للهدف.

## التاريخ

يعتبر استخدام المنطق الرياضيّ لتمثيل وتنفيذ برامج الحاسب أحد مميزات حسابات اللامدا، التي طوّرها «ألونسو تشيرش» في ثلاثينيّات القرن العشرين. لكنّ أوّل من اقترح استخدام الصيغة الجُمليّة للمنطق –على شكل جُمل- من أجل تمثيل برامج الحاسب كان «كورديل غرين». استخدم تبسيط الحقائق لمجموعة جزئيّة من لغة البرمجة ليسب (LISP) -إلى جانب تمثيل علاقة الإدخال والإخراج- لحساب العلاقة من خلال محاكاة تنفيذ البرنامج في لغة ليسب (LISP). من ناحية أخرى استخدمت لغة البرمجة Absys مزيجًا من معادلاتٍ وحساباتٍ للامدا في لغة برمجيّة توكيديّة لا تضع أيّ قيود على الترتيب الذي تُنّفذ فيه العمليات.
يمكن تعقّب البرمجة المنطقيّة بشكلها الحاليّ بالعودة إلى الوراء إلى مناقشاتٍ في نهاية ستينيّات القرن العشرين وبداية سبعينيّاته حول تمثيل المعرفة الإجرائيّ مقابل تمثيل المعرفة التعريفيّ في الذكاء الصنعيّ. لُوحظ أن الدّاعمين للتمثيل التعريفيّ كانوا يعملون في ستانفورد مُنضمّين إلى «جون مكارثي» و«بيرترام رافاييل» و«كورديل غرين»، وفي إدنبره مع «جون آلان روبنسون» (زائر أكاديمي من جامعة سيراكيوز) و«بات هايس». تركّز داعمو التمثيل الإجرائيّ بشكل رئيسيّ في معهد ماساتشوسيتس للتكنولوجيا (MIT)، وذلك تحت إشراف «مارفن مينسكي» و«سيمور بّابّيرت».
على الرغم من أن لغة البرمجة «Planner» كانت تستند إلى طرق براهين منطقية–طُوّرت في معهد ماساتشوسيتس للتكنلوجيا- فإنّها كانت أوّل لغة تنشأ بهذا النمط الإجرائيّ. تميزت لغة «Planner» باستدعاء خطط إجرائيّة موجّهة وفقًا لنمط واضح من الأهداف «الحدُّ من الأخطاء في الهدف أو التسلسل الخلفيّ» ومن التوكيدات «التسلسل الأمامي». أكثر تنفيذ كان له تأثير بلغة «Planner» هو مجموعة جزئيّة منها تُسمى «Micro-Planner» نفّذها كل من جيري سوسمان ويوجين شارنياك وتيري وينوغارد. استُخدمت لتنفيذ برنامج وينوغراد لفهم اللغة الطبيعيّة والذي يُدعى SHRDLU، إذ شكّل حدثًا بارزًا في ذلك الوقت.
للتعامل مع الأنظمة ذات الذواكر المحدودة جدًا في ذلك الوقت، استخدمت لغة «Planner» بنية تحكم تراجعيّة إذ يمكن تخزين مسار حسابيّ واحد في وقت واحد. أدّت لغة «Planner» إلى ظهور لغات البرمجة QA-4، و Popler، Conniver، QLISP، واللغة المتزامنة Ether أيضًا.
حاول كل من هايس وكولسكي في إدنبره التوفيق بين النهج التعريفيّ القائم على المنطق لتمثيل المعرفة مع نهج لغة «Planner» الإجرائيّ. طوّر هايس (1973) لغة تعادليّة –اسمها Golux- يمكن فيها الحصول على إجرائيّات مختلفة عن طريق تعديل طريقة معالجة مبرهن النظرية. من ناحية أخرى، طوّر كولسكي القاعدة المرجعيّة التي تُسمى «SLD resolution» –تختلف عن «SL-resolution»- وبيّن كيف تتعامل مع الاقتضاءات كإجرائيّات تسعى للحدّ من الأخطاء في الهدف. تعاون كولسكي مع كولميراور في مرسيليا الذي طوّر هذه الأفكار في تصميم وتنفيذ لغة البرمجة برولوغ (Prolog).
تأسّست جمعية البرمجة المنطقيّة لدعم البرمجة المنطقيّة في عام 1986.
أدّى ظهور لغة البرولوغ إلى ظهور لغات برمجة مثل لغة البرمجة الوظيفيّة المنطقيّة الجبريّة (ALF)، Fril، Gödel، Mercury، Oz، Ciao، فيجوال برولوغ، XSB، λProlog، بالإضافة إلى مجموعة من لغات البرمجة المنطقيّة المتزامنة ولغات البرمجة المنطقيّة القيديّة و Datalog.

## مفاهيم
### المنطق والتّوجيه

تُعتبر البرمجة المنطقيّة بمثابة استدلالٍ موجّه. يُوجد فكرة هامة في البرمجة المنطقيّة وهي فصل البرامج المنطقيّة إلى مكوّناتها المنطقيّة ومكوّناتها التوجيهيّة. في لغات البرمجة المنطقيّة البحتة، يُحدّد المكوّن المنطقيّ وحده الحلول الناتجة. يمكن أن يتنوّع المكوّن التّوجيهيّ بغرض توفير طرق بديلة لتنفيذ البرنامج المنطقيّ. استُوحي هذا المفهوم من الشعار:
   الخوارزميّة= المنطق + التّوجيه
إذ يمثّل «المنطق» برنامجًا منطقيًا ويمثّل «التّوجيه» استراتيجياتٍ مختلفةً لإثبات النّظريات.

### حلّ المشاكل

في الحالة الافتراضيّة المبسطة التي يكون فيها البرنامج المنطقيّ والهدف الأصغريّ عالي المستوى لا يحتويان على متغيرات، يُعرّف الاستدلال الخلفيّ شجرة «and-or»، التي تشكّل الفضاء البحثيّ لحلّ المشكلة الهدف. الهدف الموجود في أعلى مستوى للشجرة يُسمى جذر الشجرة. إذا أخذنا أيّ عقدة في الشجرة أو أيّ عبارة يتطابق رأسها مع العقدة، نلاحظ أنّه يوجد مجموعة من العقد الأبناء المُناظرة للأهداف الفرعيّة في بنية العبارة. تُجمع هذه العقد الأبناء من خلال « and». المجموعات البديلة من الأبناء والتي تكون مُناظرة للطرق البديلة لحلّ العقدة تُنظّم مع بعضها في « or».
يمكن استخدام أيّ إستراتيجية بحث للبحث في هذا الفضاء. تستخدم لغة برولوغ إستراتيجية تعقّب خلفيّ تسلسليّة –ما يدخل أولًا يخرج أولًا- يُعتمد فيها بديل واحد وهدف فرعيّ واحد في الوقت نفسه. استراتيجيات البحث الأخرى مثل البحث التّفرّعي والتعقّب الخلفيّ الذكيّ أو بحث «الأفضل-الأول» لإيجاد حلٍّ مثاليّ هي استراتيجيات مُمكنة أيضًا.
في الحالة الأعمّ، التي تشترك فيها الأهداف الفرعيّة بالمتغيّرات، يمكن استخدام استراتيجيّاتٍ أخرى مثل اختيار الهدف الفرعيّ الذي يكون الأفضل تمثيلًا أو ذي التّمثيل الأكثر فاعليّة لكي يمكن تطبيق إجراء واحد فقط. تستخدم استراتيجيّات كهذه –على سبيل المثال- في البرمجة المنطقية المتزامنة.

## انظر أيضاً

* برمجة وظيفية
* منطق ضبابي
* نمط برمجة
* Reflection (برمجة)