कथन बदलें (स्विच स्टेटमेंट)

कंप्यूटर programming languages में, स्विच स्टेटमेंट एक प्रकार का सलेक्शन कण्ट्रोल मैकेनिज्म है जिसका उपयोग सर्च और मैप के माध्यम से प्रोग्राम निष्पादन के कण्ट्रोल फ्लो को परिवर्तित करने के लिए किसी वेरिएबल या अभिव्यंजन के मान को अनुमति देने के लिए किया जाता है।

स्विच स्टेटमेंट कुछ कुछ C/C++, C#, विज़ुअल बेसिक .NET, Java जैसी programming languages में उपयोग किए जाने वाले   स्टेटमेंट के समान कार्य करते हैं और अधिकांश उच्च स्तरीय अत्यावश्यक programming languages  जैसे Pascal, Ada, C/C++, C#,   विज़ुअल बेसिक .NET, Java,  और कई अन्य प्रकार की language में विद्यमान हैं, जिनमें ,  ,   या  जैसे कीवर्ड का उपयोग किया जाता है।

स्विच स्टेटमेंट दो मुख्य प्रकार के होते हैं: पास्कल जैसे स्ट्रक्चर्ड स्विच जो यथार्थतः एक ब्रांच प्राप्त करता है, और C जैसे अनस्ट्रक्चर्ड स्विच जो एक तरह के गोटू के रूप में काम करता है। स्विच का उपयोग करने के मुख्य कारण में से एक यह है कि यह स्पष्टता को उत्कृष्ट बनाने में सहायता करता है, क्योंकि इससे पुनरावृत्तीय कोडिंग को कम किया जा सकता है, और (यदि ह्यूरिस्टिक्स अनुमति प्रदान करती है) बहुत से स्थितियों में सहज कंपाइलर अनुकूलन के माध्यम से तेज निष्पादन की संभावना भी प्रदान करता है।

इतिहास
इसके 1952 के पाठ इंट्रोडक्शन टू मेटामैथेमेटिक्स में, स्टीफन क्लीन ने औपचारिक रूप से प्रमाणित कर दिया कि CASE फ़ंक्शन (IF-THEN-ELSE फ़ंक्शन इसका सबसे सरल रूप है) एक प्राथमिक पुनरावर्ती फंक्शन (प्रिमिटिव रिकर्सिव फंक्शन) है, जहां उन्होंने  की अवधारणा को निम्नलिखित तरीके से परिभाषित किया है:


 * "#F. फंक्शन φ इस प्रकार परिभाषित किया गया है
 * φ(x1, ... , xn ) =
 * φ1(x1, ... , xn ) if Q1(x1 , ... , xn ),
 * φm(x1, ... , xn ) if Qm(x1 , ... , xn ),
 * φm+1(x1, ... , xn ) अन्यथा,  जहां Q1 , ... , Qm परस्पर एक्सक्लूसिव प्रेडिकटेस हैं (या φ(x1 , ... , xn) का मान लागू होने वाले पहले परिच्छेद (क्लॉज़) द्वारा दिया जाएगा) φ1, ..., φm+1, Q1, ..., Qm+1 में प्रिमिटिव रिकर्सिव है।
 * φm+1(x1, ... , xn ) अन्यथा,  जहां Q1 , ... , Qm परस्पर एक्सक्लूसिव प्रेडिकटेस हैं (या φ(x1 , ... , xn) का मान लागू होने वाले पहले परिच्छेद (क्लॉज़) द्वारा दिया जाएगा) φ1, ..., φm+1, Q1, ..., Qm+1 में प्रिमिटिव रिकर्सिव है।

क्लीन बूलियन-जैसे रिकर्सिव फंक्शन "साइन-ऑफ़" sg और "नॉट साइन ऑफ़" ~sg के संदर्भ में इसका प्रमाण प्रदान करता है (क्लीन 1952:222-223); यदि इसका इनपुट सकारात्मक है तो सर्वप्रथम 1 लौटाता है और यदि इसका इनपुट नकारात्मक है तो −1 लौटाता है।

