الفصل الثالث

التفكير الخوارزمي

كمثل الشخصية في مسرحية موليير التي لم تكن تعرف أنها تتحدَّث الشِّعر طوال حياتها، قد لا يدرك الكثيرون أنهم كانوا ينفِّذون «خوارزمية» وهم أطفال حينما كانوا يحلون مسألةَ ضرْب أعداد متعددة الأرقام أو يحلون مسألة قسمة مطوَّلة. في الحقيقة، ربما كان الوضع قبل ستينيات القرن العشرين أن القليل ممن هم من خارج أوساط الحوسبة والرياضيات كانوا يعرفون كلمة «خوارزمية». لكن منذ ذلك الحين، وكما هو الحال مع كلمة «النموذج الفكري» (وهو مصطلح ظهر في المجالات النخبوية لفلسفة العلم)، وجدت كلمة «خوارزمية» طريقها إلى اللغة الدارجة كي تعني الصيغ أو القواعد أو الوصفات أو الإجراءات المنهجية لحل المسائل. هذا يرجع إلى حد كبير إلى الارتباط الوثيق — في العقود الخمسة الماضية أو نحو ذلك — بين الحوسبة والخوارزميات.

لكن «مفهوم» الخوارزمية (إن لم يكن الكلمة) يعود إلى العصور القديمة. أورد الكتاب الرائع «الأصول» (الذي ظهر حوالي ٣٠٠ قبل الميلاد)، والذي أصَّل فيه إقليدس لمبادئ الهندسة المستوية، خوارزمية لإيجاد العامل المشترك الأكبر لعددين صحيحين موجبين. نشأت كلمة «خوارزمية» نفسها في القرن التاسع نسبةً إلى عالِم الرياضيات والفلك العربي محمد بن موسى الخوارزمي، الذي عاش وعمِل في أحد المراكز العلمية الرائدة في عصره، وهو بيت الحكمة في بغداد. وفي واحدة من أطروحات الخوارزمي العديدة في الرياضيات وعلم الفلك، كتب عن «فن الحساب الهندي». القرَّاء اللاحقون للترجمات اللاتينية الذين نسبوا هذا العمل خطأً إلى الخوارزمي أطلقوا على عمله كلمة algorismi، وقد أصبحت في النهاية algorism وتعني الإجراء التدرُّجي. ثم تحوَّلت الكلمة إلى algorithm وتعني الخوارزمية. وأول إشارة وجدها قاموس أكسفورد للغة الإنجليزية لهذه الكلمة كانت في مقالٍ نُشر في دورية علمية إنجليزية عام ١٦٩٥.

دونالد كنوث (الذي لربما كان باعه أطولَ من غيره في جعل الخوارزميات جزءًا من وعي عالِم الكمبيوتر) وصف في إحدى المرات علم الكمبيوتر بأنه دراسة الخوارزميات. لن يتفق كل علماء الكمبيوتر على هذا الرأي، ولكن لا يتصور أحدٌ علم الكمبيوتر من دون أن تكون الخوارزميات في صلب موضوعاته. إنها تشبه نظرية التطور التي وضعها داروين في علم الأحياء؛ إذ يبدو أن كل الطرق في الحوسبة تؤدي إلى الخوارزميات. وإذا كان التفكير من وجهة نظر أحيائية يعني التفكير من وجهة نظر تطوريَّة، فالتفكير من وجهة نظر حوسبيَّة يعني اكتسابَ عادة التفكير الخوارزمي.

اختبار ورقة دَوَّار الشمس

كمدخل لهذا المجال، لنتأمل «اختبار ورقة دَوَّار الشمس» الذي هو من أولى التجارب التي ينفِّذها الطالب في مادة الكيمياء بالمرحلة الثانوية.

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

هذا «إجراء تقريري» يتعلَّمه الطلاب في المراحل المبكِّرة جدًّا من دراستهم لمادة الكيمياء، ويمكن وصفه بالطريقة التالية:
سيرِد الترميز المستخدم هنا كثيرًا في هذا الفصل وبعض الفصول التالية، وحريٌّ بنا توضيحه. بوجه عام، يُستخدم الترميز في التفكير الخوارزمي لسرد خطوات اتخاذِ قرارٍ ما. إذا تحقَّق الشرط ، فإن «تدفُّق التحكم في الخوارزمية» ينتقل إلى المقطع ، وحينها سينفَّذ المقطع . لكن إذا لم يتحقَّق الشرط ، فسينتقل التحكم إلى المقطع ، وحينها سينفَّذ المقطع . وفي كلتا الحالتين، بعد تنفيذ العبارة if then else، ينتقل التحكم إلى العبارة التالية في الخوارزمية.

لاحظ أن منفِّذ التجربة ليس بحاجة إلى معرفة أي شيء عن سبب عمل اختبار ورقة دَوَّار الشمس بالطريقة يعمل بها. هو ليس بحاجة إلى معرفة ماهية «ورقة دَوَّار الشمس» — أي تركيبتها الكيميائية — ولا العملية الكيميائية التي تتسبَّب في تغيير لون الورقة. لتنفيذ التجربة، يكفي تمامًا أن يتعرَّف منفِّذ التجربة على ورقة دَوَّار الشمس عند رؤيتها، وأن يمكنه ربط تغيُّر لون الورقة بالأحماض أو القلويات.

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

هذه الخصائص المجمَّعة لاختبار ورقة دَوَّار الشمس — الذي هو إجراء آلي مضمون أنه سيعطي نتيجة صحيحة في مدة زمنية محددة — هي العناصر الأساسية التي تميِّز الخوارزميات.

