تطبيق جزئي

في علوم الحاسوب ، يشير التطبيق الجزئي (أو تطبيق الدالة الجزئي ) إلى عملية تحديد عدد من وسائط دالة ما، مما ينتج عنه دالة أخرى ذات عدد وسائط أقل . بالنظر إلى دالةو:(X×Y×Z)شمال{\displaystyle f\colon (X\times Y\times Z)\to N}، قد نقوم بتثبيت (أو "ربط") الوسيط الأول، مما ينتج عنه دالة من النوعجزئي(و):(Y×Z)شمال{\displaystyle {\text{partial}}(f)\colon (Y\times Z)\to N}يمكن تمثيل تقييم هذه الدالة على النحو التالي:وجزئي(2،3){\displaystyle f_{\text{partial}}(2,3)}لاحظ أن نتيجة تطبيق الدالة جزئيًا في هذه الحالة هي دالة تأخذ وسيطين. يُطلق على التطبيق الجزئي أحيانًا، بشكل خاطئ، اسم " التطبيق الجزئي المُقيد" ، وهو مفهوم ذو صلة ولكنه مختلف.

تحفيز

ببساطة، يُشير تطبيق الدالة الجزئي إلى أنه "إذا ثبّتّ الوسيط الأول للدالة، فستحصل على دالة للوسائط المتبقية". على سبيل المثال، إذا كانت الدالة div ( x , y ) = x / y ، فإن div مع تثبيت قيمة x عند 1 تُصبح دالة أخرى: div1 ( y ) = div ( 1, y ) = 1/ y . وهذا يُشابه الدالة inv التي تُعيد المعكوس الضربي لوسيطها، والمُعرّفة بالعلاقة inv ( y ) = 1/ y .

يكمن الدافع العملي للتطبيق الجزئي في أن الدوال التي يتم الحصول عليها بتمرير بعض الوسائط وليس كلها إلى دالة ما تكون مفيدة في كثير من الأحيان؛ على سبيل المثال، تحتوي العديد من لغات البرمجة على دالة أو عامل مشابه لـ plus_one. يُسهّل التطبيق الجزئي تعريف هذه الدوال، على سبيل المثال عن طريق إنشاء دالة تمثل عامل الجمع مع تحديد 1 كوسيطها الأول.

التطبيقات

في لغات مثل ML و Haskell و F# ، تُعرَّف الدوال افتراضيًا بصيغة مُقَيَّدة . ويُشار إلى تمرير عدد أقل من العدد الإجمالي للوسائط بالتطبيق الجزئي.

في اللغات التي تدعم الدوال من الدرجة الأولى ، يمكن تعريف الدوال وتنفيذ curryعمليات التخصيص الجزئي والتطبيق الجزئي بشكل صريح. قد يؤدي ذلك إلى زيادة في وقت التشغيل بسبب إنشاء دوال إغلاق إضافية ، بينما يمكن للغة هاسكل استخدام تقنيات أكثر كفاءة. [ 1 ]uncurrypapply

تُتيح لغة سكالا تطبيقًا جزئيًا اختياريًا باستخدام عناصر نائبة، على سبيل المثال، تُعيد دالة متزايدة. كما تدعم سكالا قوائم المعاملات المتعددة كتقنية التخصيص الجزئي (currying)، على سبيل المثال .defadd(x:Int,y:Int)={x+y};add(1,_:Int)defadd(x:Int)(y:Int)={x+y};add(1)_

تُنفذ لغة كلوجر التطبيق الجزئي باستخدام partialالدالة المُعرّفة في مكتبتها الأساسية. [ 2 ]

توفر مكتبة C++ القياسية bind(function, args..)إمكانية إرجاع كائن دالة ناتج عن تطبيق جزئي للوسائط المُعطاة على الدالة المُعطاة. منذ C++20،bind_front(function, args...) تُوفر أيضًا دالة تربط sizeof...(args)الوسائط الأولى للدالة بالوسائط الأخرى. في المقابل، bindتسمح الدالة الأخرى بربط أي من وسائط الدالة المُمررة إليها، وليس فقط الوسائط الأولى. بدلاً من ذلك، يمكن استخدام تعابير لامدا .

int f ( int a , int b ); auto f_partial = []( int a ) { return f ( a , 123 ); }; assert ( f_partial ( 456 ) == f ( 456 , 123 ) );

في لغة جافا ، MethodHandle.bindToتُطبّق الدالة جزئيًا على وسيطها الأول. [ 3 ] بدلاً من ذلك، يمكن استخدام تعابير لامدا منذ جافا 8:

public static < A , B , R > Function < B , R > partialApply ( BiFunction < A , B , R > biFunc , A value ) { return b -> biFunc . apply ( value , b ); }

في راكو ، assumingتقوم الطريقة بإنشاء دالة جديدة بعدد أقل من المعاملات. [ 4 ]

تتضمن وحدة مكتبة بايثون القياسية الدالة ، مما يسمح بربط الوسائط الموضعية والمسماة، وإرجاع دالة جديدة. [ 5 ]functoolspartial

في XQuery ، يتم استخدام عنصر نائب للوسيط ( ?) لكل وسيط غير ثابت في تطبيق دالة جزئية. [ 6 ]

التعريفات

في حساب التفاضل والتكامل اللامدا ذي الأنواع البسيطة مع أنواع الدوال والمنتجات ( λ →, × )، يمكن تعريف التطبيق الجزئي والتقسيم الجزئي والتفكيك الجزئي على النحو التالي:

papply
((( أ × ب ) → ج ) × أ ) → ( بج ) = lect ( f , x ). . و ( س ، ص )
curry
(( a × b ) → c ) → ( a → ( bc )) = λf . λx . λy . f ( x , y )
uncurry
( أ → ( بج ) ) → (( أ × ب ) → ج ) = αf . ε ( س , ص ). com.fxy

لاحظ أن currypapply= curry.

الصياغة الرياضية والأمثلة

يمكن أن يكون التطبيق الجزئي طريقة مفيدة لتعريف العديد من المفاهيم المفيدة في الرياضيات.

مجموعات معطاةX،Y{\displaystyle X,Y}وZ{\displaystyle Z}ووظيفةو:X×YZ{\displaystyle f:X\times Y\rightarrow Z}يمكن للمرء تعريف الوظيفة

و(،-):X(YZ)،{\displaystyle f(\,\cdot \,,-):X\rightarrow (Y\rightarrow Z),}

أين(YZ){\displaystyle (Y\rightarrow Z)}هي مجموعة الدوالYZ{\displaystyle Y\rightarrow Z}صورةxX{\displaystyle x\in X}أسفل هذه الخريطة يوجدو(x،):YZ{\displaystyle f(x,\,\cdot \,):Y\rightarrow Z}هذه هي الدالة التي ترسلyY{\displaystyle y\in Y}لو(x،y){\displaystyle f(x,y)}غالباً ما توجد هياكل علىX،Y،Z{\displaystyle X,Y,Z}مما يعني أن صورةو(،-){\displaystyle f(\,\cdot \,,-)}يقتصر على مجموعة فرعية من الوظائفYZ{\displaystyle Y\rightarrow Z}كما هو موضح في الأمثلة التالية.

إجراءات جماعية

يمكن فهم العمل الجماعي على أنه وظيفة*:جي×XX{\displaystyle *:G\times X\rightarrow X}التقييم الجزئيρ:جيطبيعي(X)(XX){\displaystyle \rho :G\rightarrow {\text{Sym}}(X)\subset (X\rightarrow X)}يقتصر على مجموعة التقابلات منX{\displaystyle X}لذاتها. كما تضمن بديهيات العمل الجماعي كذلكρ{\displaystyle \rho }هو تماثل زمر .

المنتجات الداخلية والخريطة الأساسية للثنائية

الضرب الداخلي على فضاء متجهيV{\displaystyle V}فوق حقلك{\displaystyle K}هي خريطةϕ:V×Vك{\displaystyle \phi :V\times V\rightarrow K}يوفر التقييم الجزئي خريطة أساسية إلى فضاء المتجهات الثنائي .ϕ(،-):VV*(Vك){\displaystyle \phi (\,\cdot \,,-):V\rightarrow V^{*}\subset (V\rightarrow K)}إذا كان هذا هو الضرب الداخلي لفضاء هيلبرت ، فإن نظرية تمثيل ريز تضمن أن هذا تشاكل .

الضربات المتقاطعة والخريطة المرافقة لجبر لي

التطبيق الجزئي للضرب الاتجاهي×{\displaystyle \times }علىR3{\displaystyle \mathbb {R} ^{3}}يكون×(،-):R3نهاية(R3){\displaystyle \times (\,\cdot \,,-):\mathbb {R} ^{3}\mapsto {\text{End}}(\mathbb {R} ^{3})}صورة المتجهu{\displaystyle \mathbf {u} }هي خريطة خطيةتيu{\displaystyle T_{\mathbf {u} }}بحيثتيu(v)=u×v{\displaystyle T_{\mathbf {u} }(\mathbf {v} )=\mathbf {u} \times \mathbf {v} }مكوناتتيu{\displaystyle T_{\mathbf {u} }}يمكن العثور على(تيu)أناج=ϵأناجكuك{\displaystyle (T_{\mathbf {u} })_{ij}=\epsilon _{ijk}u_{k}}.

يرتبط هذا ارتباطًا وثيقًا بالخريطة المرافقة لجبر لي . جبر لي مزود بقوس[،]:ز×زز{\displaystyle [\,\cdot \,,\,\cdot \,]:{\mathfrak {g}}\times {\mathfrak {g}}\rightarrow {\mathfrak {g}}}يُعطي التطبيق الجزئي خريطةإعلان:زنهاية(ز){\displaystyle {\text{ad}}:{\mathfrak {g}}\rightarrow {\text{End}}({\mathfrak {g}})}تضمن بديهيات القوس أن هذا التطبيق هو تشاكل لجبر لي.

انظر أيضاً

مراجع

  1. مارلو وبيتون جونز 2004
  2. "clojure/clojure, partial function" . GitHub . تم الاطلاع عليه بتاريخ 18-07-2020 .
  3. "MethodHandle (Java Platform SE 7)" . docs.oracle.com . تم الاطلاع عليه بتاريخ 12-09-2018 .
  4. "طريقة بافتراض" . docs.perl6.org . تم الاسترجاع في 12-09-2018 .
  5. "10.2. functools — الدوال والعمليات ذات الرتبة العليا على الكائنات القابلة للاستدعاء — وثائق بايثون 3.7.0" . docs.python.org . تم الاطلاع عليه بتاريخ 12-09-2018 .
  6. "XQuery 3.1: لغة استعلام XML" . www.w3.org . تاريخ الاسترجاع: 12 سبتمبر 2018 .

للمزيد من القراءة