बूलोस-बर्गेस-जेफरी ने अतिरिक्त अवलोकन किया कि "डेफिनिशन बाय केसेस" को साथ ही म्युचली एक्सक्लूसिव और म्युचली एक्सहॉस्टिव होना आवश्यक है। वे भी इस फ़ंक्शन की प्रिमिटिव रिकर्सिवनेस्स का प्रमाण देते हैं (बूलोस-बर्गेस-जेफरी 2002:74-75)।

IF-THEN-ELSE मैकार्थी फोरमालिस्म का आधार है: इसका उपयोग प्रिमिटिव रिकर्सन और म्यू-ऑपरेटर दोनों को प्रतिस्थापित करता है।

विशिष्ट सिंटेक्स
अधिकांश languages में, प्रोग्रामर एक या दो कीवर्ड का उपयोग करके कई एकाकी लाइनों में स्विच स्टेटमेंट लिखते हैं। एक सामान्य सिंटेक्स में सम्मिलित हैं:


 * सर्वप्रथम, उसके बाद एक एक्सप्रेशन जिसे प्रायः स्विच स्टेटमेंट की कण्ट्रोल एक्सप्रेशन या कण्ट्रोल वेरिएबल के रूप में संदर्भित किया जाता है
 * वास्तविक स्थितियों (मूल्यों) को परिभाषित करने वाली बाद की पंक्तियाँ, मिलान होने पर निष्पादन के लिए बयानों के संगत अनुक्रम के साथ
 * फॉलथ्रू बिहेवियर वाली languages में,  स्टेटमेंट सामान्यतः उक्त स्टेटमेंट को समाप्त करने के लिए   स्टेटमेंट का अनुसरण करता है। [वेल्स]
 * कुछ languages में, जैसे, पीएल/आई, कण्ट्रोल एक्सप्रेशन वैकल्पिक है; यदि कोई कण्ट्रोल एक्सप्रेशन नहीं है, तो प्रत्येक विकल्प एक बूलियन एक्सप्रेशन वाले  क्लॉज से शुरू होता है और पहले स्थिति के लिए एक मिलान होता है जिसके लिए वह एक्सप्रेशन सही मूल्यांकन करती है। यह उपयोग कुछ अन्य languages में if/then/elseif/else संरचनाओं के समान है, उदाहरण के लिए, पर्ल।
 * कुछ languages में, उदाहरण के लिए, Rexx, किसी भी कण्ट्रोल एक्सप्रेशन की अनुमति नहीं है और प्रत्येक विकल्प एक बूलियन एक्सप्रेशन वाले  क्लॉज से शुरू होता है और पहले स्थिति के लिए एक मिलान होता है जिसके लिए वह एक्सप्रेशन सत्य का मूल्यांकन करती है।

प्रत्येक विकल्प विशेष मान, या मानों की सूची (नीचे देखें) से शुरू होता है, जिससे कण्ट्रोल चर मेल खा सकता है और जो कण्ट्रोल को स्टेटमेंट्स के संगत अनुक्रम में ले जाने का कारण बनेगा। मान (या मानों की सूची/श्रेणी) को सामान्यतः संबंधित स्टेटमेंट अनुक्रम से एक कोलन या एक निहितार्थ एरो द्वारा अलग किया जाता है। कई languages में, प्रत्येक केस के पहले कोई कीवर्ड भी होना चाहिए जैसे कि  या  ।

वैकल्पिक डिफ़ॉल्ट स्थिति की भी सामान्यतः अनुमति होती है, जो,  , या   कीवर्ड द्वारा निर्दिष्ट होता है। यह तब निष्पादित होता है जब कोई अन्य मामला कण्ट्रोल एक्सप्रेशन से मेल नहीं खाता है। कुछ languages में, जैसे कि C, यदि कोई भी स्थिति समतुल्य नहीं होती है और   को छोड़ दिया जाता है तो   स्टेटमेंट बस समाप्त हो जाता है। अन्य में, जैसे पीएल/आई में, एक त्रुटि उत्पन्न होती है।

