क्या वास्तव में एक 'उपयोगी' प्रोग्रामिंग भाषा का होना संभव है जो ट्यूरिंग पूर्ण नहीं है?


37

जहां यह स्वीकार किया जाता है कि किसी भी भाषा को पूर्ण होने के लिए ट्यूरिंग को पूरा करना पड़ता है, क्या वास्तव में 'उपयोगी' प्रोग्रामिंग भाषा का होना संभव है जो ट्यूरिंग पूर्ण नहीं है?

मुझे स्पष्ट करना चाहिए कि यह विशेष रूप से पारंपरिक अर्थों में 'प्रोग्रामिंग' भाषाओं के बारे में है, न कि मार्कअप या क्वेरी भाषाओं के बारे में।


3
@PhonicUK SQL पहली बार में पूरी नहीं हो रही थी
Ryathal

4
@ रायथल एसक्यूएल एक प्रोग्रामिंग भाषा नहीं है, यह एक क्वेरी भाषा है।
यानि

2
@PhonicUK टिप्पणी में आपका प्रश्न वास्तव में सार्थक है, पोस्ट किए गए प्रश्न को उसमें बदल दें या इसे बंद कर दिया जाए क्योंकि यह रचनात्मक नहीं है। वास्तव में उपयोगी गैर-ट्यूरिंग पूर्ण भाषाएं हैं, और मुझे उनका विवरण सुनने में रुचि होगी।
जिमी होफा

5
रेगेक्स पूरी तरह से ट्यूरिंग नहीं करता है फिर भी इसका व्यापक रूप से उपयोग किया जाता है
शाफ़्ट फ्रीक

3
@David Hammen वास्तविक कार्यान्वयन सीमित हैं, हाँ, हमारे भौतिक ब्रह्मांड की सीमाओं के कारण (यह केवल परिमित मेमोरी का निर्माण कर सकता है, केवल मशीन को खराबी से पहले सीमित समय के लिए चला सकता है)। लेकिन इसका मतलब यह नहीं है कि भाषा सीमित हैं। IOW की एक ट्यूरिंग पूरी भाषा की कल्पना को किसी प्रोग्राम पर ऐसी सीमाएं लागू करने की आवश्यकता नहीं है , जबकि एक गैर-टीसी भाषा की आवश्यकता होती है, उदाहरण के लिए, समाप्ति का प्रमाण।

जवाबों:


48

Coq , Agda , HOL और ACL2 बहुत उपयोगी और बेहद शक्तिशाली भाषाएं हैं, हालांकि वे ट्यूरिंग-पूर्ण नहीं हैं।

एक सामान्य विशेषता जो उन्हें गैर-ट्यूरिंग-पूर्ण प्रदान करती है, यह तथ्य है कि समाप्ति को साबित करना हमेशा संभव होता है। एक बहुत ही सरल सीमा पर्याप्त है: पुनरावर्ती कॉल केवल संरचनात्मक रूप से छोटे शब्दों पर अनुमत हैं। इसलिए जबकि ट्यूरिंग-पूर्ण भाषा के लिए दुभाषिया को लागू करना संभव नहीं है या यहां तक ​​कि स्वयं भाषा के लिए भी कई अन्य उपयोगी चीजें अभी भी संभव हैं, एक प्रमाणित सी कंपाइलर की तरह


2
उन भाषाओं से परिचित नहीं लोगों के लिए, क्या आप इस बारे में अधिक विस्तार से जा सकते हैं कि वे क्या याद कर रहे हैं जो उन्हें ट्यूरिंग पूरा नहीं करता है, और उन भाषाओं के साथ निर्मित चीजों के कुछ उदाहरण हैं?
PhonicUK

8
@PhonicUK: एक सी संकलक एक सी कार्यान्वयन नहीं है । यह एक उपकरण है जो एक भाषा में कोड (C) को दूसरे (आमतौर पर मशीन कोड) में बदल देता है। इसका मतलब यह नहीं है कि सी कंपाइलर स्वयं किसी भी यादृच्छिक सी प्रोग्राम के बराबर है।
जोआचिम सॉउर

9
@PhonicUK, आप ट्यूरिंग-पूर्ण भाषा के लिए एक गैर-ट्यूरिंग-पूर्ण में एक दुभाषिया लागू नहीं कर सकते। लेकिन आप एक संकलक को लागू कर सकते हैं, निश्चित रूप से (चूंकि ट्यूरिंग-पूर्ण सीपीयू एक वास्तविक मूल्यांकन करेगा)।
एसके-लॉजिक

