क्या सी वास्तव में ट्यूरिंग-पूर्ण है?


39

मैं किसी को यह समझाने की कोशिश कर रहा था कि सी ट्यूरिंग-पूर्ण है, और मुझे एहसास हुआ कि मैं वास्तव में नहीं जानता कि क्या यह वास्तव में, तकनीकी रूप से ट्यूरिंग-पूर्ण है। (सी के रूप में सार शब्दार्थ में, वास्तविक कार्यान्वयन में नहीं है।)

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

तो: C99 ट्यूरिंग-पूर्ण है?


3
C का "अमूर्त शब्दार्थ" क्या हैं? क्या वे कहीं भी परिभाषित हैं?
युवल फिल्मस

4
@YuvalFilmus - उदाहरण के लिए यहाँ देखें , जैसे C को मानक में परिभाषित किया गया है उदाहरण के लिए "यह कैसे gcc करता है" के विपरीत है।
TLW

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

2
सी (ट्यूरिंग मशीनों की तरह) अपनी संगणना के लिए आंतरिक कंप्यूटर मेमोरी का उपयोग करने तक सीमित नहीं है, इसलिए यह वास्तव में सी की ट्यूरिंग पूर्णता के खिलाफ एक वैध तर्क नहीं है
रीस्टोरियरपोस्ट

@reinierpost - यह कहना पसंद है कि एक टेलेटाइप sapient है। यह कह रहा है कि "सी + एक बाहरी टीएम-समतुल्य" ट्यूरिंग-पूर्ण है, न कि सी ट्यूरिंग-पूर्ण।
टीएलडब्ल्यू

जवाबों:


34

मुझे यकीन नहीं है, लेकिन मुझे लगता है कि इसका जवाब नहीं है, बल्कि सूक्ष्म कारणों से। मैंने कुछ साल पहले सैद्धांतिक कंप्यूटर विज्ञान पर पूछा था और मुझे इसका जवाब नहीं मिला कि मैं यहां क्या पेश करूंगा।

अधिकांश प्रोग्रामिंग भाषाओं में, आप एक ट्यूरिंग मशीन का अनुकरण कर सकते हैं:

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

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

यह C में काम नहीं करता है क्योंकि लिंक की गई सूची को हमेशा के लिए विकसित करना असंभव है: नोड्स की संख्या पर हमेशा कुछ सीमा होती है।

यह समझाने के लिए कि, मुझे सबसे पहले यह समझाने की आवश्यकता है कि सी कार्यान्वयन क्या है। C वास्तव में प्रोग्रामिंग भाषाओं का परिवार है। आईएसओ सी मानक (अधिक सटीक, इस मानक के विशेष संस्करण) परिभाषित करता है वाक्य रचना और शब्दों भाषाओं प्रोग्रामिंग के एक परिवार (औपचारिकता के स्तर है कि अंग्रेजी की अनुमति देता है के साथ)। C में बहुत अधिक अपरिभाषित व्यवहार और कार्यान्वयन-परिभाषित व्यवहार है। C का एक "कार्यान्वयन" सभी कार्यान्वयन-परिभाषित व्यवहार (कोड करने के लिए चीजों की सूची C99 के लिए परिशिष्ट J में है) को संहिताबद्ध करता है। C का प्रत्येक कार्यान्वयन एक अलग प्रोग्रामिंग भाषा है। ध्यान दें कि "कार्यान्वयन" शब्द का अर्थ थोड़ा अजीब है: इसका वास्तव में क्या मतलब है एक भाषा संस्करण है, एक ही भाषा संस्करण को लागू करने वाले कई अलग-अलग संकलक कार्यक्रम हो सकते हैं।

सी के दिए गए कार्यान्वयन में, एक बाइट में संभव मान हैं। सभी डेटा बाइट्स के एक सरणी के रूप में प्रतिनिधित्व कर सकते हैं: एक प्रकार में अधिकतम संभव मान हैं। यह संख्या C के विभिन्न कार्यान्वयनों में भिन्न है, लेकिन C के दिए गए कार्यान्वयन के लिए, यह एक स्थिर है। 2 CHAR_BIT × आकार (t)2CHAR_BITt2CHAR_BIT×sizeof(t)

विशेष रूप से, पॉइंटर्स केवल मानों पर ले सकते हैं। इसका मतलब यह है कि पता योग्य वस्तुओं की एक परिमित अधिकतम संख्या है।2CHAR_BIT×sizeof(void*)

के मान CHAR_BITऔर sizeof(void*)अवलोकन योग्य हैं, इसलिए यदि आप स्मृति से बाहर निकलते हैं, तो आप उन मापदंडों के लिए अपने प्रोग्राम को बड़े मानों के साथ चलाना फिर से शुरू नहीं कर सकते। आप एक अलग प्रोग्रामिंग भाषा - एक अलग सी कार्यान्वयन के तहत कार्यक्रम चला रहे होंगे।