متى يكون الإجراء خوارزمية؟

في نظر علماء الكمبيوتر، الخوارزمية ليست مجرد وصفة أو إجراء آلي. وحتى يتأهل الإجراء إلى مرتبة الخوارزمية حسب فهْم علماء الكمبيوتر لهذا المفهوم، فلا بد أن تتوافر به السِّمات التالية (التي كان دونالد كنوث أولَ مَن حدَّدها):
المحدودية. لا بد للخوارزمية من نهاية (بمعنى أنها تتوقف) بعد عدد محدد من الخطوات.
الوضوح الشديد. لا بد من تحديد كل خطوة في الخوارزمية تحديدًا دقيقًا لا لبس فيه.
الفاعلية. كل عملية تنفَّذ كجزء من الخوارزمية يجب أن تكون بسيطة لدرجة تمكِّن الإنسان من تنفيذها بالضبط (باستخدام ورقة وقلم على سبيل المثال).
توافر المُدخلات والمُخرجات. يجب أن تتضمن الخوارزمية مُدخلًا أو أكثر وكذلك مُخرجًا أو أكثر.
لنضرب المَثل بخوارزمية إقليدس الجليلة المذكورة سابقًا لإيجاد العامل المشترك الأكبر للعددين الصحيحين الموجبين و (أي أكبر عدد صحيح موجب يقبل القسمة الصحيحة على العددين و ). ترِد الخوارزمية هنا بلغةٍ تجمع بين اللغة العادية والرموز الرياضية الأولية وبعض الرموز المستخدَمة للدلالة على النتائج (كما هو الحال في مثال اختبار ورقة دَوَّار الشمس). في الخوارزمية، و هما «متغيرا مدخلات» و أيضًا هي «متغير مخرجات». إضافة إلى ذلك، يلزم وجود «متغير مؤقت» ثالث يُرمز إليه بالرمز . وكذلك يوضع «التعليق»، الذي ليس جزءًا من الخوارزمية نفسها، بين القوسين . وللرمز أهمية خاصة في الخوارزمية: فهو يدل على «عملية التعيين»؛ بمعنى أن يُقصد به نسخ أو تعيين قيمة المتغير إلى المتغير .
لنفترض مبدئيًّا أن يساوي و يساوي . إذا «نفَّذ» شخص هذه الخوارزمية باستخدام القلم والورقة، فإن قيم المتغيرات الثلاثة و و بعد تنفيذ كل خطوة ستكون بالشكل التالي:
Step 1:
Step 3:
Step 1:
Step 2:
مثال آخر، لنفترض مبدئيًّا أن يساوي و يساوي . ستكون قيم المتغيرات الثلاثة بعد تنفيذ كل خطوة كما يلي:
Step 1:
Step 3:
Step 1:
Step 3:
Step 1:
Step 3:
Step 1:
Step 2:
في المثال الأول، العامل المشترك الأكبر للعددين ( ، ) هو ، وهو مُخرج الخوارزمية حينما تنتهي؛ وفي المثال الثاني، العامل المشترك الأكبر للعددين ( ، ) هو ، وهو مُخرج الخوارزمية بعدما تنتهي.
من الواضح أن الخوارزمية لها مُدخلات. الأمر الأقل وضوحًا هو ما إذا كانت الخوارزمية ستفي بمعيار المحدودية أم لا. فالخوارزمية تتضمن تكرارًا أو إعادة يمليها الأمر goto ما يجعل التحكم يرجع إلى الخطوة الأولى. وكما هو واضح من المثالين، تتكرَّر الخوارزمية بين الخطوتين الأولى والثالثة حتى يتحقق الشرط ، وعليه تصبح قيمة المخرج وحينها تنتهي الخوارزمية. يبيِّن المثالان بوضوح أنه بالنسبة إلى هذه الأزواج المعينة من قيم المدخلات و ، فدائمًا ما تفي الخوارزمية ﺑ «معيار الإنهاء» وستتوقف حينها. لكن كيف نعرف ما إذا كانت أزواج القيم الأخرى لن تظل تتكرر إلى ما لانهاية وتتبدل بين الخطوتين الأولى والثالثة وتؤدي إلى عدم إنتاج مخرجات البتة؟ (في هذا الموقف، ستخرق الخوارزمية كلًّا من معيار المحدودية ومعيار توافر المخرجات.) وكيف نعرف أن الخوارزمية ستفرغ من العمل دومًا فيما يتعلق بكل القيم الموجبة الممكنة للمتغيرين و ؟
الإجابة هي أنه يجب التأكد من أن الخوارزمية لها نهاية بوجه عام. يكمُن هذا في أنه بعد كل اختبار للشرط في الخطوة الثانية، تكون قيمة أقل من العدد الصحيح الموجب ، وقيمتا و تقلان مع كل تنفيذ للخطوة الأولى. لا بد أن يصل التسلسل المتناقص للأعداد الصحيحة الموجبة في النهاية إلى القيمة ، وفي النهاية يتحقق الشرط ، ومن ثَم ينتهي الإجراء في نهاية المطاف بمقتضى الخطوة الثانية.
ماذا عن معيار الوضوح الشديد؟ ينص هذا المعيار على ضرورة تحديد كل خطوة في الخوارزمية تحديدًا دقيقًا. ويجب تحديد الإجراءات المراد تنفيذها بما لا يدع مجالًا للغموض. وهنا تظهر «اللغة» في الصورة. يستخدم وصف خوارزمية إقليدس مزيجًا من اللغة والرموز الرياضية التي يشوبها الغموض. والشخص الذي ينفِّذ تلك الخوارزمية عقليًّا (باستخدام الورقة والقلم) من المفترض أن يفهم معنى القسمة والباقي والأعداد الصحيحة فهمًا دقيقًا. لا بد أن يفهم معنى الترميز الصوري أكثر، مثل الرموز if…then…else وgoto.

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