11
@ एसके-तर्क: "निश्चित रूप से?" यह केवल C के लिए संभव है क्योंकि यह काफी सरल भाषा है। यह C ++ के लिए संभव नहीं है क्योंकि एक कंपाइलर को टेम्प्लेट कोड की व्याख्या करनी होती है (जो संकलन के समय ट्यूरिंग-पूर्ण है)।
15

11
@ ब्लॉकर्स हाँ, यदि भाषा पूरी तरह से ट्यूरिंग है, तो इसके लिए एक कंपाइलर को ट्यूरिंग पूरी भाषा में लिखा जाना चाहिए। जो थोड़े स्पष्ट भी है (तात्विक कहने के लिए नहीं)। हालाँकि, ध्यान दें कि C ++ मानक इनपुट प्रोग्राम्स पर सीमाएं लागू करता है, जैसे कि टेम्प्लेट इंस्टेंटिएशन के लिए अधिकतम मूल्यांकन गहराई (और मौजूदा कार्यान्वयन इस स्वतंत्रता को लेते हैं)। अगर मैं गलत नहीं हूँ तो इसका मतलब है कि एक गैर-ट्यूरिंग पूरा C ++ कंपाइलर संभव हो सकता है (असंबंधित मुद्दों को छोड़कर, निश्चित रूप से)।

12

मुझे लगता है कि येजेज का शब्द "मिनी-भाषा" इस तथ्य को संदर्भित करता है कि विशिष्ट समस्याओं के लिए भाषा का उपयोग करना अक्सर उपयोगी होता है जहां कार्य को पूरा करने के लिए भाषा को ट्यूरिंग-पूर्णता की आवश्यकता नहीं होती है, और यह गैर के दिल में जाता है -पूर्ण भाषाएं उपयोगी हो सकती हैं। https://sites.google.com/site/steveyegge2/language-grubbing

विकिपीडिया इसका बहुत अच्छी तरह से उत्तर देता है, ठीक उसी के अनुरूप जो मेरे कण्ठ ने कहा था। पहले मैं शुद्ध गणित सोच रहा था, फिर मुझे रेगेक्सप याद आया, और विकिपीडिया ने एपिग्राम को सूचीबद्ध किया जो मेरा मानना ​​है कि 'शुद्ध गणित' नस में होगा।

http://en.wikipedia.org/wiki/Turing_completeness#Non-Turing-complete_languages

गैर-ट्यूरिंग-पूर्ण भाषा

कई कम्प्यूटेशनल भाषाएं मौजूद हैं जो ट्यूरिंग पूरी नहीं हैं। ऐसा ही एक उदाहरण नियमित भाषाओं का सेट है, सबसे अधिक सामान्य अभिव्यक्ति, जो परिमित ऑटोमेटा द्वारा उत्पन्न होती है। परिमित ऑटोमेटा का एक अधिक शक्तिशाली लेकिन अभी भी ट्यूरिंग-पूर्ण विस्तार नहीं है, पुशडाउन ऑटोमेटा और संदर्भ-मुक्त व्याकरणों की श्रेणी है, जो आमतौर पर कार्यक्रम संकलन के प्रारंभिक चरण में पार्स पेड़ उत्पन्न करने के लिए उपयोग किया जाता है। आगे के उदाहरणों में Direct3D और OpenGL एक्सटेंशन में एम्बेडेड पिक्सेल shader भाषाओं के कुछ शुरुआती संस्करण, या स्प्रेडशीट में गणितीय फ़ार्मुलों की एक श्रृंखला शामिल है जिसमें कोई चक्र नहीं है। [उद्धरण वांछित] कुल कार्यात्मक प्रोग्रामिंग भाषाओं में, सभी फ़ंक्शन कुल हैं, और अवश्य ही होने चाहिए। चैरिटी और एपिग्राम जैसे टर्मिनेट। श्रेणी सिद्धांत के आधार पर चैरिटी एक प्रकार की प्रणाली और नियंत्रण निर्माण का उपयोग करता है,

डेटा भाषाएँ

