تعدد الأشكال البارامتري

في لغات البرمجة ونظرية الأنواع ، يسمح تعدد الأشكال البارامتري بإعطاء جزء واحد من التعليمات البرمجية نوعًا "عامًا"، باستخدام متغيرات بدلًا من الأنواع الفعلية، ثم إنشاء مثيلات بأنواع محددة حسب الحاجة. [ 1 ] : 340 تُسمى الدوال وأنواع البيانات متعددة الأشكال البارامترية أحيانًا بالدوال العامة وأنواع البيانات العامة ، على التوالي، وهي تُشكل أساس البرمجة العامة .

يمكن التمييز بين التعدد الشكلي البارامتري والتعدد الشكلي المخصص . تتسم التعريفات متعددة الأشكال البارامترية بالتجانس ، إذ تتصرف بشكل متطابق بغض النظر عن نوع الكائن الذي تُنشأ منه. [ 1 ] : 340 [ 2 ] : 37 في المقابل، تُعطى التعريفات متعددة الأشكال المخصصة تعريفًا مميزًا لكل نوع. وبالتالي، لا يدعم التعدد الشكلي المخصص عمومًا إلا عددًا محدودًا من هذه الأنواع المتميزة، نظرًا لضرورة توفير تطبيق منفصل لكل نوع.

إن الأداة النظرية المعتادة لدراسة تعدد الأشكال البارامتري هي النظام F ، الذي يوسع حساب لامدا المكتوب ببساطة مع التحديد الكمي على الأنواع.

التعريف الأساسي

من الممكن كتابة دوال لا تعتمد على أنواع وسائطها. على سبيل المثال، دالة التطابق.أناد(x)=x{\displaystyle {\mathsf {id}}(x)=x}ببساطة، تُعيد الدالة وسيطها دون تعديل. وهذا يُؤدي بطبيعة الحال إلى ظهور مجموعة من الأنواع المحتملة، مثل:أنانتأنانت{\displaystyle {\mathsf {Int}}\to {\mathsf {Int}}}،بooلبooل{\displaystyle {\mathsf {Bool}}\to {\mathsf {Bool}}}،SترأنانزSترأنانز{\displaystyle {\mathsf {String}}\to {\mathsf {String}}}وهكذا. يسمح تعدد الأشكال البارامتريأناد{\displaystyle {\mathsf {id}}}أن يتم إعطاؤه نوعًا واحدًا وأكثر عمومية من خلال إدخال متغير نوع كمي عالمي :

أناد:α.αα{\displaystyle {\mathsf {id}}:\forall \alpha .\alpha \to \alpha }

يمكن بعد ذلك إنشاء تعريف متعدد الأشكال عن طريق استبدال أي نوع ملموس بـα{\displaystyle \alpha }مما ينتج عنه المجموعة الكاملة من الأنواع المحتملة. [ 3 ]

تُعد دالة التطابق مثالًا متطرفًا بشكل خاص، ولكن العديد من الدوال الأخرى تستفيد أيضًا من تعدد الأشكال البارامتري. على سبيل المثال،أصصهـند{\displaystyle {\mathsf {append}}}الدالة التي تدمج قائمتين لا تفحص عناصر القائمة، بل تفحص بنية القائمة نفسها فقط. لذلك ،أصصهـند{\displaystyle {\mathsf {append}}}يمكن تصنيفها ضمن عائلة مماثلة من الأنواع، مثل[أنانت]×[أنانت][أنانت]{\displaystyle [{\mathsf {Int}}]\times [{\mathsf {Int}}]\to [{\mathsf {Int}}]}،[بooل]×[بooل][بooل]{\displaystyle [{\mathsf {Bool}}]\times [{\mathsf {Bool}}]\to [{\mathsf {Bool}}]}وهكذا دواليك، حيث[تي]{\displaystyle [T]}يشير إلى قائمة من العناصر من النوعتي{\displaystyle T}وبالتالي فإن النوع الأكثر عمومية هو

أصصهـند:α.[α]×[α][α]{\displaystyle {\mathsf {append}}:\forall \alpha .[\alpha ]\times [\alpha ]\to [\alpha ]}

والتي يمكن تطبيقها على أي نوع في العائلة.

