बीलूप और एफलूप

BlooP और FlooP (बाउंडेड लूप और फ्री लूप) सरल प्रोग्रामिंग लैंग्वेज हैं जिन्हें डगलस हॉफ़स्टैटर ने अपनी पुस्तक गोडेल, एस्चर, बाख में एक बिंदु को चित्रित करने के लिए डिज़ाइन किया है। ब्लूपी एक ट्यूरिंग पूर्णता या गैर-ट्यूरिंग-पूर्ण प्रोग्रामिंग लैंग्वेज  है जिसकी मुख्य नियंत्रण प्रवाह संरचना एक बाउंडेड लूप (कंप्यूटिंग) है (अथार्त रिकर्सन (कंप्यूटर विज्ञान) की अनुमति नहीं है)। लैंग्वेज  के सभी प्रोग्राम समाप्त होने चाहिए, और यह लैंग्वेज  केवल प्रिमिटिव  रिकर्सिव फंक्शन को व्यक्त कर सकती है।

फ़्लूपी ब्लूपी के समान है, अतिरिक्त इसके कि यह अनबाउंड लूप का समर्थन करता है; यह एक ट्यूरिंग-पूर्ण लैंग्वेज है और सभी गणना योग्य कार्य को व्यक्त कर सकती है। उदाहरण के लिए, यह एकरमैन फ़ंक्शन को व्यक्त कर सकता है, जो (प्रिमिटिव  पुनरावर्ती नहीं होने के कारण) ब्लूपी में नहीं लिखा जा सकता है। गणितीय तर्क में मानक शब्दावली से ऋण लेता है, हॉफ़स्टैटर फ़्लूपी के अनबाउंड लूप्स को एमयू-लूप्स कहते हैं। सभी ट्यूरिंग-पूर्ण प्रोग्रामिंग लैंग्वेज ओं की तरह, फ़्लूपी हाल्टिंग की समस्या से ग्रस्त है: प्रोग्राम समाप्त नहीं हो सकते हैं, और सामान्य रूप से यह तय करना संभव नहीं है कि कौन से प्रोग्राम समाप्त होते हैं।

ब्लूपी और फ्लोपी को गणना के मॉडल के रूप में माना जा सकता है, और कभी-कभी कम्प्यूटेबिलिटी सिखाने में इसका उपयोग किया जाता है।

ब्लूपी उदाहरण
एकमात्र चर (प्रक्रिया का रिटर्न मान) और   (प्राकृतिक-संख्या चर का एक असीमित अनुक्रम, स्थिरांक द्वारा अनुक्रमित, जैसा कि असीमित रजिस्टर मशीन ) में है। एकमात्र ऑपरेटर   (assignment),   (addition),   (multiplication),   (less-than),   (greater-than) and   (equals) हैं।

प्रत्येक प्रोग्राम केवल सीमित संख्या में सेल्स का उपयोग करता है, किन्तु  सेल्स  में संख्या इच्छित रूप से बड़ी हो सकती है। सूचियों या स्टैक जैसी डेटा संरचनाओं को सेल में संख्या की विशिष्ट विधियों से व्याख्या करके नियंत्रित किया जा सकता है, अर्थात, अनुक्रमों के लिए गोडेल नंबरिंग द्वारा गोडेल संभावित संरचनाओं को क्रमांकित करता है।

नियंत्रण प्रवाह संरचनाओं में बाउंडेड लूप्स, कंडीशनल स्टेटमेंट्स, लूप्स से बाहर कूदता है, और    ब्लॉक से बाहर कूदता है। ब्लूपी रिकर्सन, अप्रतिबंधित जम्प्स या ऐसी किसी भी चीज़ की अनुमति नहीं देता है जिसका प्रभाव फ़्लूपी के अनबाउंड लूप के समान हो। नामित प्रक्रियाओं को परिभाषित किया जा सकता है, किंतु इन्हें केवल पहले से परिभाषित प्रक्रियाओं को ही कहा जा सकता है।

फैक्टोरियल फ़ंक्शन
DEFINE PROCEDURE FACTORIAL [N]: BLOCK 0: BEGIN OUTPUT ⇐ 1; CELL(0) ⇐ 1; LOOP AT MOST N TIMES: BLOCK 1: BEGIN OUTPUT ⇐ OUTPUT × CELL(0); CELL(0) ⇐ CELL(0) + 1; BLOCK 1: END; BLOCK 0: END.

सबट्रैक्सन फ़ंक्शन
यह एक अंतर्निहित ऑपरेशन नहीं है और (प्राकृतिक संख्याओं पर परिभाषित होने के कारण) कभी भी ऋणात्मक परिणाम नहीं देता है (जैसे 2 − 3 := 0)। ध्यान दें कि आउटपुट सभी s,की तरह 0 से प्रारंभ   होता है, और इसलिए किसी आरंभीकरण की आवश्यकता नहीं होती है।

DEFINE PROCEDURE MINUS [M,N]: BLOCK 0: BEGIN IF M < N, THEN: QUIT BLOCK 0; LOOP AT MOST M + 1 TIMES: BLOCK 1: BEGIN IF OUTPUT + N = M, THEN: ABORT LOOP 1; OUTPUT ⇐ OUTPUT + 1; BLOCK 1: END; BLOCK 0: END.

FlooP उदाहरण
नीचे दिया गया उदाहरण, जो एकरमैन फ़ंक्शन को कार्यान्वित करता है, गोडेल नंबरिंग का उपयोग करके एक स्टैक अनुकरण पर निर्भर करता है: यानी, पहले से परिभाषित संख्यात्मक फ़ंक्शंस,  , and  को संतुष्ट करने वाले  ,  , and   चूंकि एक अनबाउंड   का उपयोग किया जाता है, यह एक नियमित ब्लूपी प्रोग्राम नहीं है। इस स्थिति में   निर्देश ब्लॉक के अंत तक जाते हैं और लूप को दोहराते हैं,  के विपरीत, जो लूप से बाहर निकलता है।

DEFINE PROCEDURE ACKERMANN [M, N]: BLOCK 0: BEGIN CELL(0) ⇐ M;	OUTPUT ⇐ N;	CELL(1) ⇐ 0; MU-LOOP: BLOCK 1: BEGIN IF CELL(0) = 0, THEN: BLOCK 2: BEGIN OUTPUT ⇐ OUTPUT + 1; IF CELL(1) = 0, THEN: ABORT LOOP 1; CELL(0) ⇐ TOP [CELL(1)]; CELL(1) ⇐ POP [CELL(1)]; QUIT BLOCK 1; BLOCK 2: END IF OUTPUT = 0, THEN: BLOCK 3: BEGIN OUTPUT ⇐ 1; CELL(0) ⇐ MINUS [CELL(0), 1]; QUIT BLOCK 1; BLOCK 3: END OUTPUT ⇐ MINUS [OUTPUT, 1]; CELL(1) ⇐ PUSH [MINUS [CELL(0), 1], CELL(1)]; BLOCK 1: END; BLOCK 0: END.

यह भी देखें

 * मशीन जो सदैव हल्ट्स है

बाहरी संबंध

 * Dictionary of Programming Languages - BLooP
 * Dictionary of Programming Languages - FLooP
 * The Retrocomputing Museum
 * Portland Pattern Repository: Bloop Floop and Gloop
 * A compiler for BlooP and FlooP