यह ओआईएससी फोकर के एक्स-कॉम्बिनेटर पर आधारित है जिसे निम्नानुसार परिभाषित किया गया है:
एक्स= λ एफ । च ( λ जी ह x । जी एक्स ( ज x ) ) ( λ एक ख ग । एक )
अगर हम इस तथ्य को स्वीकार करते हैं कि SKI- पथरी ट्यूरिंग को पूरा कर रही है तो उपरोक्त -combinator ट्यूरिंग भी पूरा हो गया है। ऐसा इसलिए है क्योंकि S , K और I को X के संदर्भ में लिखा जा सकता है , जैसे:एक्सएसकश्मीरमैंएक्स
एसकश्मीरमैं= एस कश्मीर कश्मीर= एक्स ( एक्स) एक्स)= एक्स एक्स= एक्स ( एक्स) एक्स) ( एक्स एक्स) ( एक्स एक्स)
XOISC कैसे काम करता है
आंतरिक रूप से XOISC में एक (शुरू में खाली) स्टैक होता है, वहां से निर्देश n ले रहा हैn रूप में तर्क के रूप में निम्न कार्य करता है:
- स्टैक से पॉप एलिमेंट्स (फ़ंक्शंस f 1 … f N ), f 1 ( f 2 ( … ( f N X ) … ) ) पुश करेंnf1…fNf1 (f2 (…(fN X)…))
एक बार और निर्देश न मिलने पर XOISC सभी कमांड-लाइन तर्कों (यदि कोई हो) को ढेर कर देगा, उदाहरण के लिए:
[s1,…, sMstack before, a1,…, aNarguments]
अंतिम गणना हो जाएगा (…((…(s1 s2)…) sM) a1)…)aN ।
चूंकि XOISC में एक निर्देश केवल एक तर्क (मेमोरी ऑफ़सेट) लेता है, यहाँ तक कि उस निर्देश के लिए एक नाम का उपयोग करने का कोई कारण नहीं है। तो एक मान्य स्रोत फ़ाइल पूरी तरह से नए या व्हाट्सएप द्वारा अलग किए गए पूर्णांक का गठन करेगी, उदाहरण के लिए:
0 0 2 0 1 0 1
इसे ऑनलाइन आज़माएं!
उदाहरण
आइए उपरोक्त उदाहरण लें (दाईं ओर बढ़ता हुआ ढेर):
0020101pop 0 and apply (ie. push single X):again simply push X:pop 2 (a,b) and push a (b X):simply push X:पॉप 1 ( ए ) और एक एक्स धक्का :बस एक्स को धक्का दें :पॉप 1 ( ए ) और एक एक्स धक्का :[ एक्स][ एक्स, एक्स ][ एक्स ( एक्स) एक्स) ]][ एक्स ( एक्स) एक्स) , एक्स ][ एक्स ( एक्स) एक्स) , एक्स एक्स][ एक्स ( एक्स) एक्स) , एक्स एक्स, एक्स ][ एक्स ( एक्स) एक्स) , एक्स एक्स, एक्स एक्स]
अंत में स्टैक का मूल्यांकन करें: या कम कोष्ठक एक्स ( एक्स एक्स ) ( एक्स एक्स ) ( एक्स एक्स ) के साथ जिसे हम अच्छे पुराने एस के के पहचान के रूप में पहचानते हैं समारोह।( ( एक्स ( एक्स) एक्स)) ( एक्स एक्स)) ( एक्स एक्स)एक्स ( एक्स) एक्स) ( एक्स एक्स) ( एक्स एक्स)एस कश्मीर कश्मीर
ट्यूरिंग पूर्णता
प्रमाण विचार
XOISC ट्यूरिंग पूर्ण होने के लिए हमें कोष्ठक और X के किसी भी (वैध) इंटरलेविंग का अनुवाद करने में सक्षम होना चाहिएएक्स । यह संभव है क्योंकि जब पॉपिंग, आवेदन करना और इसे धकेलना एक सही-साहचर्य तरीके से होता है (फ़ंक्शन अनुप्रयोग बाएं-सहयोगी है)।
एक्स
( ( एक्स ( एक्स) एक्स) ) ( एक्स एक्स) ) ( एक्स एक्स)
- एक्स
0
- अगले हम कोष्ठकों के एक नए स्तर पर हैं, इसलिए हमें फिर से केवल एक की आवश्यकता है
0
- अब दो कोष्ठक बंद हो गए हैं, इसलिए हमें 2 तत्वों को पॉप करने की आवश्यकता है:
2
- फिर से हम नए स्तर के कोष्ठकों में हैं, इसलिए हमें इसकी आवश्यकता है
0
- दो कोष्ठक, करीब फिर से एक
2
- और फिर वही
तो हम एक अलग (अभी तक शब्दार्थ समतुल्य) XOISC- कार्यक्रम के साथ समाप्त होते हैं:
0 0 2 0 2 0 2
इसे ऑनलाइन आज़माएं!
यदि हम इस रणनीति के साथ बने रहें तो हम किसी भी अभिव्यक्ति को आसानी से बदल सकते हैं एक्स एक XOISC प्रोग्राम के लिए कॉम्बिनेटर जो केवल स्टैक पर एक फ़ंक्शन छोड़ता है।
औपचारिक प्रमाण
यह देखते हुए कि SKI-पथरी पूर्ण हो रही है, हमें दो चीजें दिखाने की जरूरत है:
- एक्स-कम्बिनेटर SKI-पथरी के लिए एक आधार है
- XOISC किसी भी अभिव्यक्ति का प्रतिनिधित्व करने में सक्षम है एक्स Combinator
पहला भाग - परिचय में तीन समानताएं साबित करना - बहुत थकाऊ और अंतरिक्ष की खपत है, यह भी बहुत दिलचस्प नहीं है। इसलिए इस पोस्ट में डालने के बजाय, आप यहाँ पा सकते हैं * ।
दूसरे भाग को संरचनात्मक प्रेरण द्वारा सिद्ध किया जा सकता है , हालांकि थोड़ा मजबूत कथन साबित करना आसान है: अर्थात्, किसी भी अभिव्यक्ति के लिएएक्स-कैमिनेटर एक ऐसा प्रोग्राम है जो स्टैक पर एकल एक्सप्रेशन के रूप में उस एक्सप्रेशन को छोड़ देगा:
इस तरह के निर्माण के दो तरीके हैं एक्स अभिव्यक्ति, या तो यह है एक्स खुद या च जी कुछ भावों के लिए च तथा जी:
पूर्व एक तुच्छ है जैसा 0
कि छोड़ देगाएक्सएक अभिव्यक्ति के रूप में ढेर पर। अब हम मानते हैं कि दो कार्यक्रम हैं (एफ1… एफएन तथा जी1… जीकश्मीर) जो छोड़ देगा च तथा जी स्टैक पर एक एकल अभिव्यक्ति के रूप में और साबित होता है कि कथन के लिए है च जी भी:
कार्यक्रम एफ1… एफएन जी1… जीकश्मीर- 1 ( जीकश्मीर+ 1 ) पहले उत्पन्न होगा च स्टैक पर और फिर यह उत्पन्न करेगा जी लेकिन इसके बजाय के केवल popping भागों जी यह भी पॉप जाएगा च और इसे लागू करें, जैसे कि यह एकल अभिव्यक्ति को छोड़ देता है च जीढेर पर। ∎
दुभाषिया
इनपुट
चूँकि अप्रकाशित लैम्ब्डा कैलकुलस की आवश्यकता होती है, इसलिए हम अपने डेटा प्रकारों को परिभाषित करना चाहते हैं जो हम चाहते हैं और यह दुविधा में है कि दुभाषिया चर्च के अंकों से अवगत है - इसका मतलब है कि जब आप इनपुट की आपूर्ति करेंगे तो यह स्वचालित रूप से संख्याओं को उनके संबंधित चर्च अंक में बदल देगा।
एक उदाहरण के रूप में यहां एक कार्यक्रम है जो दो संख्याओं को गुणा करता है: इसे ऑनलाइन आज़माएं!
आप डी ब्रूजन सूचकांकों का उपयोग करके तर्कों के रूप में भी कार्यों की आपूर्ति कर सकते हैं , उदाहरण के लिए S
कॉम्बिनेटर \\\(3 1 (2 1))
(या λλλ(3 1 (2 1))
)। हालांकि यह भी स्वीकार करता है S
, K
, I
और निश्चित रूप से X
Combinator।
उत्पादन
डिफ़ॉल्ट रूप से दुभाषिया जाँच करता है कि क्या आउटपुट एक पूर्णांक को एन्कोड करता है, यदि वह ऐसा करता है तो वह संबंधित संख्या (परिणाम के अतिरिक्त) को आउटपुट करेगा। सुविधा के लिए -b
झंडा है जो दुभाषिया को बूलियन के बजाय मिलान करने का प्रयास करने के लिए कहता है (अंतिम उदाहरण देखें)।
कोडांतरक
बेशक किसी भी निम्न-स्तरीय भाषा को एक कोडांतरक की आवश्यकता होती है जो इसे उच्च-स्तरीय भाषा में परिवर्तित करता है, आप बस किसी भी इनपुट का उपयोग कर सकते हैं (ऊपर देखें) और -a
झंडे का उपयोग करके XOISC- प्रोग्राम में अनुवाद करें , इसे ऑनलाइन आज़माएं! **
* यदि लिंक नीचे है, तो इस पोस्ट में HTML टिप्पणी के रूप में एक प्रति है।
** यह एक कार्यक्रम में परिणाम देता है जो कि मौलिकता के लिए परीक्षण करता है, इसे ऑनलाइन आज़माएं!