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

פונקציית Curry היא פונקציה המקבלת פונקציה דו-מקומית f : A × B → C {\displaystyle f:A\times B\to C} ומחזירה פונקציה שמחזירה פונקציה Curry ( f ) : A → ( B → C ) {\displaystyle {\text{Curry}}\left(f\right):A\to (B\to C)} . באופן פורמלי, קל להגדיר את פונקציית קורי באמצעות תחשיב למדא. באופן אינטואיטיבי, פונקציית קורי היא פונקציה שבמקום להכניס מספר קלטים ב"בת-אחת" בפונקציה המקורית, יוצרת ממנה פונקציה שבה מכניסים את הקלטים אחד אחרי השני, כך שבשלבי הביניים לפני הכנסת הקלט האחרון, יש לנו פונקציה עם פחות משתנים (ראו דוגמאות). פונקציית קורי התגלתה לראשונה על ידי המתמטיקאי הרוסי-גרמני מוזס שנפינקל, אך התגלתה בשנית על ידי המתמטיקאי והלוגיקן האמריקאי הסקל קורי, שעל שמו היא נקראת. נגדיר את C u r r y {\displaystyle Curry} בעזרת כתיב למדא: C u r r y : ( A × B → C ) → ( A → ( B → C ) ) {\displaystyle Curry:(A\times B\to C)\to (A\to (B\to C))} C u r r y = λ f ∈ A × B → C . λ a ∈ A . λ b ∈ B . f ( < a , b > ) {\displaystyle Curry=\lambda f\in A\times B\to C.\lambda a\in A.\lambda b\in B.f(<a,b>)} תהי f : A × B → C {\displaystyle f:A\times B\to C} פונקציה, בכתיב למדא היא "תירשם" כך: f = λ ⟨ a , b ⟩ ∈ A × B . f ( ⟨ a , b ⟩ ) {\displaystyle f=\lambda \left\langle a,b\right\rangle \in A\times B.f\left(\left\langle a,b\right\rangle \right)} אזי פונקציית קורי מתאימה ל-f את הפונקציה הבאה C u r r y ( f ) = λ a ∈ A . λ b ∈ B . f ( ⟨ a , b ⟩ ) {\displaystyle Curry(f)=\lambda a\in A.\lambda b\in B.f\left(\left\langle a,b\right\rangle \right)} שזו פונקציה המקבלת איבר ב-A ומחזירה פונקציה מ-B ל-C, כלומר: לכל a ∈ A {\displaystyle a\in A} מוחזרת הפונקציה ( C u r r y ( f ) ) ( a ) = [ [   b ↦ f ( a , b )   ] ] {\displaystyle (Curry(f))(a)=[\![{\mbox{ }}b\mapsto f(a,b){\mbox{ }}]\!]} קיים גם התהליך ההפוך, שנקרא UnCurry {\displaystyle {\text{UnCurry}}} או Curry − 1 {\displaystyle {\text{Curry}}^{-1}} , שלוקח פונקציה g : A → ( B → C ) {\displaystyle g:A\to (B\to C)} והופך אותה לפונקציה C u r r y − 1 ( g ) : A × B → C {\displaystyle Curry^{-1}(g):A\times B\to C} . C u r r y − 1 = λ g ∈ A → ( B → C ) . λ ⟨ a , b ⟩ ∈ A × B . ( g ( a ) ) ( b ) {\displaystyle 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)} תהליכים אלה הופכיים אחד לשני ומהם מסיקים את האיזומורפיזם הבא: ( A × B → C ) ≅ ( A → ( B → C ) ) {\displaystyle \left(A\times B\to C\right)\cong \left(A\to (B\to C)\right)} H o m ( A × B , C ) ≅ H o m ( A , H o m ( B , C ) ) {\displaystyle \mathrm {Hom} \left(A\times B,C\right)\cong \mathrm {Hom} \left(A,\mathrm {Hom} (B,C)\right)} פונקציית קורי היא התאמה חד-חד-ערכית ועל בין A × B → C {\displaystyle A\times B\to C} לבין A → ( B → C ) {\displaystyle A\to (B\to C)} ומכך נובע שוויון עוצמות: לכל A , B , C {\displaystyle A,B,C} קבוצות | A × B → C | = | A → ( B → C ) | {\displaystyle \left|A\times B\to C\right|=\left|A\to (B\to C)\right|} . דבר זה מוכיח את משפט אריתמטיקת העוצמות | C | ( | A | ⋅ | B | ) = ( | C | | B | ) | A | {\displaystyle {\left|C\right|}^{\left(\left|A\right|\cdot \left|B\right|\right)}={\left({\left|C\right|}^{\left|B\right|}\right)}^{\left|A\right|}} תהי f : R × R → R {\displaystyle f:\mathbb {R} \times \mathbb {R} \to \mathbb {R} } , למשל: f ( x , y ) = x + y {\displaystyle f(x,y)=x+y} . בסימון למדא נכתוב אותה כך: f = λ x , y . x + y {\displaystyle f=\lambda x,y.x+y} אזי פונקציית קורי שלה היא C u r r y ( f ) = λ x . λ y . x + y {\displaystyle Curry(f)=\lambda x.\lambda y.x+y} לדוגמה: f ( 3 , 4 ) = 3 + 4 = 7 {\displaystyle f(3,4)=3+4=7} בעוד ש- ( C u r r y ( f ) ) ( 3 ) = λ y .3 + y {\displaystyle (Curry(f))(3)=\lambda y.3+y} וזו פונקציה במשתנה y שבו אפשר להציב ערכים, למשל: ( ( ( C u r r y ( f ) ) ( 3 ) ) ( 4 ) = ( λ y .3 + y ) ( 4 ) = 3 + 4 = 7 {\displaystyle (((Curry(f))(3))(4)=(\lambda y.3+y)(4)=3+4=7} . תהי D הפונקציה הבאה: היא מקבלת פונקציה ממשית f : R → R {\displaystyle f:\mathbb {R} \to \mathbb {R} } ומספר ממשי x ∈ R {\displaystyle x\in \mathbb {R} } ומחזירה את ערך הנגזרת של f בנקודה x, כלומר את f ′ ( x ) {\displaystyle f'(x)} . לכן אפשר לרשום: D ( f , x ) = f ′ ( x ) {\displaystyle D(f,x)=f'(x)} כאשר D : ( R → R ) × R → R {\displaystyle D:(\mathbb {R} \to \mathbb {R} )\times \mathbb {R} \to \mathbb {R} } . נסתכל על פונקציית קורי של D, זו פונקציה המקבלת פונקציה ממשית f : R → R {\displaystyle f:\mathbb {R} \to \mathbb {R} } ומחזירה את הפונקציה הנגזרת שלה f ′ : R → R {\displaystyle f':\mathbb {R} \to \mathbb {R} } שהיא פונקציה המקבלת מספר ממשי x ∈ R {\displaystyle x\in \mathbb {R} } ומחזירה את ערך הנגזרת ב-x. כלומר: ( C u r r y ( D ) ) ( f ) = [ [ x ↦ f ′ ( x ) ] ] {\displaystyle (Curry(D))(f)=[\![x\mapsto f'(x)]\!]} כאשר C u r r y ( D ) : ( R → R ) → ( R → R ) {\displaystyle Curry(D):(\mathbb {R} \to \mathbb {R} )\to (\mathbb {R} \to \mathbb {R} )} . בפועל, כאשר רוצים לטפל בפונקציה D למעשה מטפלים בפונקציה C u r r y ( D ) {\displaystyle Curry(D)} : קודם מחשבים את הפונקציה הנגזרת ואז מציבים בה את הנקודה הרצויה. ארנון אברון, מבוא למתמטיקה בדידה, הוצאת אוניברסיטת תל אביב (עמ' 133-138).