الدوال متعددة الأشكال البارامترية مثلأناد{\displaystyle {\mathsf {id}}}وأصصهـند{\displaystyle {\mathsf {append}}}يقال إنها مُعَلمة على نوع عشوائيα{\displaystyle \alpha }[ 4 ] كلاهماأناد{\displaystyle {\mathsf {id}}}وأصصهـند{\displaystyle {\mathsf {append}}}تُحدد المعاملات بناءً على نوع واحد، بينما يمكن تحديد معاملات الدوال بناءً على عدد غير محدود من الأنواع. على سبيل المثال،وsت{\displaystyle {\mathsf {fst}}}وsند{\displaystyle {\mathsf {snd}}}يمكن إعطاء الدوال التي تُرجع العنصرين الأول والثاني من الزوج ، على التوالي، الأنواع التالية:

وsت:α.β.α×βαsند:α.β.α×ββ{\displaystyle {\begin{aligned}{\mathsf {fst}}&:\forall \alpha .\forall \beta .\alpha \times \beta \to \alpha \\{\mathsf {snd}}&:\forall \alpha .\forall \beta .\alpha \times \beta \to \beta \end{aligned}}}

في التعبيروsت((3،ترuهـ)){\displaystyle {\mathsf {fst}}((3,{\mathsf {true}}))}،α{\displaystyle \alpha }يتم إنشاء مثيل لـأنانت{\displaystyle {\mathsf {Int}}}وβ{\displaystyle \beta }يتم إنشاء مثيل لـبooل{\displaystyle {\mathsf {Bool}}}في الدعوة إلىوsت{\displaystyle {\mathsf {fst}}}إذن، نوع التعبير العام هوأنانت{\displaystyle {\mathsf {Int}}}.

تختلف الصيغة المستخدمة لإدخال تعدد الأشكال البارامتري اختلافًا كبيرًا بين لغات البرمجة. على سبيل المثال، في بعض لغات البرمجة، مثل هاسكل ، فإنα{\displaystyle \forall \alpha }المُكمِّم ضمني ويمكن حذفه. [ 5 ] تتطلب لغات أخرى تحديد الأنواع بشكل صريح في مواقع استدعاء الدالة متعددة الأشكال ذات المعاملات ، إما في جميع المواقع أو على الأقل بما يكفي للسماح باستنتاج النوع لتحديد الباقي.

تاريخ

تم تقديم التعدد الشكلي البارامتري لأول مرة إلى لغات البرمجة في لغة ML عام 1975. [ 6 ] وهو موجود اليوم في لغات Standard ML و OCaml و F# و Ada و Haskell و Mercury و Visual Prolog و Scala و Julia و Python و TypeScript و C++ وغيرها. وقد قدمت لغات Java و C# و Visual Basic .NET و Delphi كل منها "الأنواع العامة" للتعدد الشكلي البارامتري. بعض تطبيقات تعدد الأشكال النوعي تشبه ظاهريًا التعدد الشكلي البارامتري، مع إدخال جوانب مخصصة. ومن الأمثلة على ذلك تخصيص القوالب في لغة C++ .

في ثمانينيات القرن العشرين، قدّم ليفانت نسخةً مُصنَّفة (أي تنبؤية) من نظام جيرارد ورينولدز F. يعتمد منهج ليفانت على مفهوم رتبة المُكمِّمات، الذي يقيس عمق تداخلها داخل مُنشئات الدوال . [ 7 ] يقتصر منهج ML من هذا المنظور على تعدد الأشكال من الرتبة 1. تبنّت لغة هاسكل تعدد الأشكال البارامتري من رتبة أعلى في تسعينيات القرن العشرين. على سبيل المثال، يُستخدم تعدد الأشكال البارامتري من الرتبة 2 في هاسكل لتعريف الموناد runST، الذي يُحاكي فعليًا نظام النوع والتأثير ، [ 8 ] مع "مناطق معزولة من البرمجة الإجرائية". على مستوى النوع، ينبع عزل الحالة أساسًا من التكميم الأعمق من الرتبة 2 على الحالة في runST. (هذا لا يكفي لوصف دلالات وقت التشغيل رسميًا runST. لهذا الأخير، يحتاج المرء إلى بعض العناصر الإضافية مثل منطق الفصل . [ 9 ] )

التنبؤية، وعدم التنبؤية، وتعدد الأشكال من الرتبة العليا

