मैक्कार्थी 91 फ़ंक्शन

मैक्कार्थी 91 एक पुनरावर्ती कार्य (संगणक विज्ञान) है, जिसे संगणक वैज्ञानिक जॉन मैक्कार्थी (संगणक वैज्ञानिक)प्रत्यावर्तन (संगणक विज्ञान) के भीतर औपचारिक सत्यापन के लिए एक परीक्षण घटना के रूप में परिभाषित किया है।

मैक्कार्थी 91 कार्य को इस प्रकार परिभाषित किया गया है


 * $$M(n)=\begin{cases}

n - 10, & \mbox{if }n > 100\mbox{ } \\ M(M(n+11)), & \mbox{if }n \le 100\mbox{ } \end{cases}$$ कार्य के मूल्यांकन के परिणाम सभी पूर्णांक तर्कों n ≤ 100 के लिए M(n) = 91, और n > 100 के लिए M(n) = n − 10 द्वारा दिए गए हैं। वास्तव में, M(101) का परिणाम भी 91 (101 - 10 = 91) है। n = 101 के बाद M(n) के सभी परिणाम लगातार 1 से बढ़ रहे हैं, उदाहरण के लिए एम(102) = 92, एम(103) = 93।

इतिहास
91 कार्य को 1970 में जोहार मन्ना, अमीर पनुएली और जॉन मैक्कार्थी (संगणक वैज्ञानिक) द्वारा प्रकाशित पत्रों में प्रस्तुत किया गया था। ये आलेख औपचारिक सत्यापन के लिए औपचारिक विधियों के आवेदन की दिशा में प्रारंभिक विकास का प्रतिनिधित्व करते थे। 91 कार्य  को नेस्टेड-पुनरावर्ती (एकल प्रत्यावर्तन के विपरीत, जैसे कि परिभाषित करना) के लिए चुना गया था $$f(n)$$ के माध्यम से $$f(n-1)$$). यह उदाहरण मन्ना की पुस्तक, संगणना का गणितीय सिद्धांत (1974) द्वारा लोकप्रिय हुआ। जैसे-जैसे औपचारिक विधियों का क्षेत्र आगे बढ़ा, यह उदाहरण शोध साहित्य में बार-बार सामने आया।

विशेष रूप से, इसे स्वचालित प्रोग्राम सत्यापन के लिए एक चुनौती समस्या के रूप में देखा जाता है।

पूँछ प्रत्यावर्तन /पूँछ-पुनरावर्ती नियंत्रण प्रवाह के बारे में तर्क करना आसान है, यह एक समतुल्य (विस्तारकता) परिभाषा है:
 * $$M_t(n)= M_t'(n,1)$$
 * $$M_t'(n, c)=\begin{cases}

n, & \mbox{if }c = 0\\ M_t'(n-10, c-1), & \mbox{if }n > 100\mbox{ and } c \ne 0 \\ M_t'(n+11, c+1), & \mbox{if }n \le 100\mbox{ and } c \ne 0 \end{cases} $$ इस तरह के तर्क को प्रदर्शित करने के लिए उपयोग किए गए उदाहरणों में से एक के रूप में, मन्ना की पुस्तक में नेस्टेड-पुनरावर्ती 91 कार्य के बराबर एक पूँछ-पुनरावर्ती एल्गोरिदम सम्मिलित है। 91 कार्य  के स्वचालित सत्यापन (या समाप्ति प्रमाण) की रिपोर्ट करने वाले कई आलेख केवल पूँछ-पुनरावर्ती संस्करण को संभालते हैं।

यह एक समतुल्य पारस्परिक पुनरावर्तन पूँछ-पुनरावर्ती अतिरिक्त लैंग्वेज है:
 * $$M_{mt}(n)= M_{mt}'(n,0)$$
 * $$M_{mt}'(n,c)=\begin{cases}

M_{mt}''(n-10,c), & \mbox{if }n > 100\mbox{ } \\ M_{mt}'(n+11,c+1), & \mbox{if }n \le 100\mbox{ } \end{cases}$$
 * $$M_{mt}''(n,c)=\begin{cases}