«المضي قُدُمًا وأداء عملية الضرب»

يرتبط مفهوم «التجريد» بمواصفات الخوارزميات. بعبارة أخرى، يمكن حل مسائل معينة باستخدام خوارزميات محددة على مستويين مختلفين أو أكثر من مستويات التجريد.

قبل اختراع حاسبات الجيب، كان الأطفال يتعلمون مسائل الضرب باستخدام الورقة والقلم. وما يلي هو ما تعلمته في صغري. ولأغراض التبسيط، لنفترض أن عددًا مكوَّنًا من ثلاثة أرقام (المضروب) يُضرب في عدد مكوَّن من رقمين (المضروب فيه).

  • الخطوة ١: نكتب العددين بحيث يكون المضروب في الصف العلوي والمضروب فيه في الصف السفلي، ونحاذي رقم آحاد المضروب فيه بحيث يكون تحت رقم آحاد المضروب بالضبط.
  • الخطوة ٢: نرسم خطًّا أفقيًّا تحت المضروب فيه.
  • الخطوة ٣: نضرب المضروب في رقم آحاد المضروب فيه ونكتب الناتج (حاصل الضرب الجزئي) تحت الخط الأفقي، ونكتب الناتج بحيث نحاذي كل أرقام الآحاد.
  • الخطوة ٤: نضع تحت رقم آحاد حاصل الضرب الجزئي الذي حصلنا عليه من الخطوة الثالثة.
  • الخطوة ٥: نضرب المضروب في رقم عشرات المضروب فيه ونكتب الناتج (حاصل الضرب الجزئي) في الصف الثاني تحت الخط الأفقي على يسار الرقم .
  • الخطوة ٦: نرسم خطًّا أفقيًّا آخر تحت حاصل الضرب الجزئي الثاني.
  • الخطوة ٧: نجمع حاصلَي الضرب الجزئيَّين، ونكتب ناتج الجمع تحت الخط الأفقي الثاني.
  • الخطوة ٨: تنتهي المسألة. فالعدد تحت الخط الأفقي الثاني هو حاصل الضرب المطلوب.

لاحظ أن تنفيذ هذا الإجراء يتطلب أن يكون لدى الطفل بعض المعرفة المسبقة: أولًا، يجب أن يعرف طريقة ضرْب عدد مكوَّن من عدة أرقام في عدد مكوَّن من رقم واحد. ينطوي هذا على ضرورة حفظ جدول الضرب لعددين يتكوَّن كلٌّ منهما من رقم واحد، أو إمكانية الوصول إلى جدول الضرب. ثانيًا، لا بد أن يعرف طريقة جمع الأعداد المكوَّنة من رقمين أو أكثر، ويجب أن يعرف طريقة التعامل مع مسائل الجمع بالحمل. ثالثًا، يجب أن يعرف طريقة جمع عددين مكوَّنين من عدة أرقام.

مع ذلك، ليس الطفل بحاجةٍ إلى معرفةِ أو فهْمِ «السبب» في محاذاة العددين طبقًا للخطوة الأولى؛ ولا «سبب» نقلِ حاصل الضرب الجزئي الثاني موضعًا واحدًا جهةَ اليسار طبقًا للخطوة الخامسة، ولا «سبب» إدخال في الخطوة الرابعة، ولا «سبب» الحصول على حاصل الضرب الصحيح بعد جمع حاصلَي الضرب الجزئيين في الخطوة السابعة.

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

لنتفكر كيف ينفِّذ معظمنا عمليةَ الضرب في هذه الأيام. سنُخرج حاسبة الجيب (أو الهاتف الذكي) من جيوبنا، وسنبدأ في استخدام الحاسبة كما يلي:
  • الخطوة ١: نُدخل المضروب.
  • الخطوة ٢: نضغط على علامة ×.
  • الخطوة ٣: نُدخل المضروب فيه.
  • الخطوة ٤: نضغط على علامة =.
  • الخطوة ٥: نتوقَّف. يظهر حاصل الضرب على الشاشة.

هذه أيضًا خوارزمية ضرب. تعطي الخوارزميتان حاصل الضرب ذاته ولكنهما على مستويين مختلفين من التجريد. ولا يعرف المستخدِم ما الذي يحدث تحديدًا عند تنفيذ الخطوات من الأولى إلى الرابعة في الخوارزمية الثانية. ربما الحاسبة تنفِّذ الخوارزمية ذاتها التي تنفَّذ بالورقة والقلم. وربما أيضًا تستخدم طريقةَ تنفيذ مختلفة. فالمستخدم لا يرى هذه المعلومات.

مستويات التجريد في هذا المثال تنطوي أيضًا على مستويات من «الجهل». فالطفل الذي يستخدم خوارزمية الورقة والقلم يعرف معلومات عن عملية الضرب أكثرَ من الشخص الذي يستخدم حاسبة الجيب.

ثبات الخوارزميات

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