यदि किसी भाषा में प्रोग्राम केवल एक सीमित संख्या में राज्य हो सकते हैं, तो प्रोग्रामिंग भाषा परिमित ऑटोमेटा से अधिक अभिव्यंजक नहीं है। सी के टुकड़ा है कि पता भंडारण के लिए प्रतिबंधित है केवल ज्यादा से ज्यादा की अनुमति देता है कार्यक्रम राज्यों में का सार वाक्य रचना पेड़ के आकार है कार्यक्रम (नियंत्रण प्रवाह की स्थिति का प्रतिनिधित्व करता है), इसलिए इस कार्यक्रम को कई राज्यों के साथ परिमित ऑटोमेटन द्वारा अनुकरण किया जा सकता है। यदि C अधिक अभिव्यंजक है, तो इसे अन्य विशेषताओं के उपयोग के माध्यम से होना चाहिए। nn×2CHAR_BIT×sizeof(void*)n

सी सीधे अधिकतम पुनरावृत्ति गहराई नहीं लगाता है। एक कार्यान्वयन में अधिकतम करने की अनुमति है, लेकिन यह भी एक नहीं होने की अनुमति है। लेकिन हम एक फ़ंक्शन कॉल और उसके माता-पिता के बीच कैसे संवाद करते हैं? यदि वे पते योग्य हैं, तो तर्क अच्छा नहीं है, क्योंकि यह अप्रत्यक्ष रूप से पुनरावृत्ति की गहराई को सीमित करेगा: यदि आपके पास कोई फ़ंक्शन है, int f(int x) { … f(…) …}तो xसक्रिय फ़्रेमों के सभी घटनाओं का fअपना पता है और इसलिए नेस्टेड कॉल की संख्या संख्या से बाध्य है के लिए संभावित पते की x

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

निर्बाध पुनरावृत्ति गहराई के साथ, और यह प्रतिबंध कि कोई फ़ंक्शन केवल अपने डायरेक्ट कॉलर ( registerतर्क) से डेटा प्राप्त कर सकता है और डेटा को उसके डायरेक्ट कॉलर (फ़ंक्शन रिटर्न वैल्यू) पर वापस ला सकता है, आपको नियतात्मक पुशडाउन ऑटोमेटा की शक्ति मिलती है ।

मुझे आगे जाने का रास्ता नहीं मिल रहा है।

(बेशक आप प्रोग्राम को टेप सामग्री को फ़ाइल इनपुट / आउटपुट फ़ंक्शन के माध्यम से बाह्य रूप से स्टोर कर सकते हैं। लेकिन तब आप यह नहीं पूछ रहे होंगे कि क्या सी ट्यूरिंग-पूर्ण है, लेकिन क्या सी प्लस एक अनंत भंडारण प्रणाली ट्यूरिंग-पूर्ण है, जो उत्तर एक उबाऊ "हाँ" है। आप एक ट्यूरिंग ऑरेकल होने के लिए भंडारण को परिभाषित कर सकते हैं - कॉल  fopen("oracle", "r+"), fwriteप्रारंभिक टेप सामग्री और freadअंतिम टेप सामग्री वापस।)


यह तुरंत स्पष्ट नहीं है कि पते का सेट परिमित क्यों होना चाहिए। मैंने आपके द्वारा लिंक किए गए प्रश्न के उत्तर में कुछ विचार लिखे: cstheory.stackexchange.com/a/37036/43393
एलेक्सी बी।

4
क्षमा करें, लेकिन उसी तर्क से, कोई ट्यूरिंग-पूर्ण प्रोग्रामिंग भाषा नहीं हैं। प्रत्येक भाषा का पता स्थान पर एक स्पष्ट या अंतर्निहित सीमा है। यदि आप अनंत स्मृति के साथ एक मशीन बनाते हैं, तो यादृच्छिक अभिगम बिंदु स्पष्ट रूप से अनंत लंबाई के भी होंगे। इसलिए, यदि ऐसी मशीन दिखाई देती है, तो उसे उच्च-स्तरीय भाषाओं के लिए एपीआई के साथ-साथ अनुक्रमिक मेमोरी एक्सेस के लिए एक निर्देश सेट की पेशकश करनी होगी।
आईएमआईएल