शब्दार्थ
शब्दार्थ की दृष्टि से, स्विच स्टेटमेंट के दो मुख्य रूप हैं।

सर्वप्रथम रूप स्ट्रक्चर्ड स्विच है, जैसे पास्कल में, जहां यथार्थतः एक ब्रांच प्राप्त करता है, और स्थितियों को अलग, विशिष्ट ब्लॉक के रूप में माना जाता है। यह एक सामान्यीकृत if–then–else सशर्त के रूप में कार्य करता है, यहाँ केवल दो नहीं बल्कि किसी भी संख्या में ब्रांचएँ होती हैं।

दूसरा रूप अनस्ट्रक्चर्ड स्विच है, जैसा कि C में है, जहां स्थितियों को एक ही ब्लॉक के भीतर लेबल के रूप में माना जाता है, और स्विच एक सामान्यीकृत गोटो के रूप में कार्य करता है। इस भेद को फॉलथ्रू के उपचार के रूप में जाना जाता है, जिसे नीचे विस्तार से बताया गया है।

फाल्थ्रू
कई languages में, केवल समतुल्य ब्लॉक को निष्पादित किया जाता है, और फिर स्विच स्टेटमेंट के अंत में निष्पादन सतत रहता है। इनमें पास्कल वर्ग (ऑब्जेक्ट पास्कल, मोडुला, ओबेरॉन, एडा, आदि) के साथ-साथ पीएल/आई, फोरट्रान के आधुनिक रूप और पास्कल से प्रभावित बेसिक बोलियाँ, अधिकांश कार्यात्मक languages और कई अन्य सम्मिलित हैं। एक ही कोड को निष्पादित करने के लिए कई मानों की अनुमति देने के लिए (और डुप्लिकेट कोड करने की आवश्यकता से बचने के लिए), पास्कल-प्रकार की languages प्रति स्थिति में किसी भी संख्या में मानों की अनुमति देती हैं, जो अल्पविराम से अलग की गई सूची के रूप में, एक श्रेणी के रूप में या एक संयोजन के रूप में दी जाती हैं।

C language से प्रगत languages और अधिक सामान्य रूप से फोरट्रान के गणना की गई जीओटीओ से प्रभावित languages, फॉलथ्रू का प्रदर्शन करती हैं। इसमें कण्ट्रोल मिलता है जो मिलाने वाले केस में जाता है, और फिर निष्पादन सोर्स पाठ में अगले केस के साथ जारी रखता है ("फॉलथ्रू" होता है)। फॉलथ्रू के द्वारा, एक ही बिंदु के साथ कई मान पूर्णतः कोई विशेष विधि के बिना मिल सकते हैं: वे बस एम्प्टी बॉडी के साथ सूचीबद्ध होते हैं। मानों को मामले के शरीर में कोड से विशेष शर्ताधारी किया जा सकता है। व्यावहारिक रूप से, फॉलथ्रू साधारण तौर पर मिलाने वाले शरीर के अंत में एक ब्रेक कीवर्ड के साथ रोका जाता है, जो स्विच ब्लॉक के निष्पादन को बंद कर देता है, लेकिन अगर प्रोग्रामर भूल जाता है तो यह अचानकी फॉलथ्रू के कारण बग्स का कारण बन सकता है। केस बॉडी में कोड के साथ मूल्यों को विशेष रूप से अनुकूलित किया जा सकता है। व्यवहार में, फॉलथ्रू को सामान्यतः मिलान निकाय के अंत में एक  कीवर्ड के साथ रोका जाता है, जो स्विच ब्लॉक के निष्पादन से बाहर निकलता है, लेकिन यदि प्रोग्रामर   स्टेटमेंट डालना भूल जाता है तो यह अनजाने में फॉलथ्रू के कारण बग उत्पन्न कर सकता है। इस प्रकार इसे कई लोगों द्वारा language के मस्से के रूप में देखा जाता है, और कुछ लिंट टूल्स में इसके प्रति चेतावनी दी जाती है। वाक्यात्मक रूप से, स्थितियों को लेबल के रूप में समझा जाता है, ब्लॉक के रूप में नहीं, और स्विच और   स्टेटमेंट स्पष्ट रूप से कण्ट्रोल प्रवाह को बदलते हैं। C से प्रभावित कुछ languages, जैसे कि JavaScript, डिफॉल्ट फॉलथ्रू को बनाए रखती हैं, जबकि अन्य फॉलथ्रू को हटा देती हैं, या केवल विशेष परिस्थितियों में ही इसकी अनुमति देती हैं। सी-वर्ग में इस पर उल्लेखनीय विविधताओं में C# सम्मिलित है, जिसमें सभी ब्लॉकों को   या   के साथ समाप्त किया जाना चाहिए जब तक कि ब्लॉक खाली न हो (अर्थात फॉलथ्रू का उपयोग कई मान निर्दिष्ट करने के तरीके के रूप में किया जाता है)।

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