يُقال إن نوعًا ما من الرتبة k (لعدد صحيح ثابت k ) إذا لم يكن هناك مسار من جذره إلى{\displaystyle \forall }يمر المُكمِّم إلى يسار k سهم أو أكثر، عند تمثيل النوع كشجرة. [ 1 ] : 359 يُقال إن نظام النوع يدعم تعدد الأشكال من الرتبة k إذا كان يسمح بأنواع ذات رتبة أقل من أو تساوي k . على سبيل المثال، يسمح نظام النوع الذي يدعم تعدد الأشكال من الرتبة 2 بما يلي:(α.αα)تي{\displaystyle (\forall \alpha .\alpha \rightarrow \alpha )\rightarrow T}لكن ليس((α.αα)تي)تي{\displaystyle ((\forall \alpha .\alpha \rightarrow \alpha )\rightarrow T)\rightarrow T}يُقال عن نظام النوع الذي يقبل أنواعًا ذات رتبة عشوائية أنه "متعدد الأشكال من الرتبة n ".

(يختلف مفهوم الرتبة هذا عن كيفية تعريف رتبة الكميات في المنطق الكلاسيكي لأنه هنا يقيس عمق التداخل بالنسبة إلى رابط غير كمي ، بينما في المنطق الكلاسيكي لا تزيد الروابط غير الكمية من رتبة الكميات المتداخلة تحتها، ولكن الكميات الأخرى تفعل ذلك.)

تعدد الأشكال من الرتبة 1 (التنبؤي)

في نظام الأنواع التنبؤي (المعروف أيضًا بنظام تعدد الأشكال المسبق )، لا يجوز إنشاء متغيرات الأنواع باستخدام أنواع متعددة الأشكال. [ 1 ] : 359-360. تشمل نظريات الأنواع التنبؤية نظرية مارتن-لوف ونظرية Nuprl . وهذا مشابه جدًا لما يُسمى "نمط ML" أو "تعدد أشكال Let" (تقنيًا، يخضع تعدد أشكال Let في ML لبعض القيود النحوية الأخرى). هذا القيد يجعل التمييز بين الأنواع متعددة الأشكال وغير متعددة الأشكال بالغ الأهمية؛ لذا، في الأنظمة التنبؤية، يُشار أحيانًا إلى الأنواع متعددة الأشكال باسم مخططات الأنواع لتمييزها عن الأنواع العادية (أحادية الشكل)، والتي تُسمى أحيانًا بالأنواع الأحادية .

من نتائج خاصية التنبؤ أنه يمكن كتابة جميع الأنواع بصيغة تضع جميع المحددات الكمية في الموضع الخارجي (prenex). على سبيل المثال، انظر إلىأصصهـند{\displaystyle {\mathsf {append}}}الدالة الموضحة أعلاه، والتي لها النوع التالي:

أصصهـند:α.[α]×[α][α]{\displaystyle {\mathsf {append}}:\forall \alpha .[\alpha ]\times [\alpha ]\to [\alpha ]}

من أجل تطبيق هذه الوظيفة على زوج من القوائم، نوع محددتي{\displaystyle T}يجب استبدال المتغيرα{\displaystyle \alpha }بحيث يكون نوع الدالة الناتجة متسقًا مع أنواع الوسائط. في نظام غير تنبؤي ،تي{\displaystyle T}قد يكون أي نوع على الإطلاق، بما في ذلك النوع متعدد الأشكال نفسه؛ وبالتاليأصصهـند{\displaystyle {\mathsf {append}}}يمكن تطبيقها على أزواج من القوائم التي تحتوي على عناصر من أي نوع - حتى على قوائم الدوال متعددة الأشكال مثلأصصهـند{\displaystyle {\mathsf {append}}}في حد ذاتها. تعددية الأشكال في لغة ML تنبؤية. [ 10 ] وذلك لأن التنبؤية، إلى جانب قيود أخرى، تجعل نظام الأنواع بسيطًا بما يكفي بحيث يكون استنتاج النوع الكامل ممكنًا دائمًا.

كمثال عملي، يقوم OCaml (وهو أحد أحفاد أو لهجات ML ) باستنتاج النوع ويدعم تعدد الأشكال غير التنبؤي، ولكن في بعض الحالات عند استخدام تعدد الأشكال غير التنبؤي، يكون استنتاج نوع النظام غير مكتمل ما لم يقدم المبرمج بعض التعليقات التوضيحية الصريحة للنوع.