14
@ यह सच नहीं है। कुछ प्रोग्रामिंग भाषाओं में एड्रेस स्पेस पर कोई सीमा नहीं है, यहां तक ​​कि अंतर्निहित रूप से भी नहीं। एक स्पष्ट उदाहरण लेने के लिए, एक सार्वभौमिक ट्यूरिंग मशीन जहां टेप की प्रारंभिक स्थिति कार्यक्रम बनाती है, एक ट्यूरिंग-पूर्ण प्रोग्रामिंग भाषा है। कई प्रोग्रामिंग भाषाएं जो वास्तव में व्यवहार में उपयोग की जाती हैं, उनके पास एक ही संपत्ति है, उदाहरण के लिए लिस्प और एसएमएल। एक भाषा के लिए "रैंडम एक्सेस पॉइंटर" की अवधारणा नहीं है। (प्रतियोगिता।)
गिल्स एसओ-बुराई को रोकें '

11
@IMil (cont।) कार्यान्वयन आमतौर पर प्रदर्शन के लिए करते हैं, लेकिन हम जानते हैं कि किसी विशेष कंप्यूटर पर चलने वाला कार्यान्वयन ट्यूरिंग-पूर्ण नहीं है क्योंकि यह कंप्यूटर की मेमोरी के आकार से घिरा है। लेकिन इसका मतलब यह है कि कार्यान्वयन पूरी भाषा को लागू नहीं करता है, केवल एक सबसेट (स्मृति के एन बाइट्स में चल रहे कार्यक्रमों का)। आप प्रोग्राम को कंप्यूटर पर चला सकते हैं, और यदि यह मेमोरी से बाहर चला जाता है, तो इसे एक बड़े कंप्यूटर में स्थानांतरित करें, और इसी तरह हमेशा के लिए या जब तक कि रुक ​​न जाए। यह पूरी भाषा को लागू करने का एक मान्य तरीका होगा।
गिल्स एसओ- बुराई को रोकना '

6

va_copyचर के तर्क के लिए C99 के अलावा एपीआई हमें ट्यूरिंग-पूर्णता के लिए एक पिछला दरवाजा दे सकता है। चूँकि यह एक वैरिएबल तर्कों की सूची के माध्यम से पुनरावृति करना संभव हो जाता है, जो मूल रूप से तर्कों को प्राप्त करने के अलावा किसी फ़ंक्शन में एक से अधिक बार va_argsकिया जाता है , जिसका उपयोग पॉइंटरलेस पॉइंटर को लागू करने के लिए किया जा सकता है।

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

यहां मनमाना संक्रमण नियमों के साथ एक 2-स्टैक पुशडाउन ऑटोमेटन को लागू करने वाला एक डेमो है:

#include <stdarg.h>
typedef struct { va_list va; } wrapped_stack; // Struct wrapper needed if va_list is an array type.
#define NUM_SYMBOLS /* ... */
#define NUM_STATES /* ... */
typedef enum { NOP, POP1, POP2, PUSH1, PUSH2 } operation_type;
typedef struct { int next_state; operation_type optype; int opsymbol; } transition;
transition transition_table[NUM_STATES][NUM_SYMBOLS][NUM_SYMBOLS] = { /* ... */ };

void step(int state, va_list stack1, va_list stack2);
void push1(va_list stack2, int next_state, ...) {
    va_list stack1;
    va_start(stack1, next_state);
    step(next_state, stack1, stack2);
}
void push2(va_list stack1, int next_state, ...) {
    va_list stack2;
    va_start(stack2, next_state);
    step(next_state, stack1, stack2);
}
void step(int state, va_list stack1, va_list stack2) {
    va_list stack1_copy, stack2_copy;
    va_copy(stack1_copy, stack1); va_copy(stack2_copy, stack2);
    int symbol1 = va_arg(stack1_copy, int), symbol2 = va_arg(stack2_copy, int);
    transition tr = transition_table[state][symbol1][symbol2];
    wrapped_stack ws;
    switch(tr.optype) {
        case NOP: step(tr.next_state, stack1, stack2);
        // Note: attempting to pop the stack's bottom value results in undefined behavior.
        case POP1: ws = va_arg(stack1_copy, wrapped_stack); step(tr.next_state, ws.va, stack2);
        case POP2: ws = va_arg(stack2_copy, wrapped_stack); step(tr.next_state, stack1, ws.va);
        case PUSH1: va_copy(ws.va, stack1); push1(stack2, tr.next_state, tr.opsymbol, ws);
        case PUSH2: va_copy(ws.va, stack2); push2(stack1, tr.next_state, tr.opsymbol, ws);
    }
}
void start_helper1(va_list stack1, int dummy, ...) {
    va_list stack2;
    va_start(stack2, dummy);
    step(0, stack1, stack2);
}
void start_helper0(int dummy, ...) {
    va_list stack1;
    va_start(stack1, dummy);
    start_helper1(stack1, 0, 0);
}
// Begin execution in state 0 with each stack initialized to {0}
void start() {
    start_helper0(0, 0);
}

नोट: यदि va_listएक सरणी प्रकार है, तो वास्तव में कार्यों के लिए छिपे हुए सूचक पैरामीटर हैं। इसलिए सभी va_listतर्कों के प्रकारों को बदलना बेहतर होगा wrapped_stack