स्विच स्टेटमेंट का एक उदाहरण जो फ़ॉलथ्रू पर निर्भर करता है वह डफ़ का उपकरण है।

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

सामान्यतः, यह पता लगाने का एकमात्र तरीका कि यह अनुकूलन हुआ है या नहीं, वास्तव में कंपाइलर द्वारा उत्पन्न परिणामी असेंबली या मशीन कोड आउटपुट को देखना है।

लाभ और हानि
कुछ languages और प्रोग्रामिंग वातावरणों में,  या   स्टेटमेंट का उपयोग if else if स्टेटमेंट की समकक्ष श्रृंखला से बेहतर माना जाता है क्योंकि यह है:


 * डिबग करना आसान है (उदाहरण के लिए कोड बनाम कॉल टेबल पर ब्रेकपॉइंट सेट करना, यदि डिबगर में कोई सशर्त ब्रेकपॉइंट क्षमता नहीं है)
 * किसी व्यक्ति के लिए पढ़ना आसान है
 * समझना आसान है, और परिणामस्वरूप बनाए रखना आसान है
 * निश्चित गहराई: "if else if" स्टेटमेंट्स का एक क्रम गहरी नेस्टिंग उत्पन्न कर सकता है, जिससे संकलन अधिक कठिन हो जाता है (विशेषकर स्वचालित रूप से उत्पन्न कोड में)
 * यह सत्यापित करना आसान है कि सभी मान संभाले गए हैं। कंपाइलर्स यदि कुछ एनम मानों को संभाला न जाए तो चेतावनी जारी कर सकते हैं।

इसके अतिरिक्त, एक अनुकूलित कार्यान्वयन विकल्प की तुलना में बहुत तेजी से निष्पादित हो सकता है, क्योंकि इसे प्रायः अनुक्रमित ब्रांच तालिका का उपयोग करके कार्यान्वित किया जाता है। उदाहरण के लिए, एकल वर्ण के मान के आधार पर प्रोग्राम प्रवाह तय करना, यदि सही ढंग से लागू किया जाता है, तो विकल्प की तुलना में काफी अधिक कुशल है, जिससे निर्देश पथ की लंबाई काफी कम हो जाती है। जब इसे इस प्रकार लागू किया जाता है, तो एक स्विच स्टेटमेंट अनिवार्य रूप से एक आदर्श हैश बन जाता है।

कण्ट्रोल-प्रवाह ग्राफ के संदर्भ में, एक स्विच स्टेटमेंट में दो नोड्स (प्रवेश और निकास) होते हैं, साथ ही प्रत्येक विकल्प के लिए उनके बीच एक किनारा होता है। इसके विपरीत, "if...else if...else if" स्टेटमेंट्स के अनुक्रम में पहले और अंतिम के अलावा प्रत्येक स्थिति के लिए एक अतिरिक्त नोड होता है, साथ में संगत किनारा भी होता है। इस प्रकार "if" के अनुक्रमों के लिए परिणामी कण्ट्रोल-प्रवाह ग्राफ़ में कई अधिक नोड्स और लगभग दोगुने किनारे होते हैं, इनमें कोई उपयोगी जानकारी नहीं जोड़ी जाती है। हालाँकि, if स्टेटमेंट्स में सरल ब्रांचएँ स्विच स्टेटमेंट की जटिल ब्रांच की तुलना में व्यक्तिगत रूप से वैचारिक रूप से आसान होती हैं। चक्रीय जटिलता के संदर्भ में, यदि k स्थिति दिए जाएं तो ये दोनों विकल्प इसे k-1 तक बढ़ा देते हैं।