هذا يفسِّر عدم اعتبار الوصفات المذكورة في كتب الطهي ضمن الخوارزميات؛ فكثيرًا ما تتضمَّن هذه الوصفات خطوات غامضة، ومن ثَم تقوِّض معيار الوضوح الشديد. على سبيل المثال، قد تتضمَّن هذه الوصفات تعليمات لإضافة مكونات «مهروسة قليلًا» أو «مبشورة بشرًا ناعمًا» أو نصيحة «للطهي على نار هادئة». هذه التعليمات بالغة الغموض ولا تفي بالشروط التي ينبغي توافرها في الخوارزمية. بل إنها تُترك لحَدْس الطاهي وخبرته وحكمه كي يفسِّرها. وهذا يفسِّر سببَ اختلاف مذاق الطبق ذاته الذي أعدَّه طاهيان مختلفان بالوصفة ذاتها، أو لماذا يختلف مذاق الوصفة ذاتها التي أعدَّها شخص واحد في مناسبتين مختلفتين. فهذه الوصفات تخلُّ بمبدأ الحسم.

الخوارزميات أدوات مجردة

لا شك أن الخوارزمية أداة؛ فقد صمَّمها الإنسان أو ابتكرها كي يحقق أهدافه أو احتياجاته. وبقدرِ ما أنها تعالج البنيات الرمزية (كما في حالة خوارزميتي الضرب والعامل المشترك الأكبر)، فإنها أدوات حوسبية. (ليست جميع الخوارزميات تعالج البنيات الرمزية؛ فاختبار ورقة دَوَّار الشمس يتطلَّب كيانات مادية — أنبوب سائل الاختبار، وشريحة ورقة دَوَّار الشمس — باعتبارهما المدخلات، وينتج حالة فيزيائية — لون شريحة ورقة دَوَّار الشمس — باعتبارها المخرجات. إن اختبار ورقة دَوَّار الشمس عبارة عن خوارزمية يدوية تعمل بناءً على كيانات فيزيائية وكيميائية وليس بنيات رمزية؛ ومن ثَم لا يجدُر بنا اعتبارها أداة حوسبية.)

لكن الخوارزميات في حد ذاتها ليس لها وجود مادي، سواء أكانت حوسبية أم غير ذلك. فالإنسان لا يستطيع لمسها أو إمساكها أو تحسُّسها أو تذوُّقها أو سماعها. وهي لا تخضع لقوانين علوم الفيزياء ولا الكيمياء ولا حتى قوانين الهندسة. بل هي «أدوات مجردة». إنها تتألَّف من البنيات الرمزية التي — شأنها شأن كل البنيات الرمزية — تمثِّل أشياء في العالم، وقد تكون هذه الأشياء مادية (كورقة دَوَّار الشمس، والمواد الكيميائية، والأزرار في حاسبة الجيب، وغيرها) أو مجردة (كالأعداد الصحيحة، والعمليات المنفذة على الأعداد الصحيحة، والعلاقات مثل التساوي، وغير ذلك).

الخوارزمية أداة مساعدة. وكما هو الحال مع معظم الأدوات المساعدة، كلما قل احتياج المستخدِم إلى معرفة المفاهيم النظرية في الخوارزمية، زادت فاعليتها بالنسبة إليه.

هذا يثير النقطة التالية: يمكن اعتبار الخوارزمية أداة لها وجهان مثل يانوس. (يانوس هو إله البوابات الروماني الذي كان ينظر في اتجاهين معاكسين في آن واحد.) يتطلب «تصميم» الخوارزمية أو «ابتكارها» إبداعًا في العموم، ولكن «استخدامها» عبارة عن عمل ميكانيكي صِرف ويتطلب القليل من التفكير الإبداعي. وإن جاز التعبير، فالخوارزمية شكلٌ من أشكال التفكير غير الواعي.

الخوارزميات معرفة «إجرائية»

الخوارزميات أدواتٌ ينشئها المستخدِمون لحل المسائل. وبمجرد صياغتها وإتاحتها للعامة، تصبح ملكًا للعالم. هذا ما يجعل الخوارزميات أدواتٍ موضوعية (وكذلك ثابتة). لكن الخوارزميات تُعَد تجسيدًا للمعرفة أيضًا. وحيث إنها أدوات موضوعية، فهي تجسيدٌ لما يطلق عليه فيلسوف العلم كارل بوبر «المعرفة الموضوعية». (قد يبدو متناقضًا إذا قلنا إن مستخدم الخوارزمية «مفكِّر غير واعٍ» وفي نفس الوقت «كائن عالم»، ولكن حتى التفكير غير الواعي يظل تفكيرًا، والتفكير يستلزم البناء على المعرفة بأحد أشكالها.) لكن ما نوع المعرفة التي تمثِّلها الخوارزمية؟

في العلوم الطبيعية، نتعلم التعريفات والحقائق والنظريات والقوانين وغير ذلك. وفيما يلي بعض الأمثلة من مبادئ الفيزياء والكيمياء.

  • (١)
    سرعة الضوء المتَّجهة في فراغ تساوي ألف ميل في الثانية.
  • (٢)

    التسارع هو معدَّل تغيُّر السرعة المتجهة.

  • (٣)
    الوزن الذري للهيدروجين يساوي .
  • (٤)

    للمادة أربع حالات وهي الصلبة والسائلة والغازية والبلازما.

  • (٥)

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

  • (٦)

    الاحتراق يتطلب وجود الأكسجين.

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

أي خاصية تنطبق على الصفر وكذلك على العدد التالي مباشرةً لعددٍ تتوافر به هذه الخاصية، تنطبق على كل الأعداد.

وعلى النقيض من ذلك، تندرج مبرهنة فيثاغورس ضمن المعرفة التقريرية في الهندسة المستوية عن طريق التفكير المنطقي (البرهان):

في المثلث القائم الزاوية، مربع الوتر يساوي مجموع مربعَي طولَي الضلعين الآخرين.

