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

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

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

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

את הפונקציה החדשה נגדיר על נקודת התחלה באמצעות פונקציה קיימת, וכן נתאר את התקדמותה באמצעות פונקציה נוספת: אם <math>f \colon \N^k \rightarrow \N</math> ו-<math>g \colon \N^{k+2} \rightarrow \N</math> פונקציות שנמצאות במחלקה, אז הפונקציה <math>h \colon \N^{k+1} \rightarrow \N</math> שמוגדרת ברקורסיה:
*<math>h(0, x_1 , ... , x_k)=f(x_1, ... , x_k)</math>
*<math>h(n+1,x_1, ... ,x_k)=g(h(n,x_1, ... ,x_k), n, x_1, ... ,x_k )</math>
היא פונקציה הנוצרת מהן על ידי רקורסיה פרימיטיבית.

מחלקת הפונקציות הרקורסיביות פרימיטיביות היא מחלקת הפונקציות שמכילה את הפונקציות התחיליות:
*<math>s(x) = x+1
</math> - פונקציית העוקב.
*<math>n(x) = 0
</math> - פונקציית האפס.
*<math>s_n^i(x_1, ... , x_{i-1}, x_i, x_{i+1}, ... , x_n) = x_i</math> - פונקציית ההטלה לרכיב ה-<math>i</math>.
ובנוסף סגורה לפעולות של הרכבה של פונקציות, ורקורסיה פרימיטיבית. כלומר, זוהי מחלקת הפונקציות שמכילה בדיוק את הפונקציות התחיליות, ואת כל הפונקציות המתקבלות משרשור והרכבה חוזרת ונשנית שלהן מספר סופי של פעמים. כל פונקציה השייכת למחלקה זו נקראת פונקציה פרימיטיבית רקורסיבית.

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

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

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

פונקציית הזהות, <math>g(x) = x</math> היא פונקציה רקורסיבית פרימיטיבית - זוהי למעשה פונקציית ההטלה לרכיב הראשון. לכן, ניתן להגדיר על ידי רקורסיה פרימיטיבית:
:<math>\ f(0,x) = g(x) =x</math>
:<math> \ f(n+1 , x) = s(f(n,x)) = f(n,x) + 1</math>

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

<math>f(x,y) = x\cdot y </math><br /><math>f(x,y) = x^y </math><br /><math>f(x) = x! </math><br />

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

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

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

כדי ליצור את פונקציית החיסור יש ליצור את פונקציית ה"קודם" - <math>p(x)</math> שמחזירה לכל מספר, חוץ מאפס, את המספר הקודם לו, ועבור אפס - היא מחזירה אפס. את פונקציית הקודם ניתן להגדיר על ידי רקורסיה פרימיטיבית:
:<math>p(0) = 0</math>
:<math>p(n+1) = n</math>
מכאן ניתן להגדיר את החיסור:
:<math>f(0,x) = x</math>
:<math>f(n+1,x) = p (f (n,x) )</math>
===חילוק===
בדומה לפונקציית החיסור, מתקנים את פונקציית החילוק כך שתמונתה תהיה תמיד מספרים שלמים. לכן, מגדירים את פונקציית החילוק כעיגול כלפי מעלה של תוצאת החילוק. זהו למעשה חילוק עם שארית שלילית, כאשר מתעלמים מהשארית. החילוק מתבצע כך:
:<math>f(x,y) = n, x = y \cdot n + m , \ -y < m \le 0</math>
נגדיר את פונקציית החילוק:
:<math>g(0,x) = 0</math>
:<math>g(x , y) = s(g (x-y , y))</math> - כאשר החיסור פועל כמו שהוגדר לעיל.

== שימושים ==

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

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

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

==ראו גם==
* חישוביות

==קישורים חיצוניים==

קטגוריה:ערכים שבהם תבנית בריטניקה אינה מתאימה
קטגוריה:סיבוכיות חישובית
קטגוריה:רקורסיה
פרימיטיבית רקורסיבית

uk:Рекурсивні функції#Примітивно рекурсивна функція