एक्सप्रेशन स्विच करें
स्विच एक्सप्रेशन Java एसई 12, 19 मार्च 2019 में एक पूर्वावलोकन सुविधा के रूप में प्रस्तुत किए गए हैं। यहां मान वापस करने के लिए संपूर्ण स्विच एक्सप्रेशन का उपयोग किया जा सकता है। केस लेबल का एक नया रूप भी है, case L-> जहां दाईं ओर एक एकल एक्सप्रेशन है। हालाँकि, यह फॉलथ्रू को भी रोकता है और इसके लिए आवश्यक है कि स्थिति विस्तृत हों। Java एसई 13 में  स्टेटमेंट प्रस्तुत किया गया है, और Java एसई 14 में स्विच एक्सप्रेशन एक मानक language सुविधा बन जाता है।   उदाहरण के लिए:

वैकल्पिक उपयोग
कई languages रनटाइम के दौरान  ब्लॉक के अंदर एक्सप्रेशनयों का मूल्यांकन करती हैं, जिससे निर्माण के लिए कई कम स्पष्ट उपयोग की अनुमति मिलती है। यह कुछ कंपाइलर अनुकूलन को प्रतिबंधित करता है, इसलिए यह गतिशील और स्क्रिप्टिंग languages में अधिक साधारण है जहां बढ़ा हुआ लचीलापन प्रदर्शन ओवरहेड की तुलना में अधिक महत्वपूर्ण है।

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

पीएचपी
उदाहरण के लिए, पीएचपी में, एक कोन्स्टेंट को "वेरिएबल" के रूप में उपयोग किया जा सकता है जिसके खिलाफ जाँच की जाएगी, और जिस पहले केस स्टेटमेंट का मूल्यांकन उस कोन्स्टेंट के लिए होता है उसे निष्पादित किया जाएगा: यह सुविधा कई मानों के विरुद्ध एक चर की तुलना में एक मान के विरुद्ध अनेक चरों की जाँच करने के लिए भी उपयोगी है। COBOL  स्टेटमेंट में इस फॉर्म (और अन्य फॉर्म) का भी समर्थन करता है। पीएल/आई के पास   स्टेटमेंट का एक वैकल्पिक रूप है जहां कण्ट्रोल एक्सप्रेशन पूरी तरह से छोड़ दी जाती है और सत्य का मूल्यांकन करने वाला सर्वप्रथम   निष्पादित किया जाता है।

रूबी
रूबी में,   समानता से निपटने के कारण, स्टेटमेंट का उपयोग चर की कक्षा के परीक्षण के लिए किया जा सकता है:

रूबी एक मान भी लौटाती है जिसे एक वेरिएबल को सौंपा जा सकता है, और वास्तव में  को किसी भी पैरामीटर की आवश्यकता नहीं होती है (कुछ   की तरह कार्य करते हुए):

असेंबलर
असेंबली language में एक स्विच स्टेटमेंट:

पाइथन
पाइथन 3.10.6 के लिए, पीईपी 634-636 को स्वीकार किया गया, जिसमें match और case कीवर्ड जोड़े गए।   अन्य languages के विपरीत, पाइथन विशेष रूप से पतनशील व्यवहार प्रदर्शित नहीं करता है।

