פונקציה פרימיטיבית רקורסיבית

מתוך ויקיפדיה, האנציקלופדיה החופשית
קפיצה אל: ניווט, חיפוש

בתורת החישוביות, פונקציה פרימיטיבית רקורסיבית היא פונקציה בין מספר כלשהו של מכפלות קרטזיות של קבוצת המספרים הטבעיים עם עצמה לבין קבוצת המספרים הטבעיים, הנוצרת מהרכבת פונקציות ופעולה שנקראת "רקורסיה פרימיטיבית" באופן חוזר ונשנה על מספר פונקציות בסיסיות קבועות: הפונקציה הקבועה אפס, הוספת אחד, ובחירת אחד מרכיבי הקלט.

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

הגדרה[עריכת קוד מקור | עריכה]

בתורת החישוביות, מחלקה של פונקציות שלמות, נקראת סגורה תחת רקורסיה פרימיטיבית (Primitive Recursively Closed או PRC), אם היא סגורה תחת הפעולה של יצירת פונקציה חדשה מהפונקציות קיימות באופן הבא:

את הפונקציה החדשה נגדיר על נקודת התחלה באמצעות פונקציה קיימת, וכן נתאר את התקדמותה באמצעות פונקציה נוספת: אם \ f: \N^k \rightarrow \N ו-\ g: \N^{k+2} \rightarrow \N פונקציות שנמצאות במחלקה, אז הפונקציה \ h: \N^{k+1} \rightarrow \N שמוגדרת ברקורסיה:

  • \ h(0, x_1 , ... , x_k)=f(x_1, ... , x_k)
  • \ h(n+1,x_1, ... ,x_k)=g(h(n,x_1, ... ,x_k), n, x_1, ... ,x_k )

היא פונקציה הנוצרת מהן על ידי רקורסיה פרימיטיבית.

מחלקת הפונקציות הרקורסיביות פרימיטיביות היא מחלקת הפונקציות שמכילה את הפונקציות התחיליות:

  • \ 
s(x) = x+1
- פונקציית העוקב.
  • \ 
n(x) = 0
- פונקציית האפס.
  • \ s_n^i(x_1, ... , x_{i-1}, x_i, x_{i+1}, ... , x_n) = x_i - פונקציית ההטלה לרכיב ה-i.

ובנוסף סגורה לפעולות של הרכבה של פונקציות, ורקורסיה פרימיטיבית. כלומר, זוהי מחלקת הפונקציות שמכילה בדיוק את הפונקציות התחיליות, ואת כל הפונקציות המתקבלות משרשור והרכבה חוזרת ונשנית שלהן מספר סופי של פעמים. כל פונקציה השייכת למחלקה זו נקראת פונקציה פרימיטיבית רקורסיבית.

דוגמאות[עריכת קוד מקור | עריכה]

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

להלן מספר פונקציות פרימיטיביות רקורסיביות פשוטות:

חיבור[עריכת קוד מקור | עריכה]

פונקציית החיבור: \ f(x,y) = x+y
היא פונקציה פרימיטיבית רקורסיבית:

פונקציית הזהות, \ g(x) = x היא פונקציה רקורסיבית פרימיטיבית - זוהי למעשה פונקציית ההטלה לרכיב הראשון. לכן, ניתן להגדיר על ידי רקורסיה פרימיטיבית:

\ f(0,x) = g(x) =x
 \ f(n+1 , x) = s(f(n,x)) = f(n,x) + 1

כפל, חזקה, ועצרת[עריכת קוד מקור | עריכה]

פונקציית הכפל, החזקה והעצרת:

\ f(x,y) = x\cdot y
\ f(x,y) = x^y
\ f(x) = x!

הן פרימיטיבית רקורסיבית גם כן. ניתן להוכיח זאת באופן דומה לפונקציית החיבור.

חיסור[עריכת קוד מקור | עריכה]

פונקציית החיסור מקבלת כקלט שני מספרים טבעיים, ומחזירה את ההפרש ביניהם. תמונת פונקציית החיסור אינה תמיד מספר טבעי, ולכן יש לתקן זאת. למשל, כאשר מופעלת פונקציית החיסור הרגילה על הפרמטרים 4 ו6 (ארבע פחות שש), תמונת הפונקציה תהיה הערך מינוס 2, אשר אינו מספר טבעי. לכן נשנה את תמונת הפונקציה ל-0 כאשר התמונה שלילית. כך, תמונת הפונקציה על הפרמטרים 4 ו-6 היא 0.

כלומר, נגדיר:  f(x,y)=\left\{\begin{matrix} y-x, & x \le y \\ 0, & \mbox{else } \end{matrix}\right. ופונקציה זו תשמש אותנו כפונקציית החיסור, המצומצמת למספרים הטבעיים.

כדי ליצור את פונקציית החיסור יש ליצור את פונקציית ה"קודם" - \ p(x) שמחזירה לכל מספר, חוץ מאפס, את המספר הקודם לו, ועבור אפס - היא מחזירה אפס. את פונקציית הקודם ניתן להגדיר על ידי רקורסיה פרימיטיבית:

\ p(0) = 0
\ p (n+1) = n

מכאן ניתן להגדיר את החיסור:

\ f(0,x) = x
\ f(n+1,x) = p (f (n,x) )

חילוק[עריכת קוד מקור | עריכה]

בדומה לפונקציית החיסור, מתקנים את פונקציית החילוק כך שתמונתה תהיה תמיד מספרים שלמים. לכן, מגדירים את פונקציית החילוק כעיגול כלפי מעלה של תוצאת החילוק. זהו למעשה חילוק עם שארית שלילית, כאשר מתעלמים מהשארית. החילוק מתבצע כך:

\ f(x,y) = n, x = y \cdot n + m , \ -y < m \le 0

נגדיר את פונקציית החילוק:

\ g(0,x) = 0
\ g(x , y ) = s(g (x-y , y)) - כאשר החיסור פועל כמו שהוגדר לעיל.

שימושים[עריכת קוד מקור | עריכה]

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

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

קשר למודלים חישוביים שונים[עריכת קוד מקור | עריכה]

קיימים קשרים הדוקים בין פונקציות פרימיטיביות רקורסיביות, ופונקציות רקורסיביות. לדוגמה, ניתן להראת שאם פונקציה היא רקורסיבית, ועוצרת תמיד לאחר מספר ידוע של צעדים (שחסום על ידי פונקציה פרימיטיבית רקורסיבית), אזי היא גם פרימיטיבית רקורסיבית.

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

ראו גם[עריכת קוד מקור | עריכה]