وفيما يلي مثال على المعرفة التقريرية في الرياضيات عن طريق التعريف:

مضروب العدد الصحيح غير السالب هو:

على الجانب الآخر، لا تُعدُّ الخوارزمية تقريرية؛ بل هي إجراء يوضح كيفية إنجاز شيءٍ ما. إنها تصف عملًا من نوعٍ ما. وعليه، فإن الخوارزمية مثال على «المعرفة الإجرائية»، أو بالمعنى الدارج المعرفة «العملية».

وبالنسبة إلى عالِم الكمبيوتر، لا يكفيه أن يعرف أن مضروب العدد يُعرَّف بكذا وكذا. فهو يريد أن يعرف طريقةَ حساب مضروب عددٍ ما. بعبارة أخرى، هو بحاجة إلى خوارزمية. على سبيل المثال:
الترميز Repeat S until C يحدِّد «تكرارًا» أو «حلقة تكرارية». وهذا يعني أنه سيتكرَّر تنفيذ العبارة (العبارات) إلى أن يتحقق الشرط . وعندما يحدث هذا، تنتهي الحلقة التكرارية ويتدفَّق التحكم إلى العبارة التي تلي التكرار.
في الخطوة الأولى من هذا المثال، عُينت القيمة إلى fact (المضروب). وإذا كانت قيمة تساوي أو ، فلن يتحقق الشرط في الخطوة الثانية، وفي هذه الحالة سينتقل التحكم إلى الخطوة السادسة مباشرةً وتصبح قيمة المضروب وتنتهي الخوارزمية عند الخطوة السابعة. على الجانب الآخر، إذا كانت قيمة ليست أو ، يتكرر تنفيذ «الحلقة التكرارية» المشار إليها بالمقطع Repeat…until وفي كل مرة تتناقص قيمة بمقدار حتى يتحقَّق «شرط إنهاء» الحلقة التكرارية . عندئذٍ ينتقل التحكم إلى الخطوة السادسة التي عند تنفيذها تعطي قيمةَ المضروب بالشكل التالي: .

لاحظ أنه يمكن تقديم المفهوم ذاته — المضروب — بطريقة تقريرية (كما يفضِّل علماء الرياضيات) وبطريقة إجرائية (كما يحب علماء الكمبيوتر). في الحقيقة، يطرح الشكل التقريري «النظرية» الأساسية («ما المضروب؟») للشكل الإجرائي أو الخوارزمية («كيف نحسب المضروب؟»).

باختصار، تعبِّر الخوارزميات عن شكلٍ من أشكال المعرفة الإجرائية التي تتسم بالموضوعية أيضًا.

تصميم الخوارزميات

عندما نفكِّر في «تصميم» الخوارزميات، فإن تجريدها له تبِعات مثيرة للفضول. يرجع السبب في ذلك بوجه عام إلى أن التصميم عملٌ هادف (ذو غرض محدَّد) يبدأ بمجموعة من المتطلبات المراد تحقيقها باستخدام أداة لم تُنشأ بعد، وينتهي ببنية رمزية تمثِّل الأداة المطلوبة. في الحالات العادية، تكون البنية الرمزية هذه هي التصميم الخاص بالأداة . ويكون هدف المصمِّم هو إنشاء هذا التصميم بحيث إذا نُفِّذت تلك الأداة طبقًا له فإنها ستفي بالمتطلبات .
لا ينطوي هذا السيناريو على مشاكل حينما تكون الأداة مادية؛ فتصميم جسر على سبيل المثال سيكون تمثيلًا لهيكل الجسر في صورة رسومات هندسية ومجموعة من العمليات الحسابية والمخطَّطات التي توضِّح القوى العاملة على الهيكل. لكن في حالة اعتبار الخوارزميات كأدوات، فإن الأداة ذاتها بنيةٌ رمزية. ومن ثَم يصبح الحديث عن تصميم خوارزمية حديثًا عن بنية رمزية (التصميم) التي تمثِّل بنيةً رمزية أخرى (الخوارزمية). وهذا ينطوي على قدرٍ من الحيرة.
وهكذا في حالة الخوارزميات يكون من المنطقي والمعقول أكثر اعتبار التصميم والأداة شيئًا واحدًا. فمهمة تصميم خوارزمية هي مهمة إنشاء بنية رمزية تكون هي الخوارزمية بحيث إن تحقِّق المتطلبات .

الكلمة المهمة في هذا المقام هي «إنشاء». إن عملية التصميم عملٌ إبداعي، وكما أوضح الباحثون في مجال الإبداع، فالعمل الإبداعي مزيجٌ معقَّد من الإدراك والمنطق والحَدْس والمعرفة وحسن التقدير والدهاء والاكتشافات التي تتم مصادفة. ومع ذلك يتحدَّث واضعو نظريات التصميم عن «علم التصميم» أو «منطق التصميم».

فهل يوجد إذن جانبٌ علمي في تصميم الخوارزميات؟ الإجابة هي: «إلى حدٍّ ما». توجد ثلاثة أوجه أساسية يدخل بها «المنهج العلمي» في تصميم الخوارزميات.

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

بعبارة أخرى، قد يكون لأشكال التفكير المختلفة تأثيرٌ في تصميم الخوارزمية بناءً على كمٍّ من المعرفة المقرَّرة أو المجرَّبة أو المثبَتة (والتي تكون تقريرية وإجرائية على حد سواء). سنطلق على ذلك اسم «عامل المعرفة» في تصميم الخوارزمية.