تعدد الأشكال ذو الرتبة الأعلى

تدعم بعض أنظمة الأنواع مُنشئ نوع دالة غير تنبؤية، على الرغم من أن مُنشئات الأنواع الأخرى تظل تنبؤية. على سبيل المثال، النوع(α.αα)تي{\displaystyle (\forall \alpha .\alpha \rightarrow \alpha )\rightarrow T}يُسمح بذلك في نظام يدعم تعدد الأشكال من الرتبة الأعلى، على الرغم من[α.αα]{\displaystyle [\forall \alpha .\alpha \rightarrow \alpha ]}قد لا يكون كذلك. [ 11 ]

يُمكن تحديد نوع التعدد الشكلي من الرتبة الثانية، ولكن ليس من الرتبة الثالثة فما فوق. [ 12 ] [ 1 ] : 359

تعدد الأشكال التنبؤي

يُعدّ التعدد الشكلي غير التنبؤي (ويُسمى أيضًا التعدد الشكلي من الدرجة الأولى ) أقوى أشكال التعدد الشكلي البارامتري. [ 1 ] : 340 في المنطق الصوري ، يُقال إن التعريف غير تنبؤي إذا كان مرجعيًا ذاتيًا؛ وفي نظرية الأنواع، يشير إلى قدرة النوع على أن يكون ضمن نطاق المُكمِّم الذي يحتويه. وهذا يسمح بتجسيد أي متغير نوع بأي نوع، بما في ذلك الأنواع متعددة الأشكال. ومن الأمثلة على الأنظمة التي تدعم عدم التنبؤ الكامل النظام F ، الذي يسمح بتجسيدα.αα{\displaystyle \forall \alpha .\alpha \to \alpha }من أي نوع، بما في ذلك نفسه.

في نظرية الأنواع ، تستند حسابات λ-الأنواع غير التنبؤية الأكثر دراسة إلى تلك الخاصة بمكعب لامدا ، وخاصة النظام F.

تعميمات لمفهوم الرتبة

يمكن تعميم مفهوم ليفانت للرتبة ليشمل رموزًا أخرى غير المُكمِّمات باستخدام استبدال بسيط ومناسب. على سبيل المثال، يمكن تطبيقه على أنواع التقاطع (المنشئة) . مع ذلك، قد تختلف خصائص التسلسل الهرمي للأنواع القائم على الرتبة. فعلى سبيل المثال، يظل استنتاج النوع للنظام F ذي الرتبة 3 وما فوق غير قابل للتقرير (كما هو موضح أعلاه)، بينما يكون استنتاج النوع لأنواع التقاطع قابلاً للتقرير لجميع الرتب المحدودة. [ 13 ]

تعدد الأشكال البارامتري المحدود

في عام 1985، أدرك لوكا كارديلي وبيتر ويغنر مزايا السماح بتقييد معلمات النوع. [ 14 ] تتطلب العديد من العمليات معرفةً بأنواع البيانات، ولكنها يمكن أن تعمل بشكل معياري. على سبيل المثال، للتحقق مما إذا كان عنصر ما مُدرجًا في قائمة، نحتاج إلى مقارنة العناصر للتأكد من تساويها. في لغة Standard ML ، تُقيّد معلمات النوع من الشكل ''a' بحيث تكون عملية المساواة متاحة، وبالتالي سيكون للدالة النوع ''a × ''a list → bool، ولا يمكن أن يكون ''a' إلا نوعًا مُعرّفًا للمساواة. في لغة Haskell ، يتم تحقيق التقييد من خلال اشتراط انتماء الأنواع إلى فئة نوع ؛ وبالتالي فإن الدالة نفسها لها النوعهـqαα[α]بooل{\textstyle \mathrm {Eq} \,\alpha \,\Rightarrow \alpha \,\rightarrow \left[\alpha \right]\rightarrow \mathrm {Bool} }في لغة هاسكل. في معظم لغات البرمجة الموجهة للكائنات التي تدعم تعدد الأشكال البارامتري، يمكن تقييد المعلمات لتكون أنواعًا فرعية من نوع معين (انظر المقالات تعدد الأشكال من النوع الفرعي والبرمجة العامة ).