एक्सेप्शन हेंडलिंग
कई languages एक्सेप्शन हेंडलिंग में स्विच स्टेटमेंट के एक रूप को लागू करती हैं, जहाँ यदि किसी ब्लॉक में कोई एक्सेप्शन उठाया जाता है, तो एक्सेप्शन के आधार पर एक अलग ब्रांच चुनी जाती है। कुछ स्थितियों में, यदि कोई एक्सेप्शन नहीं उठाया गया है, तो एक डिफ़ॉल्ट ब्रांच भी विद्यमान है। एक प्रारंभिक उदाहरण मॉड्यूल-3 है, जो ... सिंटैक्स का उपयोग करता है, जहां प्रत्येक  एक स्थिति को परिभाषित करता है। यह डेल्फ़ी, स्कैला और विज़ुअल बेसिक .NET में भी पाया जाता है।

विकल्प
स्टेटमेंट्स को बदलने के कुछ विकल्प हो सकते हैं:


 * if-else सशर्त की एक श्रृंखला जो लक्ष्य की एक समय में मान की जांच करती है। फाल्थ्रू व्यवहार को else क्लॉज के बिना प्रत्येक सशर्त के अनुक्रम के साथ प्राप्त किया जा सकता है।
 * एक लुकअप टेबल, जिसमें कुंजियों के रूप में,  मान और, मान के रूप में,   स्टेटमेंट के अंतर्गत भाग सम्मिलित होता है।
 * (कुछ languages में, केवल वास्तविक डेटा प्रकारों को लुकअप तालिका में मान के रूप में अनुमति दी जाती है। अन्य languages में, वास्तविक  स्टेटमेंट के समान लचीलापन प्राप्त करते हुए, लुकअप तालिका मान के रूप में फ़ंक्शन निर्दिष्ट करना भी संभव है। अधिक के लिए कण्ट्रोल तालिका आलेख देखें इस पर विस्तार से)।

लुआ केस/स्विच स्टेटमेंट का समर्थन नहीं करता है। यह लुकअप तकनीक लुआ language में  स्टेटमेंट को लागू करने का एक तरीका है, जिसमें कोई अंतर्निहित  नहीं है।  कुछ स्थितियों में, लुकअप टेबल गैर-अनुकूलित   स्टेटमेंट की तुलना में अधिक कुशल होते हैं क्योंकि कई languages टेबल लुकअप को अनुकूलित कर सकती हैं, जबकि स्विच स्टेटमेंट को तब तक अनुकूलित नहीं किया जाता है जब तक कि मानों की सीमा कुछ अंतराल के साथ छोटी न हो। हालाँकि, एक गैर-अनुकूलित, गैर-बाइनरी खोज लुकअप लगभग निश्चित रूप से एक गैर-अनुकूलित स्विच या समकक्ष एकाधिक यदि-अन्यथा स्टेटमेंट्स की तुलना में धीमा होगा।
 * यदि आवश्यकता हो, तो एक कण्ट्रोल टेबल (जो एक साधारण लुकअप टेबल के रूप में कार्यान्वयन किया जा सकता है) भी एक से अधिक इनपुट पर एकाधिक स्थितियों को समायोजित करने के लिए अनुकूलित किया जा सकता है और सामन्यतः एक समान स्विच की तुलना में अधिक 'दृश्य संक्षेपता' दिखाता है (जो कई स्टेटमेंट को आवास कर सकता है)।
 * पैटर्न मिलान, जिसका उपयोग कई कार्यात्मक languages में स्विच-जैसी कार्यक्षमता को कार्यान्वित करने के लिए किया जाता है।

यह भी देखें

 * एल्गोरिथम दक्षता
 * ब्रांच टेबल
 * कण्ट्रोल टेबल
 * डफ की युक्ति
 * इंडेक्स मैपिंग

अग्रिम पठन

 * Stephen Kleene, 1952 (10th reprint 1991), Introduction to Metamathematics, North-Holland Publishing Company, Amsterdam NL, ISBN 0-7204-2103-9
 * George Boolos, John Burgess, and Richard Jeffrey, 2002, Computability and Logic: Fourth Edition, Cambridge University Press, Cambridge UK, ISBN 0-521-00758-5 paperback. cf page 74-75.

Оператор ветвления