لكن مجرد التوصُّل إلى الخوارزمية ليس كافيًا. فهناك أيضًا ضرورة إقناع النفس والآخرين بأن الخوارزمية «صالحة». وتنطوي هذه الضرورة على اتباع التفكير المنهجي في توضيح أن الخوارزمية تستوفي المتطلبات الأصلية. سأطلق على ذلك اسم «عامل الصلاحية» في تصميم الخوارزميات.

وأخيرًا، وحتى لو ثبَت أن الخوارزمية صالحة، فربما لا يكون هذا كافيًا. فثمَّة مسألة أداء الخوارزمية: ما مدى كفاءة الخوارزمية؟ وسنطلق على ذلك اسم «عامل الأداء» في تصميم الخوارزمية.

تنطوي هذه «العوامل» الثلاثة على أنواع التفكير والمنطق وقواعد البرهان التي نربطها عادةً بالعلم. فلنتناول بشيء من الأمثلة كيفيةَ إسهامها في علم تصميم الخوارزميات.

مشكلة تحويل التعبيرات الحسابية

توجد فئةٌ من برامج الكمبيوتر تسمَّى «البرامج المترجِمة» ووظيفتها تحويل البرنامج المكتوب بلغة برمجة عالية المستوى (وهي لغة تكون مستقلة عن سمات أجهزة الكمبيوتر المادية الفعلية، مثل لغة فورتران أو سي++) إلى سلسلة تعليمات يمكن لأجهزة كمبيوتر مادية خاصة تنفيذها (تفسيرها) مباشرةً. ويطلق على سلسلة التعليمات الخاصة بالآلة اسم «لغة الآلة». (سنتناول لغات البرمجة في الفصل الرابع.)

واجه كتَّاب البرامج المترجِمة الأوائل (في أواخر خمسينيات القرن العشرين وستينياته) مشكلةً تقليدية وهي صياغة خوارزميات تحوِّل «التعبيرات الحسابية» التي تظهر في البرنامج إلى لغة آلة. ومن الأمثلة على ذلك التعبير:

في هذا المثال، العلامات + و– و و/ هي العوامل الحسابية الأربعة؛ ويطلق على المتغيرات و و و والرقم الثابت اسم «المعاملات». كذلك يطلق على التعبير بهذه الصيغة والذي تظهر فيه العوامل الحسابية بين معاملَيْه اسم «التعبير المرتب وسطيًّا».
وفضاء المعرفة الذي يحيط بتلك المسألة (ويحوزه مصمم الخوارزمية) يتضمَّن «قواعد الأسبقية» التالية الخاصة بالعوامل الحسابية:
  • (أ)
    في حالة غياب الأقواس، تكون الأسبقية لعاملَي الضرب والقسمة / على عاملَي الجمع + والطرح –.
  • (ب)
    عاملا الضرب والقسمة / يستويان في مستوى الأسبقية، وعاملا الجمع + والطرح – يستويان في مستوى الأسبقية.
  • (جـ)

    إذا ظهر في التعبير عوامل ذات مستوى أسبقية واحد، يصبح ترتيب الأسبقية من اليسار إلى اليمين. بمعنًى آخر، تطبَّق العوامل على المعاملات بالترتيب الموجودة به من اليسار إلى اليمين.

  • (د)

    التعبيرات الموجودة داخل الأقواس لها أعلى درجات الأسبقية.

من ثَم، في التعبير الوارد فيما سبق على سبيل المثال، سيكون ترتيب العوامل بالشكل التالي:
  • (أ)
    نفِّذ . وأطلق على النتيجة .
  • (ب)
    نفِّذ . وأطلق على النتيجة .
  • (جـ)
    نفِّذ . وأطلق على النتيجة .
  • (د)
    نفِّذ .

على الجانب الآخر، إذا كان التعبير خاليًا من الأقواس كما يلي:

فإن ترتيب العوامل سيكون بالشكل التالي:
  • (١)
    نفِّذ . وأطلق على النتيجة .
  • (٢)
    نفِّذ . وأطلق على النتيجة .
  • (٣)
    نفِّذ . وأطلق على النتيجة .
  • (٤)
    نفِّذ .

يمكن تصميم خوارزمية لإنشاء لغة آلة بحيث تقيِّم عند تنفيذها التعبيرات الحسابية المرتبة وسطيًّا تقييمًا صحيحًا طبقًا لقواعد الأسبقية. (ستعتمد الطبيعة المحددة للخوارزمية على طبيعة التعليمات المعتمدة على الآلة، والتي تختلف حسب جهاز الكمبيوتر المادي المحدد.) ومن ثَم وبناءً على قواعد الأسبقية، تستعين الخوارزمية بقواعدَ دقيقة هي جزء من فضاء المعرفة ذات الصلة بالمسألة. كذلك ولأن الخوارزمية تعتمد على قواعد الأسبقية اعتمادًا مباشرًا، فإن إثبات صلاحية الخوارزمية سيصبح يسيرًا إلى حد بعيد. لكن وكما توضِّح الأمثلة السابقة، تزيد الأقواس إلى حدٍّ ما من تعقيد عملية تحويل التعبير المرتَّب وسطيًّا.