यह काम कर सकता है। एक संभावित चिंता यह है कि यह स्वचालित va_listचर के एक अनबाउंड संख्या को आवंटित करने पर निर्भर करता है stack। इन चरों का एक पता होना चाहिए &stack, और हम केवल इनकी एक सीमित संख्या रख सकते हैं। हर स्थानीय चर को घोषित करके इस आवश्यकता को दरकिनार किया जा सकता है register, शायद?
ची

@chi AIUI एक वेरिएबल के लिए एड्रेस लेने की जरूरत नहीं होती जब तक कि कोई एड्रेस लेने की कोशिश न करे। इसके अलावा, यह तर्क को तुरंत घोषित करने से पहले गैरकानूनी है कि अवैध है register
feersum

intजब तक कोई व्यक्ति बाउंड का उपयोग नहीं करता है , उसी तर्क से, एक बाउंड होना आवश्यक नहीं है sizeof(int)?
ची

@ साची बिल्कुल नहीं। मानक अमूर्त शब्दार्थ के भाग के रूप में परिभाषित होता है intजिसमें कुछ परिमित सीमा के बीच मान होता है INT_MINऔर INT_MAX। और अगर intउन बाध्यताओं का मूल्य अधिक हो जाता है , तो अपरिभाषित व्यवहार होता है। दूसरी ओर, मानक जानबूझकर यह आवश्यक नहीं है कि सभी वस्तुएं किसी विशेष पते पर स्मृति में भौतिक रूप से मौजूद हों, क्योंकि यह अनुकूलन को अनुमति देता है जैसे कि किसी रजिस्टर में ऑब्जेक्ट को स्टोर करना, ऑब्जेक्ट के केवल भाग को संग्रहीत करना, इसे मानक से अलग तरीके से प्रतिनिधित्व करना। लेआउट, या इसे पूरी तरह से छोड़ देना अगर इसकी आवश्यकता नहीं है।
feersum

4

गैरमानक अंकगणित, हो सकता है?

इसलिए, ऐसा लगता है कि इस मुद्दे का परिमित आकार है sizeof(t)। हालांकि, मुझे लगता है कि मैं एक काम के बारे में जानता हूं।

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

यह निश्चित रूप से एक तकनीकी है: टेनेनबाम की प्रमेय । यह बताता है कि पीनो अंकगणित का एकमात्र मॉडल मानक एक है, जो स्पष्ट रूप से नहीं करेगा। हालाँकि, जहाँ तक मुझे पता है, C को Peano axioms को संतुष्ट करने वाले डेटा प्रकारों का उपयोग करने के लिए कार्यान्वयन की आवश्यकता नहीं है, और न ही इसके कार्यान्वयन के लिए गणना की आवश्यकता है, इसलिए यह एक मुद्दा नहीं होना चाहिए।

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


कार्यान्वयन कैसा दिखेगा?
रीइन्टीरियरपोस्ट

@reinierpost मैं अनुमान लगा रहा हूँ कि यह PA के कुछ गणनीय गैर-मानक मॉडल का उपयोग करके डेटा का प्रतिनिधित्व करेगा। यह पीए डिग्री का उपयोग करके अंकगणितीय संचालन की गणना करेगा । मुझे लगता है कि ऐसे किसी भी मॉडल को एक वैध सी कार्यान्वयन प्रदान करना चाहिए।
प्यरुलेज़

क्षमा करें, यह काम नहीं करता है। sizeof(t)अपने आप में एक प्रकार का मान है size_t, इसलिए यह 0 और के बीच का प्राकृतिक पूर्णांक है SIZE_MAX
गिल्स एसओ- बुराई को रोकना '28

@ गिल्स SIZE_MAX तब भी एक अमानवीय प्राकृतिक होगा।
PyRulez

यह एक दिलचस्प दृष्टिकोण है। ध्यान दें कि आपको भी आवश्यकता होगी जैसे कि intptr_t / uintptr_t / ptrdiff_t / intmax_t / uintmax_t जो कि अमानक हो। C ++ में यह आगे की प्रगति की गारंटी के पीछे चलेगा ... सी। के बारे में निश्चित नहीं है
TLW

0

IMO, एक मजबूत सीमा यह है कि पता योग्य स्थान (पॉइंटर आकार के माध्यम से) परिमित है, और यह अप्राप्य है।

कोई इस बात की वकालत कर सकता है कि मेमोरी को "डिस्क पर स्वैप" किया जा सकता है, लेकिन कुछ बिंदु पर पते की जानकारी खुद ही पता योग्य आकार से अधिक हो जाएगी।


क्या यह स्वीकृत उत्तर का मुख्य बिंदु नहीं है? मुझे नहीं लगता कि यह 2016 के प्रश्न के उत्तर में कुछ नया जोड़ता है।
चि