ट्यूरिंग-पूर्णता की धारणा XML, JSON, YAML और S- अभिव्यक्तियों जैसी भाषाओं पर लागू नहीं होती है, क्योंकि वे आमतौर पर संरचित डेटा का प्रतिनिधित्व करने के लिए उपयोग की जाती हैं, गणना का वर्णन नहीं करती हैं। इन्हें कभी-कभी मार्कअप भाषाओं के रूप में संदर्भित किया जाता है, या "डेटा विवरण भाषाओं" के रूप में अधिक ठीक से।

यह भी उल्लेख करता है कि डेटा संरचना प्रतिनिधित्व भाषाएं नहीं हैं, लेकिन मुझे लगता है कि XSLT को गणना के प्रतिनिधित्व के रूप में गिना जाना चाहिए, XPath शायद इस बात पर आधारित नहीं है कि Yannis ने SQL भाषा के बारे में क्या कहा है और एक संगणना भाषा नहीं है। शायद टी-एसक्यूएल या पीएल / एसक्यूएल गणना भाषाओं के रूप में गिना जाता है, क्योंकि जब से आप अपने समुच्चय का उपयोग करते हुए गणना का एक बड़ा सौदा कर सकते हैं, जहां SQL का सामान्यीकृत रूप शायद समुच्चय को निर्दिष्ट नहीं करता है।


8

मैं समझता हूं कि SQL व्यावसायिक प्रकारों के बीच काफी लोकप्रिय है


3
एसक्यूएल एक क्वेरी लैंग्वेज है, न कि प्रोग्रामिंग लैंग्वेज।
PhonicUK

4
@PhonicUK: और वास्तव में एक क्वेरी भाषा और एक प्रोग्रामिंग भाषा के बीच अंतर क्या है?
जोआचिम सॉउर

8
@PhonicUK - टेक्स एक टेक्स्ट मार्कअप लैंग्वेज है और यह ट्यूरिंग पूरी है
मार्टिन बेकेट

3
आधुनिक एसक्यूएल कार्यान्वयन, जहां तक ​​मुझे पता है, पूरा हो रहा है।
शबून

6
@shabunc IIRC केवल संग्रहीत प्रक्रियाओं के साथ। तर्क थोड़ा गोलाकार हो जाता है, अगर यह ट्यूरिंग पूर्ण नहीं है, तो यह एक प्रोग्रामिंग भाषा नहीं है - इसलिए सभी "प्रोग्रामिंग" भाषाएं टीसी हैं
मार्टिन बेकेट

5

सामान्य प्रयोजन की भाषा के रूप में उपयोग करने के लिए एक भाषा के लिए ट्यूरिंग पूर्णता आवश्यक है । लेकिन यह पर्याप्त नहीं है , यानी सिर्फ इसलिए कि यह ट्यूरिंग पूर्ण है, यह हर समस्या डोमेन के लिए अनुकूल नहीं है:

  • व्हॉट्सएप पूरी तरह से ट्यूरिंग साबित होता है, लेकिन जाहिर तौर पर प्रोग्रामर मनोरंजन के बाहर किसी भी समस्या डोमेन के लिए अनुपयुक्त है।
  • C ++ टेम्प्लेट पूर्ण रूप से ट्यूरिंग साबित हुए हैं, फिर भी आप वास्तव में कभी भी उनके साथ पूरे कार्यक्रम नहीं लिखेंगे।

इसके विपरीत समस्या के लिए डिज़ाइन किया गया समस्या डोमेन के लिए एक DSL अनुकूल है, (यह मानते हुए कि यह वास्तव में डिज़ाइन किया गया था), यहां तक ​​कि पूर्णता के बिना:

  • HTML * DOM ट्री का वर्णन करने के लिए एक संक्षिप्त तरीका प्रदान करता है। जबकि जावास्क्रिप्ट ट्यूरिंग पूर्ण है और इसका उपयोग केवल वही करने के लिए किया जा सकता है, यह कहीं अधिक शोर और अस्पष्ट है
  • XPath और अन्य क्वेरी भाषाएँ, एम्बेडेड कोड के बिना PCRE और इस तरह वे जिस एक नौकरी के लिए डिज़ाइन किए गए थे, उसके लिए सभी शक्तिशाली उपकरण हैं

* IIRC यह साबित हुआ कि CSS एनिमेशन के साथ HTML कॉनवे के गेम ऑफ लाइफ को चेकबॉक्स में लागू करने के लिए उनका उपयोग करके पूरा कर रहा है। लेकिन HTML की उपयोगिता ब्राउज़रों में भी है जो CSS एनिमेशन का समर्थन नहीं करते हैं।