وثمَّة ترميزٌ لتحديد التعبيرات الحسابية من دون الحاجة إلى الأقواس من ابتكار عالِم المنطق البولندي يان ووكاسيفيتش (١٨٧٨–١٩٥٦)، ومن ثَم أصبح معروفًا باسم «الترميز البولندي». يطلق على إحدى صيغ هذا الترميز «الصيغة البولندية العكسية»، وفيها يأتي العامل الحسابي بعد المعاملَين مباشرةً في صورة تعبير بولندي عكسي. توضح الأمثلة التالية الصيغةَ البولندية العكسية لبعض التعبيرات المرتَّبة وسطيًّا.

  • (أ)
    بالنسبة إلى التعبير ، الصيغة البولندية العكسية هي .
  • (ب)
    بالنسبة إلى التعبير ، الصيغة البولندية العكسية هي .
  • (جـ)
    بالنسبة إلى التعبير ، الصيغة البولندية العكسية هي .
  • (د)
    بالنسبة إلى التعبير ، الصيغة البولندية العكسية هي .

يتقدَّم تقييم التعبير البولندي العكسي من اليسار إلى اليمين بطريقة مباشرة، ومن ثَم يزيد من سهولة مسألة الترجمة. تنص القاعدة على أن العوامل الحسابية الواردة في التعبير تنطبق على معاملاتها السابقة عليها حسب ترتيب ظهور العوامل، من اليسار إلى اليمين. على سبيل المثال، في حالة التعبير المرتَّب وسطيًّا:

الصيغة البولندية العكسية هي:

وترتيب التقييم هو:
  • (١)
    نفِّذ وأطلق على النتيجة . ومن ثَم يكون التعبير الناتج هو .
  • (٢)
    نفِّذ وأطلق على النتيجة . ومن ثَم يكون التعبير الناتج هو .
  • (٣)
    نفِّذ وأطلق على النتيجة . ومن ثَم يكون التعبير الناتج هو .
  • (٤)
    نفِّذ .

بالطبع سيكتب المبرمجون التعبيرات الحسابية بالصيغة المرتبة وسطيًّا المعتادة. وسينفذ البرنامج المترجِم خوارزمية ستحوِّل تلك الصيغ إلى صيغة بولندية عكسية أولًا، ثم يولِّد لغة آلة من التعبيرات البولندية العكسية.

مسألة تحويل التعبيرات من الصيغة المرتبة وسطيًّا إلى الصيغة البولندية العكسية توضِّح مدى إمكانية اجتماع أساس نظري سليم واستراتيجية تصميم مجربة أثناء تصميم خوارزمية يمكن إثبات صحتها.

يطلق على استراتيجية التصميم «الاستدعاء الذاتي»، وهي حالة خاصة من استراتيجية أشمل لحل المسائل تُعرف باسم «فرِّق تسُد». في الاستراتيجية الثانية، في المسألة ، إذا كان يمكن تقسيم المسألة إلى مسائل فرعية أصغر ، و ، و… ، فجد حل كل مسألة فرعية على حدة، ثم اجمع حلول المسائل الفرعية للحصول على حل المسألة الأساسية .
في الاستدعاء الذاتي، تنقسم المسألة إلى عدد من المسائل الفرعية من النوع ذاته مثل المسألة ولكنها أصغر. ثم تنقسم المسألة الفرعية إلى مسائلَ فرعية أصغر من النوع ذاته، وهكذا إلى أن تصبح المسائل الفرعية صغيرةً وبسيطة لدرجة أنه يمكن حلها مباشرةً. عندئذٍ تُجمع حلول المسائل الفرعية لإيجاد حلول المسائل الفرعية «الأكبر»، ثم تُجمع حلول المسائل الفرعية الأكبر لإيجاد حلول المسائل الأكبر حتى نصل إلى حل المسألة الأصلية .

انظر الآن في مسألة تحويل التعبيرات من الصيغة المرتبة وسطيًّا إلى الصيغة البولندية العكسية في الخوارزميات. وهذه المسألة قائمة على مجموعة من القواعد الصورية:

لنفترض أن هي مجموعة العوامل الحسابية الثنائية (بمعنى أن كل عامل في له معاملان بالضبط). ولنفترض أن يرمز إلى أحد المعاملات. ولنفترض أيضًا أنه إذا كان تعبير ذو صيغة مرتبة وسطيًّا هو فستكون صيغته البولندية العكسية هي . إذن:
  • (أ)
    إذا كان معاملًا فرديًّا هو ، فستكون الصيغة البولندية العكسية هي .
  • (ب)
    إذا كان تعبيرًا مرتبًا وسطيًّا وكان أحد عناصر ، فإن التعبير البولندي العكسي المقابل له هو .
  • (جـ)
    إذا كان تعبيرًا مرتبًا وسطيًّا، فستكون صيغته البولندية العكسية هي .
تظهر الخوارزمية الذاتية الاستدعاء المكوَّنة مباشرةً من هذه القواعد بعد ذلك في صورة «دالة» — بالمعنى الرياضي للكلمة. في الرياضيات، الدالة التي تطبق على قيمة «المُدخل» ويُرمز إليها بالدالة أو تُنتج قيمة الدالة للمُدخل . على سبيل المثال، الدالة المثلثية الخاصة بجيب الزاوية التي تطبق على المُدخل (درجة)، ويرمز إليها كما يلي: ، تنتج القيمة . كذلك دالة الجذر التربيعي التي يُرمز إليها بالرمز وتطبق على مُدخل، ولنقل (ومن ثَم تصبح )، تنتج القيمة .
وبناءً على ذلك، فإن الخوارزمية المسماة هنا التي مُدخلها التعبير المرتب وسطيًّا تصبح بالشكل التالي:
في الخطوة الثالثة، الصيغة العامة حالة خاصة من صيغة القرار If then else: بمعنى ألا يتدفق التحكم إلى إلا إذا تحقَّق الشرط ، وإلا فسيتدفق التحكم إلى العبارة التي تلي if then.
من ثَم يمكن للدالة أن تنشِّط نفسها على نحوٍ ذاتي الاستدعاء باستخدام قيم مُدخلات «أصغر». ولا يخفى أن دالة هي تنفيذ مباشر لقواعد التحويل، ومن ثَم فهي صحيحة من حيث التركيب. (بالطبع ليست كل الخوارزميات صحيحة بهذا الوضوح؛ قد يكون أساسها النظري أكثر تعقيدًا بكثير، ويجب حينها إثبات صحتِها من خلال حجة دقيقة أو حتى شكل من أشكال البراهين الرياضية؛ أو قد يكون أساسها النظري ضعيفًا أو لا وجود له حتى.)

