פונקציית קורי

פונקציית Curry היא פונקציה המקבלת פונקציה דו-מקומית <math>f: A \times B \to C</math> ומחזירה פונקציה שמחזירה פונקציה <math>\text{Curry}\left(f\right): A \to ( B \to C)</math>. באופן פורמלי, קל להגדיר את פונקציית קורי באמצעות תחשיב למדא. באופן אינטואיטיבי, פונקציית קורי היא פונקציה שבמקום להכניס מספר קלטים ב"בת-אחת" בפונקציה המקורית, יוצרת ממנה פונקציה שבה מכניסים את הקלטים אחד אחרי השני, כך שבשלבי הביניים לפני הכנסת הקלט האחרון, יש לנו פונקציה עם פחות משתנים (ראו דוגמאות).

פונקציית קורי התגלתה לראשונה על ידי המתמטיקאי הרוסי-גרמני מוזס שנפינקל, אך התגלתה בשנית על ידי המתמטיקאי והלוגיקן האמריקאי הסקל קורי, שעל שמו היא נקראת.

== הגדרה ==

נגדיר את <math>Curry</math> בעזרת כתיב למדא:

<math>Curry: (A\times B \to C)\to (A \to (B\to C))</math>

<math>Curry = \lambda f\in A \times B \to C.\lambda a \in A.\lambda b\in B .f(<a,b>)</math>

תהי <math>f: A \times B \to C</math> פונקציה, בכתיב למדא היא "תירשם" כך:

:<math>f = \lambda \left\langle a,b\right\rangle \in A\times B . f\left(\left\langle a,b\right\rangle\right)</math>
אזי פונקציית קורי מתאימה ל-f את הפונקציה הבאה
:<math>Curry(f) = \lambda a \in A . \lambda b \in B . f\left(\left\langle a,b\right\rangle\right) </math>
שזו פונקציה המקבלת איבר ב-A ומחזירה פונקציה מ-B ל-C, כלומר: לכל <math>a \in A</math> מוחזרת הפונקציה
: <math>(Curry(f))(a) = [\![ \mbox{ } b \mapsto f(a,b) \mbox{ } ]\!]</math>

קיים גם התהליך ההפוך, שנקרא <math>\text{UnCurry}</math> או <math>\text{Curry}^{-1}</math>, שלוקח פונקציה <math>g: A \to (B \to C)</math> והופך אותה לפונקציה <math>Curry^{-1}(g) : A \times B \to C</math>. 
:<math>Curry^\mathrm{-1} = \lambda g\in A \to (B \to C).\lambda \left\langle a,b\right\rangle \in A \times B . (g(a))(b)</math>
: תהליכים אלה הופכיים אחד לשני ומהם מסיקים את האיזומורפיזם הבא:
: <math>\left( A \times B \to C \right) \cong \left( A \to (B \to C) \right)</math>
: <math>\mathrm{Hom}\left( A \times B , C \right) \cong \mathrm{Hom} \left( A ,\mathrm{Hom}(B,C) \right)</math>
:
:פונקציית קורי היא התאמה חד-חד-ערכית ועל בין <math>A\times B \to C</math>לבין <math>A \to (B\to C)</math>ומכך נובע שוויון עוצמות: לכל <math>A, B, C</math>קבוצות <math>\left|A\times B \to C\right| = \left|A \to (B\to C)\right|</math>. דבר זה מוכיח את משפט אריתמטיקת העוצמות <math>{\left| C \right|}^{\left(\left| A \right| \cdot \left| B \right|\right)} = {\left({\left| C \right|}^{\left| B \right|}\right)}^{\left| A \right|}</math>

== דוגמאות ==

=== דוגמה 1 ===

תהי <math>f : \mathbb{R} \times \mathbb{R} \to \mathbb{R}</math>, למשל: <math>f(x,y) = x + y</math>. בסימון למדא נכתוב אותה כך:
: <math>f = \lambda x , y . x + y</math>
אזי פונקציית קורי שלה היא
: <math>Curry(f) = \lambda x . \lambda y . x + y</math>

לדוגמה: 
: <math>f(3,4) = 3 + 4 = 7</math> 
בעוד ש-
: <math>(Curry(f))(3) = \lambda y. 3 + y</math> 

וזו פונקציה במשתנה y שבו אפשר להציב ערכים, למשל:
: <math>(((Curry(f))(3))(4) = ( \lambda y. 3 + y )(4) = 3 + 4 = 7</math>.

=== דוגמה 2 ===

תהי D הפונקציה הבאה: היא מקבלת פונקציה ממשית <math>f: \mathbb{R} \to \mathbb{R}</math> ומספר ממשי <math>x \in \mathbb{R}</math> ומחזירה את ערך הנגזרת של f בנקודה x, כלומר את <math>f'(x)</math>. לכן אפשר לרשום: <math>D(f,x)=f'(x)</math> כאשר <math>D: (\mathbb{R} \to \mathbb{R} ) \times \mathbb{R} \to \mathbb{R}</math>.

נסתכל על פונקציית קורי של D, זו פונקציה המקבלת פונקציה ממשית <math>f: \mathbb{R} \to \mathbb{R}</math> ומחזירה את הפונקציה הנגזרת שלה <math>f': \mathbb{R} \to \mathbb{R}</math> שהיא פונקציה המקבלת מספר ממשי <math>x \in \mathbb{R}</math> ומחזירה את ערך הנגזרת ב-x. כלומר: <math>(Curry(D))(f) = [\![ x \mapsto f'(x) ] \! ]</math> כאשר <math>Curry(D) : ( \mathbb{R} \to \mathbb{R} ) \to ( \mathbb{R} \to \mathbb{R} )</math>.

בפועל, כאשר רוצים לטפל בפונקציה D למעשה מטפלים בפונקציה <math>Curry(D)</math>: קודם מחשבים את הפונקציה הנגזרת ואז מציבים בה את הנקודה הרצויה.

== לקריאה נוספת ==

* ארנון אברון, [https://web.archive.org/web/20070306163611/http://www.cs.tau.ac.il/~odedr/book_discrete_math/bdida_all.pdf מבוא למתמטיקה בדידה], הוצאת אוניברסיטת תל אביב (עמ' 133-138).
קורי
קטגוריה:לוגיקה מתמטית