@chi: नहीं, स्वीकार किए गए उत्तर में बाहरी मेमोरी को स्वैप करने का उल्लेख नहीं किया गया है, जिसे माना जा सकता है कि यह वर्कअराउंड है।
यवेस डाएव

-1

व्यवहार में, ये प्रतिबंध ट्यूरिंग पूर्णता के लिए अप्रासंगिक हैं। वास्तविक आवश्यकता टेप को लंबे समय तक मनमाना करने की अनुमति है, न कि अनंत। यह एक अलग तरह की रुकने की समस्या पैदा करेगा (कैसे ब्रह्मांड "गणना" टेप करता है?)

यह कहना उतना ही संगीन है जितना कि "पायथन ट्यूरिंग पूरा नहीं है क्योंकि आप सूची को बड़े पैमाने पर नहीं बना सकते हैं"।

[संपादित करें: संपादित करने के तरीके को स्पष्ट करने के लिए मिस्टर व्हाइटलेज का धन्यवाद।]


7
मुझे नहीं लगता कि यह क्सेटिटॉन का जवाब देता है। प्रश्न पहले से ही इस उत्तर का अनुमान लगाता है, और बताया गया है कि यह मान्य क्यों नहीं है: "हालांकि सी मानक आकार_ के लिए अनुमति देता है मनमाने ढंग से बड़े होने के लिए, इसे कुछ लंबाई पर तय किया जाना चाहिए, और कोई भी बात नहीं है कि यह अभी भी तय है। "। क्या आपके पास उस तर्क पर कोई प्रतिक्रिया है? मुझे नहीं लगता कि हम इस सवाल का जवाब तब तक दे सकते हैं जब तक कि उत्तर यह न समझा दे कि तर्क गलत (या सही) क्यों है।
DW

5
किसी भी समय, प्रकार size_tका मान परिमित होता है। समस्या यह है कि आप size_tगणना के लिए एक बाउंड को स्थापित नहीं कर सकते हैं : यह किसी भी बाउंड के लिए मान्य है, कोई प्रोग्राम इसे ओवरफ्लो कर सकता है। लेकिन सी भाषा में कहा गया है कि इसके लिए एक बाउंड मौजूद है size_t: किसी दिए गए कार्यान्वयन पर, यह केवल sizeof(size_t)बाइट्स तक बढ़ सकता है । इसके अलावा, अच्छा हो । यह कहना कि आपकी आलोचना करने वाले लोग "अपने दम पर सोच नहीं सकते" असभ्य हैं।
गिल्स एसओ- बुराई को रोकना '

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

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

1
यह एक और सही उत्तर है जो इस समुदाय के अधिकांश व्यक्तियों की अक्षमता के कारण शायद ही दिखाई दे। इस बीच, स्वीकृत उत्तर गलत है और इसके टिप्पणी अनुभाग को महत्वपूर्ण टिप्पणियों को हटाने वाले मध्यस्थों द्वारा संरक्षित किया गया है। अलविदा, cs.stackexchange।
शाम ०१:३१ पर xamid

-1

हटाने योग्य मीडिया हमें अनबाउंड मेमोरी समस्या को दरकिनार करने की अनुमति देता है। शायद लोग सोचेंगे कि यह एक गाली है, लेकिन मुझे लगता है कि यह ठीक है और अनिवार्य रूप से वैसे भी अपरिहार्य है।

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

यहाँ मुख्य बिंदु यह है कि C प्रोग्राम को जो कुछ भी करना चाहिए वह सब कुछ परिमित है। कंप्यूटर को केवल ऑटोमेटन को अनुकरण करने के लिए पर्याप्त मेमोरी की आवश्यकता होती है, और size_tकेवल उस मेमोरी को और डिस्क पर (वास्तव में छोटी) राशि को संबोधित करने की अनुमति देने के लिए पर्याप्त बड़ा होना चाहिए, जो कि किसी भी निश्चित परिमित आकार का हो सकता है। चूंकि उपयोगकर्ता को केवल अगला या पिछला डिस्क सम्मिलित करने के लिए प्रेरित किया जाता है, हमें "कृपया कृपया डिस्क नंबर 123456 डालें ..." कहने के लिए अनबाउंड बड़े पूर्णांक की आवश्यकता नहीं है।

मुझे लगता है कि प्रिंसिपल की आपत्ति उपयोगकर्ता के शामिल होने की संभावना है लेकिन यह किसी भी कार्यान्वयन में अपरिहार्य लगता है, क्योंकि अनबाउंड मेमोरी को लागू करने का कोई अन्य तरीका नहीं है।


