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

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

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

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

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

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

भाज्य फलन
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)। ध्यान दें कि  सभी की तरह, 0 से शुरू होता है  s, और इसलिए किसी आरंभीकरण की आवश्यकता नहीं है।

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 उदाहरण
नीचे दिया गया उदाहरण, जो एकरमैन फ़ंक्शन को लागू करता है, अनुक्रमों के लिए गोडेल नंबरिंग का उपयोग करके एक स्टैक अनुकरण पर निर्भर करता है | गोडेल नंबरिंग: यानी, पहले से परिभाषित संख्यात्मक कार्यों पर,  , और   संतुष्टि देने वाला  ,  , और. एक असीमित के बाद से  प्रयोग किया जाता है, यह एक कानूनी ब्लूपी प्रोग्राम नहीं है।   ई> इस मामले में निर्देश ब्लॉक के अंत तक जाते हैं और लूप को दोहराते हैं, इसके विपरीत , जो लूप से बाहर निकलता है।

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