n, & \mbox{if }c = 0\mbox{ } \\ M_{mt}'(n,c-1), & \mbox{if }c \ne 0\mbox{ } \end{cases}$$ नेस्टेड-पुनरावर्ती से पारस्परिक रूप से पूँछ-पुनरावर्ती संस्करण की औपचारिक व्युत्पत्ति 1980 के एक लेख में मिशेल वैंड द्वारा निरंतरता के उपयोग के आधार पर दी गई थी।

उदाहरण
उदाहरण ए:

M(99) = M(M(110)) since 99 ≤ 100 = M(100)   since 110 > 100 = M(M(111)) since 100 ≤ 100 = M(101)   since 111 > 100 = 91       since 101 > 100

उदाहरण बी:

M(87) = M(M(98)) = M(M(M(109))) = M(M(99)) = M(M(M(110))) = M(M(100)) = M(M(M(111))) = M(M(101)) = M(91) = M(M(102)) = M(92) = M(M(103)) = M(93) .... Pattern continues increasing till M(99), M(100) and M(101), exactly as we saw on the example A)      = M(101)    since 111 > 100       = 91        since 101 > 100

कोड
यहां लिस्प (प्रोग्रामिंग लैंग्वेज) में नेस्टेड-पुनरावर्ती एल्गोरिदम का कार्यान्वयन है:

हास्केल (प्रोग्रामिंग लैंग्वेज) में नेस्टेड-पुनरावर्ती एल्गोरिदम का कार्यान्वयन यहां दिया गया है:

यहां ओकैमल (प्रोग्रामिंग लैंग्वेज) में नेस्टेड-पुनरावर्ती एल्गोरिदम का कार्यान्वयन है:

यहां ओकैमल (प्रोग्रामिंग लैंग्वेज) में पूँछ-पुनरावर्ती एल्गोरिदम का कार्यान्वयन है:

यहां पायथन (प्रोग्रामिंग लैंग्वेज) में नेस्टेड-पुनरावर्ती एल्गोरिदम का कार्यान्वयन है:

यहां सी (प्रोग्रामिंग लैंग्वेज) में नेस्टेड-पुनरावर्ती एल्गोरिदम का कार्यान्वयन है:

यहां सी (प्रोग्रामिंग लैंग्वेज) में पूँछ-पुनरावर्ती एल्गोरिदम का कार्यान्वयन दिया गया है:

प्रमाण
यहाँ इसका प्रमाण है
 * $$M(n)=\begin{cases}

n - 10, & \mbox{if }n > 100\mbox{ } \\ 91, & \mbox{if }n \le 100\mbox{ } \end{cases}$$ जो $$M$$ गणना करने के लिए एक समतुल्य गैर-पुनरावर्ती कलन विधि प्रदान करता है.

n > 100 के लिए, समानता $$M$$ की परिलैंग्वेज से अनुसरण करती है। n ≤ 100 के लिए, 100 से नीचे की ओर एक मजबूत प्रेरण का उपयोग किया जा सकता है।

90 ≤ एन ≤ 100 के लिए,

M(n) = M(M(n + 11)), by definition = M(n + 11 - 10), since n + 11 > 100 = M(n + 1)

तो M(n) = M(101) = 91 90 ≤ n ≤ 100 के लिए।इसे आधार घटना के आधार पर उपयोग किया जा सकता है.

प्रेरण चरण के लिए, मान लीजिए n ≤ 89 और सभी n < i ≤ 100 के लिए M(i) = 91 मान लें, तो

M(n) = M(M(n + 11)), by definition = M(91), by hypothesis, since n < n + 11 ≤ 100 = 91, by the base case.

यह नकारात्मक मानों सहित सभी n ≤ 100 के लिए M(n) = 91 साबित करता है।

नुथ का सामान्यीकरण
डोनाल्ड नुथ ने अतिरिक्त मापदंडों को सम्मिलित करने के लिए 91 कार्य को सामान्यीकृत किया। जॉन काउल्स (गणितज्ञ) ने एसीएल2 प्रमेय कहावत का उपयोग करते हुए एक औपचारिक प्रमाण विकसित किया कि नुथ का सामान्यीकृत कार्य संपूर्ण था।