3
मेरा तर्क है कि, जब तक कि सी परिभाषा को इस तरह के निर्बाध बाहरी भंडारण की आवश्यकता नहीं होती है, तब इसे ट्यूरिंग पूर्णता के प्रमाण के रूप में स्वीकार नहीं किया जा सकता है। (आईएसओ 9899 की आवश्यकता नहीं है, निश्चित रूप से, वास्तविक दुनिया इंजीनियरिंग के लिए लिखा जा रहा है।) मुझे क्या चिंता है, अगर हम इसे स्वीकार करते हैं, तो इसी तरह के तर्क से हम दावा कर सकते हैं कि डीएफए ट्यूरिंग पूर्ण हो रहे हैं, क्योंकि उनका उपयोग किया जा सकता है। एक टेप (बाहरी भंडारण) पर सिर चलाने के लिए।
ची

@ मैं यह नहीं देखता कि डीएफए का तर्क किस तरह का है। एक डीएफए की पूरी बात यह है कि यह केवल भंडारण तक पहुंच पढ़ी है। यदि आप इसे "एक टेप पर सिर चलाने" की अनुमति देते हैं, तो क्या यह वास्तव में ट्यूरिंग मशीन नहीं है?
डेविड रिचरबी

2
वास्तव में, मैं यहाँ थोड़ा सा नाइटिंग कर रहा हूँ। मुद्दा यह है: C पर "टेप" जोड़ने के लिए यह ठीक क्यों है, C को DFA का अनुकरण करने दें, और इस तथ्य का उपयोग करके दावा करें कि C पूर्ण रूप से ट्यूरिंग है, जब हम DFA के समान नहीं कर सकते हैं? यदि सी के पास अपने आप में अनबाउंड मेमोरी को लागू करने का कोई तरीका नहीं है, तो इसे ट्यूरिंग पूर्ण नहीं माना जाना चाहिए। (मैं अभी भी इसे "नैतिक रूप से" ट्यूरिंग कहूंगा, कम से कम, चूंकि सीमाएं इतनी बड़ी हैं कि व्यवहार में वे ज्यादातर मामलों में मायने नहीं रखते हैं) मुझे लगता है कि मामले को निश्चित रूप से निपटाने के लिए, किसी को कठोर औपचारिक कल्पना की आवश्यकता होगी सी (आईएसओ मानक पर्याप्त नहीं है)
ची

1
@chi यह ठीक है क्योंकि C में फ़ाइल I / O रूटीन शामिल है। DFAs नहीं।
डेविड रिचरबी

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

-2

size_tअसीम रूप से बड़ा होना चुनें

आप size_tअसीम रूप से बड़े होने का विकल्प चुन सकते हैं । स्वाभाविक रूप से, इस तरह के कार्यान्वयन को महसूस करना असंभव है। लेकिन यह कोई आश्चर्य की बात नहीं है, दुनिया की परिमित प्रकृति को देखते हुए हम इसमें रहते हैं।

व्यावहारिक निहितार्थ

लेकिन यहां तक ​​कि अगर इस तरह के कार्यान्वयन को महसूस करना संभव था, तो व्यावहारिक मुद्दे होंगे। निम्नलिखित सी कथन पर विचार करें:

printf("%zu\n",SIZE_MAX);

SIZE_MAXSIZE_MAXO(2size_t)size_tSIZE_MAXprintf

सौभाग्य से, हमारे सैद्धांतिक उद्देश्यों के लिए, मुझे उस विनिर्देश में कोई आवश्यकता नहीं मिली जो गारंटी देता है कि printfसभी इनपुट के लिए समाप्त हो जाएगा। इसलिए, जहां तक ​​मुझे जानकारी है, हम यहां सी विनिर्देश का उल्लंघन नहीं करते हैं।

कम्प्यूटेशनल पूर्णता पर

यह अभी भी साबित करना बाकी है कि हमारा सैद्धांतिक कार्यान्वयन ट्यूरिंग कम्प्लीट है । हम इसे "किसी एकल-टैपिंग ट्यूरिंग मशीन" को लागू करके दिखा सकते हैं।

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

  • किसी भी मशीन के लिए राज्यों की संख्या, प्रतीकों की संख्या और राज्य संक्रमण तालिका तय की जाती है। इसलिए हम संख्या के रूप में राज्यों और प्रतीकों का प्रतिनिधित्व कर सकते हैं, और 2-आयामी सरणी के रूप में राज्य संक्रमण तालिका।
  • टेप को एक लिंक की गई सूची के रूप में दर्शाया जा सकता है। हम या तो एक एकल डबल-लिंक्ड सूची, या दो एकल-लिंक्ड सूची (वर्तमान स्थिति से प्रत्येक दिशा के लिए एक) का उपयोग कर सकते हैं।