2
क्या आपके पास CSS में कार्यान्वित कॉनवे की लाइफ का लिंक है?
RBerteig

मैं CSS में CGOL कार्यान्वयन के बारे में नहीं जानता, लेकिन मुझे पता है कि नियम 110 को लागू किया गया था। यह खोजने के लिए प्रतीत नहीं कर सकते हैं, हालांकि, यह स्थानांतरित करने के लिए प्रतीत होता है।
ईसाई मान


-1 बहुत दिलचस्प है, लेकिन पूछे गए सवाल को संबोधित नहीं करता है
मटनज़

2
@ मट्टनज़: गलत। मैं गैर-ट्यूरिंग-पूर्ण भाषाओं का ठोस उदाहरण देता हूं, जो उपयोगी हैं, जो मुझे लगता है कि "क्या यह वास्तव में एक 'उपयोगी' प्रोग्रामिंग भाषा है जो ट्यूरिंग पूर्ण नहीं है?", एक अन्य उत्तर के
back2dos

3

वास्तव में प्रोग्रामिंग भाषाएं मौजूद हैं, जहां आप केवल "कुशल" प्रोग्राम लिख सकते हैं। इस अर्थ में कुशल का मतलब है कि इस तरह की भाषा में लिखा गया हर कार्यक्रम एक भाषा का प्रतिनिधित्व करता है P। बेलान्टोनी, निग्ल और स्कैवटेनबर्ग ने यहाँ इस तरह की भाषा का वर्णन किया है


1

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

इसके पीछे की चाल किसी भी ट्यूरिंग मशीन को परिमित भौतिक ब्रह्मांड में लागू करने के बारे में ऊपर दिए गए तर्कों के समान है: C प्रीप्रोसेसर भाषा को अनंत चरण या डेटा सेल प्रदान नहीं कर सकता , लेकिन यह कर सकता है:

  1. एक प्रदान अनुचित रूप से बड़ी गतिशील संख्या (2 ^ 64 या तो डिफ़ॉल्ट रूप से), सबसे यथार्थवादी समस्याओं एक घातीय विस्तार प्रक्रिया (का उपयोग कर हल करने के लिए बड़ा पर्याप्त बुदबुदाना बुदबुदाना ब्रह्मांड के जीवन बुदबुदाना )।

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

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


व्याख्यान के बीच में गूंगे के लिए अपवोट।
jpaugh

-1

हां, वास्तव में यह एक उपयोगी भाषा होना संभव है जो ट्यूरिंग पूर्ण नहीं है। यहां देखें: http://tkatchev.bitbucket.org/tab/examples.html

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

जैसे कि आप ऐसी भाषा क्यों चाहते हैं जो ट्यूरिंग पूर्ण न हो: क्योंकि इससे आप रनटाइम व्यवहार के बारे में कुछ मजबूत गारंटी दे सकते हैं।

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

संसाधन प्रबंधन की वास्तव में, वास्तव में कठिन समस्या से बचने के लिए एक शानदार तरीका है, प्रतिबंध लगाना।

नोटा बेने! अधूरा होना जरूरी नहीं है कि किसी भी कार्यक्रम को अनिवार्य रूप से समाप्त कर दिया जाएगा। ट्यूरिंग अधूरी भाषा एक अनंत आलसी सूची का मूल्यांकन करने की अनुमति दे सकती है।


-1

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

इसे "क्रेमा" कहा जाता है । यह खुद का वर्णन करता है:

क्रेमा एक एलएलवीएम फ्रंट-एंड है जिसका उद्देश्य विशेष रूप से उप-ट्यूरिंग पूर्ण स्थान पर निष्पादित करना है। सीखने के लिए सरल और आवश्यक प्रोग्रामिंग कार्यों के बहुमत के लिए व्यावहारिक बनाया गया, क्रेमा सुरक्षा में सुधार के लिए न्यूनतम आवश्यक कार्यक्रम की कम्प्यूटेशनल जटिलता को सीमित कर सकता है।

यह काफी न्यूनतर और बल्कि निम्न स्तर है।

यह सी डेवलपर्स के लिए परिचित की तरह दिखना चाहिए।

इसे शुरुआत में डिफेंस एडवांस्ड रिसर्च प्रोजेक्ट्स एजेंसी (DARPA) द्वारा वित्त पोषित किया गया था, लेकिन लेखन के समय यह काफी अचंभित था। लेकिन शायद किसी को दिलचस्पी है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.