منطق هور (المعروف أيضًا باسم منطق فلويد–هور أو قواعد هور) هو نظام شكلي يحتوي على مجموعة من القواعد المنطقية للتفكير بشكل دقيق حول صحة برامج الكمبيوتر. تم اقتراحه في عام 1969 بواسطة عالم الكمبيوتر البريطاني والمنطق الرياضي توني هور، ثم تم تحسينه لاحقًا من قبل هور وباحثين آخرين.[1] كانت الأفكار الأصلية قد بدأت بعمل روبرت فلويد، الذي نشر نظامًا مشابهًا[2] للمخططات الانسيابية.
الثلاثية بحسب هوار
الميزة المركزية في منطق هوار هي ثلاثية هوار، وهي تصف كيف تُغيّر قطعة من الشيفرة حالة الحوسبة بعد تنفيذها. تكون ثلاثية هوار على الشكل:
حيث و هما عبارتان شرطيّتان و هو أمر برمجي.[note 1] تُسمّى الشرط القبلي و الشرط البعدي: فعندما يتحقق الشرط القبلي، فإن تنفيذ الأمر يؤدي إلى تحقق الشرط البعدي. العبارات الشرطية هي صيغ في منطق الرتبة الأولى.
يوفر منطق هوار مسلمات وقواعد استدلال لجميع بنيات البرمجة الأمرية البسيطة. بالإضافة إلى القواعد المتعلقة باللغة البسيطة في ورقة هوار الأصلية، فقد طُوّرت لاحقًا قواعد لبنيات لغوية أخرى من قِبل هوار وغيرِه من الباحثين. وتشمل هذه القواعد ما يتعلق بـالتزامن، والدوال، وأوامر القفز، والمؤشرات.
الصحة الجزئية والصحة الكلية
باستخدام منطق هوار القياسي، يمكن إثبات الصحة الجزئية فقط. أما الصحة الكلية، فهي تتطلب بالإضافة إلى ذلك إثبات الإنهاء، والذي يمكن إثباته بشكل منفصل أو باستخدام نسخة موسعة من قاعدة التكرار While.[3] بالتالي، التفسير البديهي لثلاثية هوار هو: كلما تحقق من الحالة قبل تنفيذ ، فإن سيتحقق بعد التنفيذ، أو أن لن ينتهي. في الحالة الأخيرة، لا توجد "نهاية"، لذا يمكن أن تكون أي عبارة كانت. في الواقع، يمكن اختيار لتكون خاطئة للتعبير عن أن لا ينتهي.
مصطلح "الإنهاء" هنا وفي باقي المقال يُفهم بالمعنى الأوسع: أن تنتهي الحوسبة في نهاية المطاف، أي أنه لا توجد حلقات لا نهائية؛ ولا يُشترط غياب أخطاء التنفيذ (مثل القسمة على صفر) التي قد توقف البرنامج مبكرًا. في ورقته عام 1969، استخدم هوار تعريفًا أضيق للإنهاء يتضمن أيضًا غياب انتهاكات حدود التنفيذ، وقد أعرب عن تفضيله للتعريف الأوسع لأنه يجعل العبارات الشرطية مستقلة عن تفاصيل التنفيذ:
نقص آخر في المسلمات والقواعد المذكورة أعلاه هو أنها لا توفر أساسًا لإثبات أن البرنامج ينتهي بنجاح. فقد يكون سبب الفشل في الإنهاء وجود حلقة لا نهائية، أو خرق لحد معين يحدده التنفيذ، كمدى القيم العددية، أو حجم التخزين، أو حد زمني يفرضه نظام التشغيل. لذلك ينبغي تفسير التدوين “” على أنه “بشرط أن ينتهي البرنامج بنجاح، فإن خصائص نتائجه موصوفة بواسطة .” من السهل نسبيًا تعديل المسلمات بحيث لا يمكن استخدامها للتنبؤ بنتائج البرامج غير المنتهية؛ ولكن الاستخدام الفعلي للمسلمات سيعتمد حينها على معرفة العديد من خصائص التنفيذ، كحجم وسرعة الحاسوب، ومدى الأرقام، وتقنية التعامل مع تجاوز القيم. باستثناء إثبات تجنب الحلقات اللا نهائية، من الأفضل على الأرجح إثبات "الصحة الشرطية" للبرنامج والاعتماد على التنفيذ لإعطاء تحذير في حال اضطر إلى إيقاف تنفيذ البرنامج بسبب خرق حد من حدود التنفيذ.
— Hoare 1969، صفحات 578-579
القواعد
قاعدة العملية الفارغة
تؤكد قاعدة العملية الفارغة أن التعليمة skip لا تُغيّر حالة البرنامج، لذا فإن أي شرط يتحقق قبل skip سيبقى محققًا بعدها.[note 2]
قاعدة الإسناد
تنص قاعدة الإسناد على أنه بعد تنفيذ الإسناد، فإن أي تعبير كان محققًا لجهة اليمين من الإسناد، سيتحقق للمتغير المُسنَد إليه. لنفترض أن P عبارة شرطية تحتوي على المتغير x كمُتغير حر. إذًا:
حيث تعني العبارة الشرطية P بعد استبدال كل ظهور حر للمتغير x بالتعبير E.
هذا يعني أن تحقق قبل الإسناد يعادل تحقق P بعده. فلو كانت صحيحة قبل الإسناد، فإن P ستكون صحيحة بعده، والعكس غير صحيح بالضرورة.
أمثلة على ثلاثيات صحيحة:
العبارات القبلية غير المتأثرة بالإسناد يمكن نقلها إلى العبارة البعدية. مثلًا، في المثال الأول، لا يتغير بعد تنفيذ .
لكن هذه القاعدة لا تصح عندما يشير أكثر من اسم إلى نفس المكان في الذاكرة (كما في حالة الإشارة المشتركة). مثلًا:
تكون غير صحيحة إذا كان كل من x وy يشيران لنفس الموقع.
قاعدة التركيب
تنطبق قاعدة التركيب على برنامجين ينفّذان بالتسلسل، S ثم T، ويُكتب ذلك ، حيث تُدعى Q بـ"الشرط الوسيط":[4]
مثال:
التسلسل يعطي:
قاعدة الشرطية
تنص القاعدة على أنه إذا تحققت بعد كل من فرعي then وelse بشرط تحقيق و أو نفي ، فإن تتحقق بعد عبارة if...endif بأكملها.[5] ويجب ألا يكون للشرط B أي آثار جانبية. مثال يُقدّم في القسم التالي.
يجب ألّا تُحدِث الشرط B أي تأثيرات جانبية. يُقدَّم مثال في القسم التالي.
لم تكن هذه القاعدة واردة في منشور هوار الأصلي.[1] ومع ذلك، بما أن العبارة
لها نفس تأثير البنية التكرارية لمرة واحدة التالية:
فإنه يمكن اشتقاق قاعدة الشرط من قواعد هوار الأخرى. وبطريقة مشابهة، يمكن تحويل القواعد الخاصة ببنى البرامج الأخرى المشتقة، مثل حلقة for، وحلقة do...until، وتعليمة switch، وbreak، وcontinue من خلال تحويل البرنام إلى القواعد الموجودة في ورقة هوار الأصلية.
قاعدة العاقبة
تُتيح هذه القاعدة تقوية الشرط المسبق و/أو إضعاف الشرط اللاحق . تُستخدم هذه القاعدة مثلاً لتحقيق تطابق حرفي بين الشرطين اللاحقين في جزئي then وelse.
على سبيل المثال، لإثبات ما يلي:
يجب تطبيق قاعدة الشرط، والتي بدورها تتطلب إثبات:
- ، أو مبسطة
لجزء then، و
- ، أو مبسطة
لجزء else.
ومع ذلك، تتطلب قاعدة الإسناد في جزء then اختيار P كـ ؛ وبالتالي تطبيق القاعدة يُعطي:
- ، وهو ما يعادل منطقياً
- .
وبالتالي، تُستخدم قاعدة العاقبة لتقوية الشرط المسبق المستنتج من قاعدة الإسناد إلى المطلوب لقاعدة الشرط.
وبالمثل، لجزء else، تعطي قاعدة الإسناد:
- ، أو مكافئة
- ،
لذلك يجب تطبيق قاعدة العاقبة بحيث يكون و هما و على التوالي، لتقوية الشرط المسبق مرة أخرى. وبتعبير غير رسمي، فإن تأثير قاعدة العاقبة هو "نسيان" أن كان معلوماً عند دخول جزء else، لأن قاعدة الإسناد المستخدمة لذلك الجزء لا تحتاج إلى هذه المعلومة.
قاعدة while
هنا، P هو ثبات الحلقة، الذي يجب الحفاظ عليه داخل جسم الحلقة S. بعد انتهاء الحلقة، يظل هذا الثبات P قائمًا، ويجب أيضًا أن تكون قد تسببت في إنهاء الحلقة. وكما في قاعدة الشرط، يجب ألا يُحدِث B أي تأثيرات جانبية.
على سبيل المثال، لإثبات:
باستخدام قاعدة while، يجب إثبات:
- ، أو مبسطة
- ،
وهو ما يُستنتج بسهولة من قاعدة الإسناد. وأخيراً، يمكن تبسيط الشرط اللاحق إلى .
كمثال آخر، يمكن استخدام قاعدة while للتحقق رسميًا من البرنامج الغريب التالي لحساب الجذر التربيعي الدقيق x لعدد عشوائي a—حتى لو كانت x متغيرًا صحيحًا وa عددًا غير مربعي:
بعد تطبيق قاعدة while مع كون P هو true، يتبقى إثبات:
- ،
وهو ما ينتج عن قاعدة التجاوز (skip) وقاعدة العاقبة.
في الواقع، هذا البرنامج الغريب صحيح جزئيًا فقط: إذا انتهى تنفيذه، فهذا يعني أن x قد احتوى صدفةً على الجذر التربيعي لـ a. أما في الحالات الأخرى، فلن ينتهي؛ لذا فهو ليس صحيحًا كليًا.
قاعدة while للصحة الكلية
إذا تم استبدال قاعدة while العادية أعلاه بالقاعدة التالية، يمكن استخدام حساب هوار لإثبات الصحة الكلية، أي التوقف بالإضافة إلى الصحة الجزئية. وغالبًا ما تُستخدم الأقواس المربعة بدلاً من المعقوفة للإشارة إلى المفهوم المختلف لصحة البرامج:
في هذه القاعدة، بالإضافة إلى الحفاظ على ثبات الحلقة، يجب أيضًا إثبات إثبات التوقف عبر تعبير t يُعرف باسم متغيّر الحلقة، الذي تتناقص قيمته تناقصًا صارمًا وفق علاقة ترتيب < مؤسَّسة جيدًا على مجموعة D خلال كل تكرار. وبما أن < مؤسسة جيدًا، فإن أي تسلسل تناقصي صارم لمتغيرات من D يكون نهائيًا؛ فلا يمكن أن يستمر t في التناقص إلى الأبد. (على سبيل المثال، الترتيب الاعتيادي < مؤسَّس جيدًا على الأعداد الصحيحة الموجبة ، لكنه ليس كذلك على ولا على ؛ وكل هذه المجموعات تُفهم بالمعنى الرياضي لا الحاسوبي، وهي جميعًا لانهائية).
بما أن P هو ثبات الحلقة، يجب أن يُشير الشرط B إلى أن t ليس عنصرًا عنصرًا أدنى في D؛ وإلا فلن يتمكن جسم الحلقة S من إنقاص t أكثر، أي أن مقدم القاعدة سيكون خاطئًا. (هذه إحدى صيغ الصحة الكلية.)
وبالرجوع إلى المثال الأول في القسم السابق، لإثبات الصحة الكلية لـ
يمكن تطبيق قاعدة while للصحة الكلية باختيار D كالأعداد الصحيحة غير السالبة مع الترتيب الاعتيادي، والتعبير t كـ ، مما يتطلب بدوره إثبات:
وبتعبير غير رسمي، يجب إثبات أن المسافة تتناقص في كل دورة من الحلقة، بينما تظل غير سالبة؛ مما يعني أن هذه العملية لا يمكن أن تستمر إلا لعدد محدود من الدورات.
يمكن تبسيط هدف الإثبات السابق إلى:
- ،
ويمكن إثبات ذلك على النحو التالي:
- يتم الحصول عليها باستخدام قاعدة الإسناد،
ويمكن تقويتها إلى باستخدام قاعدة النتيجة.
في المثال الثاني من القسم السابق، من الواضح أنه لا يمكن العثور على أي تعبير t يتم إنقاصه بواسطة جسم الحلقة الفارغ، وبالتالي لا يمكن إثبات الانتهاء.
انظر أيضًا
<div style="-moz-column-count:
- التوكيد (تطوير البرمجيات)
- الدلالات التعيينية
- تصميم بالعقود
- المنطق الديناميكي
- التحقق الشكلي
- ثابت الحلقة
- دلالات محول القضايا
- تحليل البرنامج الساكن
- -webkit-column-count
- التوكيد (تطوير البرمجيات)
- الدلالات التعيينية
- تصميم بالعقود
- المنطق الديناميكي
- التحقق الشكلي
- ثابت الحلقة
- دلالات محول القضايا
- تحليل البرنامج الساكن
- column-count
- التوكيد (تطوير البرمجيات)
- الدلالات التعيينية
- تصميم بالعقود
- المنطق الديناميكي
- التحقق الشكلي
- ثابت الحلقة
- دلالات محول القضايا
- تحليل البرنامج الساكن;">{{{2}}}
ملاحظات
- ^ كتب هوار في الأصل "" بدلاً من "".
- ^ يستخدم هذا المقال أسلوب الاستنتاج الطبيعي لعرض القواعد. على سبيل المثال، تعني بشكل غير رسمي "إذا تحقق كل من α وβ, فإن φ يتحقق أيضًا"؛ وتسمى α وβ بالمقدمات، وφ بالنتيجة. القاعدة التي ليس لها مقدمات تُسمى مسلمة وتُكتب .
- ^ لم تتضمن ورقة هوار عام 1969 قاعدة للصحة الكلية؛ راجع مناقشته في ص. 579 (أعلى اليسار). على سبيل المثال، يُقدِّم كتاب رينولدز المدرسي[6] النسخة التالية من قاعدة الصحة الكلية: حينما يكون z متغيرًا صحيحًا لا يظهر حرًا في P أو B أو S أو t، ويكون t تعبيرًا عدديًا صحيحًا (تمت إعادة تسمية متغيرات رينولدز لتوافق السياق هنا).
المراجع
- ^ ا ب Hoare 1969.
- ^ Floyd 1967.
- ^ Reynolds 2009، Sect. 3.4, p. 64.
- ^ Huth & Ryan 2004.
- ^ Apt & Olderog 2019.
- ^ Reynolds 2009.
البيبليوغرافيا
- Apt، Krzysztof R.؛ Olderog، Ernst-Rüdiger (ديسمبر 2019). "Fifty years of Hoare's logic". Formal Aspects of Computing. ج. 31 ع. 6: 759. DOI:10.1007/s00165-019-00501-3. S2CID:102351597. مؤرشف من الأصل في 2024-09-15.
- Floyd، R. W. (1967). "Assigning meanings to programs" (PDF). Proceedings of the American Mathematical Society. Symposia on Applied Mathematics. ج. 19: 19–31. مؤرشف من الأصل (PDF) في 2025-03-19.
- Hoare، C. A. R. (أكتوبر 1969). "An Axiomatic Basis for Computer Programming". Communications of the ACM. ج. 12 ع. 10: 576–583. DOI:10.1145/363235.363259. S2CID:207726175.
- Huth، Michael؛ Ryan، Mark (26 أغسطس 2004). Logic in Computer Science: modelling and reasoning about systems (ط. second). مطبعة جامعة كامبريدج. ص. XIV, 427. ISBN:978-0521543101.
- Reynolds، John C. (2009) [1998]. Theories of Programming Languages. مطبعة جامعة كامبريدج. ISBN:9780521106979.
- Tennent، Robert D. (2002). Specifying Software. مطبعة جامعة كامبريدج. ص. XII, 289. ISBN:9780521004015. مؤرشف من الأصل في 2024-05-27.
كتاب تعليمي يتضمن مقدمة لمنطق هوار