अब देखते हैं कि इस तरह के कार्यान्वयन को महसूस करने के लिए क्या आवश्यक है:

  • कुछ निश्चित, लेकिन मनमाने ढंग से बड़े, संख्याओं के समूह का प्रतिनिधित्व करने की क्षमता। किसी भी मनमानी संख्या का प्रतिनिधित्व करने के लिए, हम MAX_INTअनंत के रूप में अच्छी तरह से चुनते हैं । (वैकल्पिक रूप से, हम राज्यों और प्रतीकों का प्रतिनिधित्व करने के लिए अन्य वस्तुओं का उपयोग कर सकते हैं।)
  • हमारे टेप के लिए एक मनमाने ढंग से बड़ी लिंक की गई सूची बनाने की क्षमता। एक बार फिर, आकार पर कोई सीमित सीमा नहीं है। इसका मतलब है कि हम इस सूची का निर्माण नहीं कर सकते, क्योंकि हम हमेशा के लिए अपने टेप का निर्माण करने के लिए खर्च करेंगे। लेकिन, यदि हम डायनेमिक मेमोरी आवंटन का उपयोग करते हैं तो हम इस सूची का वृद्धिशील निर्माण कर सकते हैं। हम उपयोग कर सकते हैं malloc, लेकिन थोड़ा और भी विचार करना चाहिए:
    • सी विनिर्देश mallocविफल होने की अनुमति देता है, उदाहरण के लिए, उपलब्ध स्मृति समाप्त हो गई है। इसलिए हमारा कार्यान्वयन केवल सही मायने में सार्वभौमिक है यदि mallocकभी विफल न हो।
    • हालांकि, यदि हमारे कार्यान्वयन को मशीन पर अनंत स्मृति के साथ चलाया जाता है, तो mallocअसफल होने की कोई आवश्यकता नहीं है । सी मानक का उल्लंघन किए बिना, हमारे कार्यान्वयन की गारंटी mallocहोगी जो कभी भी विफल नहीं होगी।
  • संदर्भ बिंदुओं को देखने की क्षमता, सरणी तत्वों को देखने और लिंक किए गए सूची नोड के सदस्यों तक पहुंचने की क्षमता।

तो उपरोक्त सूची है जो हमारे काल्पनिक सी कार्यान्वयन में एक ट्यूरिंग मशीन को लागू करने के लिए आवश्यक है। इन सुविधाओं को समाप्त करना होगा। हालाँकि, किसी भी चीज़ को समाप्त करने की अनुमति नहीं दी जा सकती (जब तक कि मानक द्वारा आवश्यक न हो)। इसमें अंकगणित, IO आदि शामिल हैं।


6
printf("%zu\n",SIZE_MAX);ऐसे कार्यान्वयन पर क्या छपेगा?
रुस्लान

1
@Ruslan, इस तरह के एक कार्यान्वयन असंभव है, जैसे ट्यूरिंग मशीन को लागू करना असंभव है। लेकिन अगर ऐसा कार्यान्वयन संभव था, तो मुझे लगता है कि यह एक असीम बड़ी संख्या के कुछ दशमलव प्रतिनिधित्व को प्रिंट करेगा - संभवतः, दशमलव अंकों की एक अनंत धारा।
नाथन डेविस

2
@NathanDavis ट्यूरिंग मशीन को लागू करना संभव है। चाल यह है कि आपको एक अनंत टेप बनाने की आवश्यकता नहीं है - आप टेप के उपयोग किए गए हिस्से को आवश्यकतानुसार बढ़ाते हैं।
गिल्स का SO- बुराई पर रोक 'illes

2
@ गिल्स: इस परिमित ब्रह्मांड में जिसमें हम रह रहे हैं, ट्यूरिंग मशीन को लागू करना असंभव है।
gnasher729

1
@NathanDavis लेकिन अगर आप ऐसा करते हैं, तो आप बदल चुके हैं sizeof(size_t)(या CHAR_BITS)। आप नए राज्य से फिर से शुरू नहीं कर सकते हैं, आपको फिर से शुरू करना होगा, लेकिन कार्यक्रम का निष्पादन अब अलग हो सकता है कि उन स्थिरांक अलग
गाइल्स का SO- बुराई होना बंद हो '

-2

यहाँ मुख्य तर्क यह था कि size_t का आकार परिमित है, हालाँकि असीम रूप से बड़ा हो सकता है।

इसके लिए एक समाधान है, हालांकि मुझे यकीन नहीं है कि यह आईएसओ सी के साथ मेल खाता है।

