التكرار المشترك
في علوم الحاسوب ، يُعدّ الاستدعاء المشترك نوعًا من العمليات يُقابل الاستدعاء ( البنيوي) . فبينما يستهلك الاستدعاء بنية البيانات بمعالجة الطبقة العليا أولًا قبل النزول إلى أجزائها الداخلية، يُنتج الاستدعاء المشترك بنية البيانات بتعريف الطبقة العليا أولًا قبل تعريف أجزائها الداخلية. ويكتسب الاستدعاء المشترك أهمية خاصة في اللغات الشاملة ، إذ يسمح بترميز العمليات الحسابية التي قد لا تنتهي في سياقٍ يجب فيه إنهاء كل دالة. وهو مدعوم من قِبل مُثبتي النظريات Agda [ 1 ] وRocq [ 2 ] .
يمكن اعتبار كل من الاستدعاء المشترك والاستدعاء المتكرر بمثابة عمليات تعمل على الأشجار ، والتي تتضمن بنية البياناتتُعتبر القوائم والجداول حالات خاصة. ولأن الاستدعاء الذاتي يجب أن ينتهي، فإنه يعمل فقط على الأشجار ذات الأساس الجيد ، أي غير اللانهائية العمق، والتي تُسمى البيانات أو أنواع البيانات الأولية ؛ من ناحية أخرى، يُنتج الاستدعاء الذاتي المشترك بيانات مُكملة أو أنواع البيانات النهائية ، والتي تشمل الأشجار اللانهائية العمق. لا يمكن تمثيل البيانات المُكملة في الذاكرة مباشرةً، لذلك غالبًا ما يتم تنفيذها باستخدام هياكل البيانات ذاتية المرجعية أو التقييم الكسول .
البيانات والبيانات المشفرة
في لغات البرمجة الكلية، يمكن تعريف الأعداد الطبيعية على النحو التالي (باستخدام صيغة هاسكل [ a ] ):
بيانات طبيعية = صفر | طبيعية متتابعةينص هذا على أن كل عدد طبيعي إما أن يكون صفرًا أو العدد التالي لعدد طبيعي موجود. على سبيل المثال، يُرمز للعدد واحد بالرمز 1/2، وللعدد Succ Zeroاثنين بالرمز 2/3 Succ (Succ Zero)، وللعدد ثلاثة بالرمز 3/4، Succ (Succ (Succ Zero))وهكذا.
إذا فسرنا التصريح أعلاه بطريقة استقرائية ، فإن جميع الأعداد الطبيعية تُولّد بهذه الطريقة، فنحصل على مجموعتنا المألوفة من الأعداد الطبيعية. والأهم من ذلك، يمكننا استخدام الاستدعاء الذاتي [ b ] على هذه المجموعة: على سبيل المثال، يمكننا استخدامها لإنشاء قائمة تتكرر فيها قيمة معينة nعددًا من المرات.
كرر :: أ -> طبيعي -> [ أ ] كرر س صفر = [] -- الحالة الأساسية كرر س ( متتالي ن ) = س : كرر س ن -- خطوة استقرائيةلاحظ أن استخدام ` repeat x nthis` أمرٌ بالغ الأهمية، إذ لم يكن بإمكاننا كتابة `this` repeat x (Succ n)، لأنها الدالة التي نحاول تعريفها، وبالتالي ستدخل في حلقة لا نهائية. وبشكلٍ أدق، يجب أن يقل حجم المدخلات - أو بالأحرى أن تتعمق، إذا نظرنا إليها كبنية بيانات - في كل مرة نستدعي فيها الدالة بشكلٍ متكرر.
يمكن أيضاً تفسير الإعلان بطريقة استقرائية ، والتي يمكن الإشارة إليها على النحو التالي:
كوداتا CoNat = صفر | سوك كوناتCoNatتحتوي على جميع الأعداد الطبيعية التي Natتحتوي عليها تلقائيًا. ولكن نظرًا لأن البيانات المشتركة يمكن أن تكون عميقة بلا حدود، فإنها تحتوي على حد إضافي Succ (Succ (Succ (Succ …)))يستمر إلى ما لا نهاية - وغالبًا ما يُرمز إليه بـ ∞. [ 3 ] هذا خاص بالأعداد الطبيعية المشتركة، لذلك لا يمكن بناؤه إلا باستخدام الاستدعاء الذاتي المشترك:
اللانهاية :: CoNat اللانهاية = Succ اللانهايةبينما يتطلب الاستدعاء التكراري أن يصغر مُدخل الاستدعاء التكراري في كل مرة، يتطلب الاستدعاء التكراري المشترك أن يكبر مُخرج الاستدعاء التكراري في كل مرة. لهذا السبب يجب علينا كتابة Succ infinity; لأن infinity = infinityاستخدام غير مسموح به لأنه يُكرر العملية إلى ما لا نهاية.
لتوضيح الازدواجية بين الاستدعاء الذاتي والاستدعاء الذاتي المشترك، يمكننا تغليفهما في دالتين، recو corec. إن وجود هاتين الدالتين، بالإضافة إلى المُنشئين العاديين لـ Natو CoNat، يُحدد نوعيهما بشكل فريد، وبالتالي يسمح بإعادة كتابة جميع أشكال الاستدعاء الذاتي والاستدعاء الذاتي المشترك باستخدامهما. [ 4 ]
rec :: Nat -> ( Maybe c -> c ) -> c rec Zero f = f Nothing rec ( Succ n ) f = f ( Just ( rec n f ))corec :: ( c -> Maybe c ) -> c -> CoNat corec f base = case f base of Nothing -> Zero Just x -> Succ ( corec f x )من الناحية النظرية، CoNatيمكن اعتبارها آلة حالة ، حيث cيمثل نوعًا يغلف "الحالة الحالية". الدالة c -> Maybe cهي دالة انتقال حالة تؤدي إما إلى إنهاء العملية بـ Zeroأو استمرارها بـ Succ. يمكننا إعادة كتابة الأمثلة أعلاه باستخدام الدوال التالية:
كرر x n = rec n ( \ s -> case s of Nothing -> [] Just a -> x : a ) infinity = corec ( \ () -> Just () ) ()ومن الأمثلة الأكثر تعقيدًا على البيانات المشفرة مثال الأشجار الثنائية ، حيث تكون كل عقدة إما عقدة طرفية تحمل بعض البيانات، أو عقدة فرعية لها طفلان بالضبط:
codata BinaryTree a = Leaf a | Branch ( BinaryTree a ) ( BinaryTree a )يحتوي هذا المثال على العديد من الحدود ذات العمق اللانهائي التي لا يمكن إنشاؤها إلا عن طريق الاستدعاء الذاتي المشترك. على سبيل المثال، يمكن أن يكون العمق لانهائيًا فقط على الجانب الأيسر، أو على كلا الجانبين، أو بالتناوب بين اليسار واليمين.
infiniteLeft :: a -> BinaryTree a infiniteLeft x = Branch ( infiniteLeft x ) ( Leaf x )infiniteBoth :: BinaryTree a infiniteBoth = Branch infiniteBoth infiniteBothinfiniteAlternating :: a -> Bool -> BinaryTree a infiniteAlternating x False = Branch ( infiniteAlternating x True ) ( Leaf x ) infiniteAlternating x True = Branch ( Leaf x ) ( infiniteAlternating x False )مرة أخرى، يتخذ التكرار المشترك على الأشجار الثنائية شكلاً أكثر عمومية يعتمد على مُنشئ يشبه "آلة الحالة":
corec :: ( c -> Either a ( c , c )) -> c -> BinaryTree a corec f base = case f base of Left x -> Leaf x Right ( x , y ) -> Branch ( corec f x ) ( corec f y )أنواع M
في بيئة تعتمد على أنواع البيانات ، يمكن ترميز البيانات المشفرة باستخدام أنواع M، وهي ثنائية لأنواع W. بفرض وجود نوع A ومجموعة من الأنواع B المفهرسة بـ A ، يمكن تكوين نوع M.، وهو ما يمثل نوع الأشجار التي تُسمى عقدها بعناصر من المجموعة A ، وتُفهرس عقدها الفرعية بواسطة المجموعة B ( a ). في الشفرة الزائفة ، يمكن تعريف أنواع M (ومبدأ الاستدعاء الذاتي الخاص بها) على النحو التالي:
codata M a ( b :: a -> * ) = M { root :: a , branch :: b root -> M a b } corec :: ( c -> ( root :: a , b root -> c )) -> c -> M a b corec f base = let ( root , branch ) = f base in M { root = root , branch = \ i -> corec f ( branch i ) }على سبيل المثال، يمكن بناء الأعداد الطبيعية والأعداد الطبيعية المشتركة كأعداد من النوع W والنوع M لنفس الدالة:
f :: Bool -> * f False = Void -- حالة الصفر (لا توجد فروع) f True = () -- حالة النجاح (فرع واحد)Nat = W Bool f CoNat = M Bool fيمكن إثبات وجود أنواع M في العديد من الطوبولوجيات الأولية ، ويترتب وجودها على وجود أنواع W. [ 5 ]
الوصف الرياضي
أظهر القسم السابق وجود ارتباط وثيق بين الأعداد الطبيعية والمجاورة الطبيعية Maybe c، وكذلك بين الأشجار الثنائية Either a (c, c). ويتضح هذا الارتباط من خلال إثبات أن Natتقابل تقابلي مع Maybe Nat، CoNatومع Maybe CoNat؛ وبشكل أدق، يرتبط هذا التقابل التقابلي Zeroبـ Nothingو Succ nبـ Just n. بعبارة أخرى، Natو CoNatهما نقطتان ثابتتان ( حتى التشاكل ) للدالة.
الفرق بين البيانات والبيانات المساعدة هو أن البيانات تمثل أصغر نقطة ثابتة، بينما تمثل البيانات المساعدة أكبر نقطة ثابتة. وبهذا المعنى، يمكن تلخيص الاستدعاء الذاتي بأنه "تم توليد كل عنصر من النوع فقط بواسطة المُنشئات المُعطاة ( Zeroو Succفي حالة Nat/ CoNat)"، بينما ينص الاستدعاء الذاتي المشترك على أن "كل قيمة يمكن تحليلها باستخدام المُنشئات كحالات موجودة".
من منظور نظرية الفئات، CoNatيمكن تعريفها بدقة على أنها الجبر المشترك النهائي للدالة الداخلية[ 4 ] عند تفكيك هذا التعريف، نجد ما يلي :
- توجد دالة . "Pred" اختصار لـ "predecessor" (السلف)، وبديهيًا، تطرح هذه الدالة واحدًا من العدد الطبيعي المقابل أو تعطي قيمة أخرى. بعبارة أخرى، و . هذا يُظهر أن الدالة هي جبر مشترك للدالة، ولكن ليس بالضرورة الجبر النهائي.
pred :: CoNat -> Maybe CoNatNothingpred Zero = Nothingpred (Succ n) = Just nCoNat - لكل نوع
cودالة ، توجد دالة بحيث . بتفصيل هذا أكثر، إذا كان ، فإن ، بينما إذا كان ، فإن — وهذا يطابق تعريف الدالة الذي نعرفه.f :: c -> Maybe ccorec f :: c -> CoNatpred (corec f x) = fmap (corec f) (f x)f x = Just ycorec f x = Succ (corec f y)f x = Nothingcorec f x = Zerocorec corecفريد من نوعه بالمعنى التالي: لأي دالة أخرى تحقق أيضًا ، . وهذا يضمن أن يكون جبرًا مشتركًا نهائيًا .g :: c -> CoNatpred (g x) = fmap g (f x)g x = corec f xCoNat
Maybe cيمكن استبدالها بأي دالة أخرى في الوصف أعلاه للحصول على تعريف أي نوع استقرائي مشترك آخر.
لا تمتلك جميع الدوال جبرًا مشتركًا نهائيًا. على سبيل المثال، تنص نظرية كانتور على أنه لا يمكن لأي مجموعة أن تكون تقابل مجموعة القوى الخاصة بها، وبالتالي فإن دالة مجموعة القوىa -> Bool لا تمتلك جبرًا مشتركًا نهائيًا. ومع ذلك، في حالة الدوال متعددة الحدود أو دوال القسمة متعددة الحدود [ 6 ] ، توجد دائمًا جبر مشترك نهائي؛ فالدوال متعددة الحدود هي دوال يمكن التعبير عنها بالشكل التالي:بالنسبة للنوع α وعائلة الأنواع المفهرسة β ( a ). النوع M هو بالضبط بناء هذه الجبر المشترك النهائي. [ 5 ]
عملية التوليد النقدي
بينما يمكن الاستدلال على أنواع البيانات المشتركة باستخدام خاصية التفرد corecمباشرةً، إلا أنه غالبًا ما يكون من الأنسب استخدام الاستقراء المشترك ، الذي يمكنه إثبات تساوي البيانات المشتركة. لنفترض وجود جبر مشترك نهائي A لدالة متعددة الحدود F — أي— نقول إن العلاقةتكون ثنائية التماثل إذا، لكل،وللجميع. هنا،وراجع الخرائط:
ينص مبدأ الاستقراء المشترك على أنه بالنسبة لجميع عمليات المحاكاة الثنائية R على A و،.
وبشكل أعم، بالنسبة لخريطة الجبر المشتركتكون العلاقة R على A علاقة ثنائية التماثل إذا وُجدت دالةمُرضٍ للجميع،
- و
- ،
حيث π ₁ و π ₂ هما خريطتا الإسقاط الأولى والثانيةويمكن اعتبار هذا مكافئًا لحالة كثير الحدود عن طريق وضعويمكن أيضًا التعبير عن المتساويات المطلوبة كمخطط تبادلي:
![]()
يسهل إثبات الاستقراء المشترك من خلال تفرد corec: فكل من π₁ و π₂ يحققان الخاصية المطلوبة للمساواة corec f، وبالتالي فهما متساويان، مما يدل على أن[ 4 ]
مثال: جمع الأعداد الطبيعية
لتوضيح استخدام الاستقراء المشترك، سنبرهن على بعض الخصائص الأساسية المتعلقة بالجمع على الأعداد الطبيعية المشتركة. يمكن تعريف الجمع بنفس الطريقة التي يُعرَّف بها للأعداد الطبيعية: [ 3 ]
إضافة :: CoNat -> CoNat - > CoNat أضف صفر = أ أضف أ ( Succ b ) = Succ ( أضف أ ب )هذا التعريف، مع أنه صحيح، إلا أنه يخفي قدراً من التعقيد. يمكننا بدلاً من ذلك أن نكتب:
أضف صفرًا صفر = صفر أضف ( لاحق أ ) صفر = لاحق ( أضف أ صفرًا ) أضف أ ( لاحق ب ) = لاحق ( أضف أ ب )هذا التعريف يجعل الترجمة إلى corec:
تكرار :: ( CoNat , CoNat ) -> ربما ( CoNat , CoNat ) تكرار صفر صفر = لا شيء تكرار ( Succ a ) صفر = فقط ( a , صفر ) تكرار a ( Succ b ) = فقط ( a , b )أضف a b = corec iterate ( a , b )يمكننا إثبات ذلكعن طريق الاستقراء المشترك على العلاقة(أين(هي مجموعة الأعداد الطبيعية المشتركة). أولاً، يتبين من تعريف الجمع أنثانيًا، إذا افترضنا أنوهو على شكلبالنسبة لبعض قيم a ، يجب أن نثبت أنوهو أيضاً من هذا الشكل. لدينا:هكذاوبالتاليحسب الحاجة.
الهويةويمكن إثبات ذلك بالمثل عن طريق الاستقراء المشترك على(تذكر أن العلاقة يجب أن تتضمن بالضرورةوأخيرًا، خاصية التبديل.—نتائج من عملية الاستقراء المشترك المباشرة المماثلة على[ 7 ]
في لغات البرمجة
إذا كان مجال الخطاب هو فئة المجموعات والدوال الكلية (كما هو الحال في برامج إثبات النظريات مثل أغدا وروك)، فإن الأنواع النهائية (البيانات المشتركة) قد تحتوي على قيم لا نهائية وغير مؤسسة ، بينما لا تحتوي الأنواع الأولية (البيانات) على ذلك. [ 8 ] [ 9 ] من ناحية أخرى، إذا كان مجال الخطاب هو فئة الترتيبات الجزئية الكاملة والدوال المتصلة ، والتي تتوافق تقريبًا مع لغة البرمجة هاسكل ، فإن الأنواع النهائية تتطابق مع الأنواع الأولية، ويشكل الجبر المشترك النهائي والجبر الأولي المقابلان تماثلًا. [ 10 ]
تاريخ
يعود تاريخ البرمجة الدائرية، أو ما يُعرف بالبرمجة التكرارية، إلى عام 1984 على الأقل ، حيث نسب الفضل في ذلك إلى جون هيوز وفيليب وادلر ؛ وقد طُوّرت أشكال أكثر عمومية منها في عام 1989. وشملت الدوافع الأصلية إنتاج خوارزميات أكثر كفاءة (تسمح بمرور واحد على البيانات في بعض الحالات، بدلاً من الحاجة إلى مرورات متعددة) وتنفيذ هياكل البيانات الكلاسيكية، مثل القوائم المرتبطة ثنائياً والطوابير، في لغات البرمجة الوظيفية.
انظر أيضاً
ملحوظات
- ↑ لغة Haskell، كونها لغة جزئية وكسولة، لا تدعم البيانات أو البيانات المساعدة؛ نستخدم تركيبها النحوي من أجل الألفة.
- ↑ يُستخدم مصطلح "الاستدعاء الذاتي" هنا بالمعنى التقني للاستدعاء الذاتي البنيوي ، وهو نوع من الاستدعاء الذاتي يُحلل بنية نوع معين وينتهي دائمًا. أما بالمعنى الأعم للكلمة في علوم الحاسوب، فإن الاستدعاء الذاتي المشترك هو أيضًا نوع من الاستدعاء الذاتي.
مراجع
- ↑ مؤلفو أغدا. "الاستقراء المشترك" . وثائق أغدا 2.8.0 . مؤرشف من الأصل بتاريخ 18 فبراير 2026. تم الاطلاع عليه بتاريخ 13 مارس 2026 .
- ↑ معهد أبحاث علوم الحاسوب والتحكم الآلي (Inria)، والمركز الوطني للبحث العلمي (CNRS)، والمساهمون. "الأنواع الاستقرائية المشتركة والدوال التكرارية المشتركة" . وثائق برنامج إثبات Rocq 9.1.0 . تاريخ الاسترجاع: 13 مارس 2026 .
- 1 2 شي، شومي؛ بينس، فيكتور (9 أكتوبر 2025). "الأعداد الطبيعية تشكل شبه حلقة تبادلية أسية" . وقائع ورشة العمل الدولية العاشرة لجمعية ACM SIGPLAN حول التطوير الموجه بالأنواع . TyDe '25. نيويورك، نيويورك، الولايات المتحدة الأمريكية: جمعية آلات الحوسبة. الصفحات 52-63 . doi : 10.1145/3759538.3759654 . ISBN 979-8-4007-2163-2.
- 1 2 3 جاكوبس، بارت؛ روتن، جان (2011)، "مقدمة في الجبر (المشترك) والاستقراء (المشترك)"، في سانجيورجي، دافيد؛ روتن، جان (محرران)، موضوعات متقدمة في المحاكاة الثنائية والاستقراء المشترك ، سلسلة كامبريدج في علوم الحاسوب النظرية، كامبريدج: مطبعة جامعة كامبريدج، ص 38-99 ، doi : 10.1017/CBO9780511792588.003 ، ISBN 978-1-107-00497-9تم الاطلاع عليه بتاريخ 14 مارس 2026
- 1 2 فان دن بيرغ، بينو؛ دي ماركي، فيديريكو (2007-04-01). "الأشجار غير المؤسسة جيدًا في الفئات" . حوليات المنطق البحت والتطبيقي . 146 (1): 40-59 . doi : 10.1016/j.apal.2006.12.001 . ISSN 0168-0072 .
- ^ أفيجاد ، جيريمي. كارنيرو، ماريو. هودون ، سيمون (2019). هاريسون، جون. أوليري، جون. تولماش، أندرو (محرران). "أنواع البيانات كقسمة للفاعلين متعددي الحدود" . ليبس، المجلد 141، Itp 2019 . إجراءات لايبنيز الدولية في مجال المعلوماتية (LIPIcs). 141 . داغستوهل، ألمانيا: شلوس داغستوهل – مركز لايبنتز للمعلوماتية: 6:1–6:19. دوى : 10.4230/LIPIcs.ITP.2019.6 . رقم ISBN 978-3-95977-122-1.
- ↑ روتن، جيه جيه إم إم (17-10-2000). "الجبر المشترك الشامل: نظرية الأنظمة" . علوم الحاسوب النظرية . الجبر الحديث. 249 (1): 3-80 . doi : 10.1016/S0304-3975(00)00056-6 . ISSN 0304-3975 .
- ↑ باروايز وموس 1996.
- ↑ موس ودانر 1997.
- ↑ سميث وبلوتكين 1982.
- بيرد، ريتشارد سيمبسون (1984). "استخدام البرامج الدائرية للتخلص من عمليات المرور المتعددة على البيانات". مجلة أكتا إنفورماتيكا . 21 (3): 239-250 . doi : 10.1007/BF00264249 . S2CID 27392591 .
- أليسون، لويد (أبريل 1989). "البرامج الدائرية والهياكل المرجعية الذاتية" . البرمجيات: الممارسة والخبرة . 19 (2): 99-109 . arXiv : 2403.01866 . doi : 10.1002/spe.4380190202 . S2CID 21298473 .
- جيرانت جونز وجيريمي جيبونز (1992). خوارزميات البحث العرضي أولاً ذات الوقت الخطي: تمرين في حساب الطيات والدمج (تقرير فني). قسم علوم الحاسوب، جامعة أوكلاند.
- جون باروايز ؛ لورانس س. موس (يونيو 1996). حلقات مفرغة . مركز دراسات اللغة والمعلومات. ISBN 978-1-57586-009-1أُرشف من المصدر الأصلي بتاريخ 21-06-2010 . تم الاطلاع عليه بتاريخ 24-01-2011 .
- لورانس س. موس؛ نورمان دانر (1997). "حول أسس الاستدعاء الذاتي". مجلة المنطق التابعة لمجموعة IGPL . 5 (2): 231-257 . CiteSeerX 10.1.1.40.4243 . doi : 10.1093/jigpal/5.2.231 .
- كيس دويتس؛ جان فان إيجك (مايو 2004). طريق هاسكل إلى المنطق والرياضيات والبرمجة . منشورات كينغز كوليدج. رقم ISBN 978-0-9543006-9-2.
- ديفيد تيرنر (28 يوليو 2004). "البرمجة الوظيفية الكاملة" . مجلة علوم الحاسوب الشاملة . 10 (7): 751-768 . doi : 10.3217/jucs-010-07-0751 .
- جيريمي جيبونز؛ جراهام هاتون (أبريل 2005). "طرق إثبات البرامج المتكررة" . Fundamenta Informaticae . 66 (4): 353–366 .
- ليون ب. سميث (29-07-2009)، "طوابير لويد أليسون المتكررة: لماذا تُعدّ الاستمراريات مهمة" ، قارئ الموناد ( 14): 37-68
- ريموند هيتينجر (2009-11-19). "الوصفة 576961: تقنية التكرار الدوري" .
- إم بي سميث وجي دي بلوتكين (1982). "الحل النظري للفئات لمعادلات المجال المتكررة" (ملف PDF) . مجلة SIAM للحوسبة . 11 (4): 761-783 . doi : 10.1137/0211062 . S2CID 8517995 .
- لوكلير، فرانسوا؛ بولين-مورينغ، كريستين (1993). البرمجة باستخدام التدفقات في Coq: دراسة حالة: غربال إراتوستينس . أنواع البراهين والبرامج: ورشة العمل الدولية TYPES '93. سبرينغر-فيرلاغ نيويورك، ص 191-212 . ISBN 978-3-540-58085-0.
- علوم الحاسوب النظرية
- الإشارة الذاتية
- البرمجة الوظيفية
- نظرية الفئات
- التكرار