لتوضيح كيف تعمل الخوارزمية مع المدخلات الفعلية، انظر الأمثلة التالية:

كفاءة الخوارزميات باعتبارها أدوات نفعية

قلنا سابقًا إن الأمر لا يقتصر على تصميم خوارزمية صحيحة. وكما هو الحال مع مصمم أي أداة نفعية، يجب أن يهتم مصمم الخوارزمية بمدى «كفاءة» هذه الخوارزمية؛ أي، مدى فاعليتها في القيام بمهامها. فهل يمكننا «قياس» كفاءة الخوارزمية بناءً على هذا المعنى؟ هل يمكننا عملُ مقارنة نوعية بشكلٍ ما بين خوارزميتين متنافستين تؤديان المهمة ذاتها؟

عامل الكفاءة الجليُّ هو مقدار الوقت الذي تستغرقه الخوارزمية في تنفيذ المهمة. لكن الخوارزمية أداة مجرَّدة. فلا يمكننا قياسها بالزمن الفعلي؛ لا يمكننا قياس الزمن على ساعة حقيقية؛ حيث إن الخوارزمية كخوارزمية لا تتضمن أيَّ شيء مادي. فإذا كنت أنا الإنسان أنفِّذ خوارزمية، فيُفترض أن بإمكاني قياسَ مقدار الوقت الذي استغرقته في تنفيذ الخوارزمية ذهنيًّا (ربما باستخدام الورقة والقلم). لكن هذا ليس إلا قياسًا «لأدائي أنا» للخوارزمية بناءً على مجموعة معينة من المعطيات. واهتمامنا ينصبُّ على قياس أداء الخوارزمية عبْر كل مُدخلاتها المحتملة وبغضِّ النظر عمن ينفِّذ الخوارزمية.

لكن في نهاية المطاف، يفترض مصمِّمو الخوارزميات أن كل خطوة أساسية في الخوارزمية تستغرق وحدةَ الزمن ذاتها. اعتبر هذه الوحدة «زمنًا مجردًا». كذلك فهم يتصورون حجم المسألة التي صُمِّمت الخوارزمية من أجلها من حيث عدد عناصر البيانات المعنية بها المسألة. حينها يعتمدون مقياسين ﻟ «كفاءة» الخوارزميات. المقياس الأول له صلة بأسوأ أداء محتمل للخوارزمية باعتبارها دالة لحجم المسألة ؛ ويتعلَّق المقياس الثاني بمتوسط الأداء في صورة دالة لحجم المسألة . ويطلق على المقياسين اسم «تعقيد الوقت». (وهناك مقياس بديل وهو تعقيد المساحة: والمقصود به مقدار مساحة الذاكرة (المجردة) اللازمة لتنفيذ الخوارزمية.)

متوسط تعقيد الوقت هو مقياس الكفاءة الأكثر واقعية، ولكنه يتطلب استخدام الاحتمالات، ومن ثَم تزيد صعوبة تحليله. وفي هذا المقام، لن نتناول غير سيناريو أسوأ الحالات.

انظر المسألة التالية. لديَّ قائمة تضم العدد من العناصر. وكل عنصر يحتوي على اسم طالب وعنوان بريده الإلكتروني. والقائمة مرتبة أبجديًّا حسب الاسم. تدور المسألة حول البحث في القائمة وإيجاد عنوان البريد الإلكتروني لاسم طالب بعينه.

أبسط طريقة هي البدء من عند رأس القائمة ومطابقة كل جزء من الاسم بالعنصر المعطَى من اسم الطالب، والتقدُّم عبْر القائمة اسمًا باسم حتى نجد تطابقًا، ثم نخرج عنوان البريد الإلكتروني المقابل له. (لغرض التبسيط، سنفترض أن اسم الطالب المعطى في مكانٍ ما بالقائمة.) يُطلق على هذه الخوارزمية اسم «خوارزمية البحث الخطي».

في هذا المثال، الترميز العام يحدِّد شكلًا جديدًا من التكرار ويعني أنه بما أن الشرط تحقَّق، كرر تنفيذ العبارة («متن الحلقة التكرارية») . وعلى النقيض من الترميز ، يُختبر شرط الحلقة التكرارية قبل إدخال متنها في كل تكرار.
في سيناريو أسوأ حالة ممكنة، تظهر الإجابة المطلوبة في الإدخال الأخير (ذات الترتيب ). لذا في سيناريو الحالة الأسوأ، ستتكرر حلقة While التكرارية عدد من المرات. في هذه المسألة، تكون قيمة — والتي تمثِّل عدد الطلاب في القائمة — هي العامل الحاسم والمحوري: هذا هو حجم المسألة.
لنفترض أن كل خطوة تستغرق مقدار الوقت ذاته تقريبًا. في أسوأ الحالات، تحتاج خطوات هذه الخوارزمية مقدار الوقت خطوات زمنية حتى تعثر على النتيجة المطابقة. لنفترض أن قيمة