मान लें कि आपके पास अनंत स्मृति वाली एक मशीन है। इस प्रकार आप सूचक आकार के लिए बाध्य नहीं हैं। आपके पास अभी भी आपका size_t प्रकार है। यदि आप मुझसे पूछते हैं कि sizeof (size_t) क्या है तो इसका उत्तर बस sizeof (size_t) होगा। यदि आप पूछें कि क्या यह 100 से अधिक है उदाहरण के लिए उत्तर हाँ है। यदि आप पूछते हैं कि आकार क्या है (size_t) / 2 जैसा कि आप अनुमान लगा सकते हैं कि उत्तर अभी भी sizeof (size_t) है। यदि आप इसे प्रिंट करना चाहते हैं तो हम कुछ आउटपुट पर सहमत हो सकते हैं। इन दोनों का अंतर NaN और इसी तरह हो सकता है।

सारांश यह है कि size_t के लिए शर्त को शिथिल करने से परिमित आकार पहले से मौजूद किसी भी कार्यक्रम को नहीं तोड़ पाएगा।

PS आवंटन स्मृति sizeof (size_t) अभी भी संभव है, आपको केवल गणनीय आकार की आवश्यकता है, तो मान लें कि आप सभी evens (या समान चाल) लेते हैं।


1
"इन दोनों का अंतर NaN हो सकता है"। नहीं, यह नहीं हो सकता। सी। में पूर्णांक प्रकार के NaN जैसी कोई चीज नहीं है
TLW

मानक के अनुसार, sizeofवापस लौटना होगा size_t। इसलिए आपको कुछ विशेष मूल्य चुनना होगा।
ड्रैकनिस

-4

हाँ यही है।

1. उद्धृत उत्तर

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

[...] उनका तर्क इस प्रकार है: मान लीजिए कि किसी दिए गए समाप्ति कार्यक्रम को लिखा गया है, जिसके निष्पादन के दौरान, कुछ मनमानी मात्रा में भंडारण की आवश्यकता हो सकती है। उस कार्यक्रम को बदलने के बिना, कंप्यूटर हार्डवेयर और उसके सी कंपाइलर के एक टुकड़े को लागू करने के लिए पोस्टीरियर संभव है जो इस गणना को समायोजित करने के लिए पर्याप्त भंडारण प्रदान करता है। इसके लिए चार की चौड़ाई (CHAR_BITS के माध्यम से) और / या पॉइंटर्स (size_t के माध्यम से) को चौड़ा करने की आवश्यकता हो सकती है, लेकिन कार्यक्रम को संशोधित करने की आवश्यकता नहीं होगी। क्योंकि यह संभव है, सी वास्तव में ट्यूरिंग-पूर्ण है कार्यक्रमों को समाप्त करने के लिए।

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

इस कारण से मुझे अपने विचारों की ट्रेन में गुमराह किया गया था कि मैं "उपयोगी" गैर-समाप्ति कार्यक्रमों के व्यापक वर्ग पर विचार कर रहा था ...]

संक्षेप में, क्योंकि प्रत्येक कम्प्यूटेशनल फ़ंक्शन के लिए सी भाषा में एक समाधान है (असीमित ऊपरी सीमा के कारण), प्रत्येक कम्प्यूटेशनल समस्या का सी प्रोग्राम है, इस प्रकार सी ट्यूरिंग-पूर्ण है।

2. मेरा मूल उत्तर

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

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

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

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

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


4
मैं आपके अंतिम पैराग्राफ का पालन नहीं करता। आप दावा करते हैं कि प्रतिबंध जोड़ने से अभिव्यंजक शक्ति बढ़ती है, लेकिन यह स्पष्ट रूप से सच नहीं है। प्रतिबंध केवल अभिव्यंजक शक्ति को कम कर सकते हैं। उदाहरण के लिए, यदि आप C लेते हैं और यह प्रतिबंध जोड़ते हैं कि कोई भी प्रोग्राम 640kb से अधिक स्टोरेज (किसी भी प्रकार का) तक नहीं पहुंच सकता है, तो आपने इसे एक फैंसी परिमित ऑटोमेटन में बदल दिया है जो स्पष्ट रूप से ट्यूरिंग-पूर्ण नहीं है।
डेविड रिचरबी

3
यदि आपके पास निश्चित मात्रा में भंडारण है, तो आप किसी भी चीज़ का अनुकरण नहीं कर सकते हैं जिसके लिए आपके पास अधिक संसाधनों की आवश्यकता है। केवल बहुत सारे कॉन्फ़िगरेशन हैं जो संभवतः आपकी मेमोरी में हो सकते हैं, जिसका अर्थ है कि केवल बहुत से चीजें हैं जो आप संभवतः कर सकते हैं।
डेविड रिचरबी

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

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

2
आप कहते हैं कि एक पॉइंटर की चौड़ाई को संशोधित करने से प्रोग्राम में बदलाव नहीं होगा, लेकिन प्रोग्राम पॉइंटर की चौड़ाई को पढ़ सकते हैं और वे उस मान के लिए जो चाहें कर सकते हैं। उसी के लिए CHAR_BITS
ड्रैकिनिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.