PROLOG ट्यूरिंग-पूर्ण क्या है?


15

मुझे पता है कि यह साबित किया जा सकता है PROLOG एक प्रोग्राम का निर्माण करके ट्यूरिंग-पूर्ण है जो इस तरह से ट्यूरिंग मशीन का अनुकरण करता है:

turing(Tape0, Tape) :-
    perform(q0, [], Ls, Tape0, Rs),
    reverse(Ls, Ls1),
    append(Ls1, Rs, Tape).

perform(qf, Ls, Ls, Rs, Rs) :- !.
perform(Q0, Ls0, Ls, Rs0, Rs) :-
    symbol(Rs0, Sym, RsRest),
    once(rule(Q0, Sym, Q1, NewSym, Action)),
    action(Action, Ls0, Ls1, [NewSym|RsRest], Rs1),
    perform(Q1, Ls1, Ls, Rs1, Rs).

symbol([], b, []).
symbol([Sym|Rs], Sym, Rs).

action(left, Ls0, Ls, Rs0, Rs) :- left(Ls0, Ls, Rs0, Rs).
action(stay, Ls, Ls, Rs, Rs).
action(right, Ls0, [Sym|Ls0], [Sym|Rs], Rs).

left([], [], Rs0, [b|Rs0]).
left([L|Ls], Ls, Rs, [L|Rs]).

स्रोत

हालाँकि, मैं सोच रहा हूँ कि PROLOG भाषा के कौन से हिस्से ट्यूरिंग पूर्णता को खोए बिना (esp। फंक्शन सिंबल, क्लॉज़ ओवरलोडिंग, रिकर्सन, यूनिफिकेशन) को छीन सकते हैं। क्या फ़ंक्शन प्रतीक स्वयं ट्यूरिंग पूर्ण हैं?


4
आपको केवल अपने कोड स्निपेट में प्रयुक्त प्रोलॉग की विशेषताओं की आवश्यकता है।
युवल फिल्मस

1
क्या आपने यह प्रश्न देखा है ?
राफेल

2
@YuvalFilmus: शायद PROLOG में ट्यूरिंग मशीन की प्रोग्रामिंग के अन्य तरीके हैं।
लेनार होयट

जवाबों:


18

यह अंगूठे का काफी विश्वसनीय नियम है कि ट्यूरिंग-पूर्णता अप्रतिबंधित "आकार" के उत्तर या मध्यवर्ती मूल्यों के निर्माण की क्षमता पर निर्भर करती है और एक अप्रतिबंधित संख्या को लूप या पुन: प्राप्त करने की क्षमता। यदि आपके पास वे दो चीजें हैं, तो आपके पास संभवतः ट्यूरिंग-पूर्णता है। (अधिक विशेष रूप से, यदि आप पीनो अंकगणित का निर्माण कर सकते हैं, तो आपके पास निश्चित रूप से ट्यूरिंग-पूर्णता है!)

चलो उस क्षण के लिए मान लें कि आपने पहले से ही अंकगणित छीन लिया है। हम यह भी मान लेंगे कि आप की तरह किसी भी गैर तार्किक सुविधाओं की जरूरत नहीं है atom_chars, assert, और इतने पर है, जो सामान्य धोखाधड़ी सक्षम करें।

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

इसी तरह, यदि आपने प्रोलॉग को केवल आदिम पुनरावृत्ति तक सीमित कर दिया है (जिसमें पतित मामले के रूप में कोई पुनरावृत्ति शामिल नहीं है), तो आप जो पुनरावृत्ति कर सकते हैं, वह क्वेरी के आकार से बंधी है, इसलिए सभी गणना समाप्त हो जाती हैं। तो आपको ट्यूरिंग-पूर्णता के लिए सामान्य पुनरावृत्ति की आवश्यकता है।

और, ज़ाहिर है, अगर आपके पास सामान्य पुनरावृत्ति है, तो आप सुविधाओं का एक पूरा गुच्छा काट सकते हैं और ट्यूरिंग-पूर्णता को बनाए रख सकते हैं, जिसमें सामान्य एकीकरण (निर्माण और शीर्ष-स्तरीय पैटर्न मिलान पर्याप्त है), नकार और कटौती शामिल है।



बहुत अच्छी बात है। मैं परिमाणीकरण के बारे में नहीं सोच रहा था, लेकिन यह वास्तव में एक और दृष्टिकोण है।
छद्म नाम

0

@Pseudonym द्वारा उत्कृष्ट उत्तर को पूरा करना और अपने अंतिम प्रश्न का संदर्भ देना "क्या फ़ंक्शन प्रतीक स्वयं ट्यूरिंग पूर्ण हैं?"।

आपका शायद मतलब है: क्या कोई भाषा केवल फ़ंक्शन प्रतीकों से बनी हो सकती है जो ट्यूरिंग-पूर्ण है?

इसका उत्तर हां है - एमएल और हास्केल जैसी कार्यात्मक प्रोग्रामिंग भाषाओं के बारे में सोचें।

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