انظر أيضاً

ملحوظات

  1. 1 2 3 4 5 6 بنجامين سي. بيرس (2002). أنواع ولغات البرمجة . مطبعة معهد ماساتشوستس للتكنولوجيا. ISBN 978-0-262-16209-8.
  2. ستراشي، كريستوفر (1967)، المفاهيم الأساسية في لغات البرمجة (ملاحظات المحاضرات)، كوبنهاغن: المدرسة الصيفية الدولية في برمجة الحاسوبأُعيد نشره في: ستراشي، كريستوفر (1 أبريل 2000). "المفاهيم الأساسية في لغات البرمجة" . الحوسبة الرمزية والحسابية من الرتبة العليا . 13 (1): 11-49 . doi : 10.1023/A:1010000313106 . ISSN 1573-0557 . S2CID 14124601 .  
  3. يورجي، برنت. "المزيد من تعدد الأشكال وفئات الأنواع" . www.seas.upenn.edu . تم الاطلاع عليه في 1 أكتوبر 2022 .
  4. وو، براندون. "تعدد الأشكال البارامتري - مساعدة SML" . smlhelp.github.io . مؤرشف من الأصل في 1 أكتوبر 2022. تم الاسترجاع في 1 أكتوبر 2022 .
  5. " تقرير لغة هاسكل 2010، القسم 4.1.2: بناء جملة الأنواع" . www.haskell.org . تم الاطلاع عليه في 1 أكتوبر 2022. باستثناء واحد (وهو متغير النوع المميز في تعريف الفئة (القسم 4.3.1))، يُفترض أن جميع متغيرات النوع في تعبير نوع هاسكل مُكمّمة عالميًا؛ ولا يوجد بناء جملة صريح للتكميم العالمي.
  6. ميلنر، ر. ، موريس، ل.، نيوي، م. "منطق للدوال القابلة للحساب ذات الأنواع الانعكاسية والمتعددة الأشكال"، وقائع مؤتمر إثبات وتحسين البرامج ، أرك-إي-سينان (1975)
  7. د. ليفانت، استنتاج النوع متعدد الأشكال، في: سجل المؤتمر السنوي العاشر لندوة ACM حول مبادئ لغات البرمجة، 1983، ص 88-98.
  8. إي. موجي وعمرو صبري. 2001. التغليف الأحادي للتأثيرات: منهج منقح (نسخة موسعة). مجلة البرمجة الوظيفية 11، 6 (نوفمبر 2001)، 591-627
  9. أمين تيماني، ليو ستيفانيسكو، مورتن كروغ-جيسبرسن، لارس بيركيدال، "علاقة منطقية للتغليف الأحادي للحالة: إثبات التكافؤات السياقية في وجود runST"، POPL 2018
  10. ميتشل، جيه سي؛ هاربر، آر. (13 يناير 1988). "جوهر لغة ML" . وقائع الندوة الخامسة عشرة لجمعية ACM SIGPLAN-SIGACT حول مبادئ لغات البرمجة - POPL '88 . نيويورك، نيويورك، الولايات المتحدة الأمريكية: جمعية آلات الحوسبة. الصفحات 28-46 . doi : 10.1145/73560.73563 . ISBN  978-0-89791-252-5.
  11. كوانغ يول سيو. "مدونة كوانغ هاسكل - تعدد الأشكال ذو الرتبة الأعلى" . kseo.github.io . تم ​​الاطلاع عليه بتاريخ 30 سبتمبر 2022 .
  12. كفوري، أ. ج.؛ ويلز، ج. ب. (1 يناير 1999). "استدلال النوع الرئيسي والقابل للتقرير لأنواع التقاطع ذات الرتبة المحدودة". وقائع الندوة السادسة والعشرين لجمعية آلات الحوسبة SIGPLAN-SIGACT حول مبادئ لغات البرمجة . جمعية آلات الحوسبة. ص 161-174 . doi : 10.1145/292540.292556 . ISBN  1581130953. S2CID 14183560 . 
  13. كفوري، أ. ج.؛ ويلز، ج. ب. (يناير 2004). "استدلال المبدأ والنوع لأنواع التقاطع باستخدام متغيرات التوسع". علوم الحاسوب النظرية : 1-70 .
  14. كارديلي وويجنر 1985 .

مراجع