LISP मशीन बनाने में कितने आदिम लगते हैं? दस, सात या पाँच?


80

इस साइट पर वे कहते हैं कि 10 एलआईएसपी आदिम हैं। आदिम हैं atom, quote, eq, car, cdr, cons, cond, lambda, label, apply:।

http://hyperpolyglot.wikidot.com/lisp#ten-primatics

स्टीवन ने कहा कि सात (या पांच) हैं:

एलआईएसपी के विचार की शुद्धता का इसका हिस्सा: आपको पूरी मशीन बनाने के लिए केवल सात (या यह पांच?) की आवश्यकता है। http://steve-yegge.blogspot.com/2006/04/lisp-is-not-acceptable-lisp.html

LISP मशीन बनाने के लिए प्राइमरी की न्यूनतम संख्या क्या है (यानी ऐसा कुछ जो LISP कोड पर एक eval / value फ़ंक्शन चला सकता है)? (और वे कौन से हैं?)

(मैं समझ सकता हूँ कि तुम बिना रह सकते हो atom, label and apply)

जवाबों:


58

बुनियादी विधेय / एफ-कार्य

मैकार्थी के प्राथमिक एस-कार्य और विधेय थे:

  1. atom

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

  2. eq

    परमाणुओं के बीच समानता का परीक्षण करने के लिए।

  3. car

    बुरा सेल का पहला आधा (पता) लौटाने के लिए। (पता रजिस्टर की सामग्री)।

  4. cdr

    दूसरी को वापस करने के लिए (डी) सेल की डेस सेल। (वेतन वृद्धि रजिस्टर की सामग्री)।

  5. cons

    एक नया वाणिज्य प्रकोष्ठ बनाने के लिए, जिसमें पता आधा तर्क के लिए पहले तर्क से युक्त है, और दूसरे तर्क वाले अंक में आधा है।

इसे एक साथ बांधना: एस-फ़ंक्शंस

फिर उन्होंने अपनी मूल धारणा को जोड़ने के लिए, यह लिखने के लिए कि उन्होंने एस-फ़ंक्शंस को क्या कहा:

  1. quote

    इसका मूल्यांकन किए बिना किसी अभिव्यक्ति का प्रतिनिधित्व करना।

  2. cond

    पहले वर्णित विधेय के साथ उपयोग किए जाने वाले मूल सशर्त।

  3. lambda

    किसी फ़ंक्शन को निरूपित करने के लिए।

  4. label

    हालाँकि उन्हें पुनरावृत्ति के लिए इसकी आवश्यकता नहीं थी, फिर भी उन्हें वाई-कॉम्बिनेटर ( पॉल ग्राहम के अनुसार ) के बारे में पता नहीं था , उन्होंने इसे सुविधा के लिए और आसान पुनरावर्तन को सक्षम करने के लिए जोड़ा।


तो आप देख सकते हैं कि उन्होंने अपनी लिस्प मशीन के लिए वास्तव में 9 बुनियादी "ऑपरेटरों" को परिभाषित किया है। आपके एक अन्य प्रश्न के पिछले उत्तर में, मैंने समझाया कि आप इस प्रणाली के साथ संख्याओं का प्रतिनिधित्व और संचालन कैसे कर सकते हैं ।

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

atomयदि आप carऑपरेशन को परिभाषित करने के लिए परमाणुओं को वापस करने के लिए छोड़ दिया जा सकता हैNIL

आप अनिवार्य रूप से इन 9 परिभाषित प्राइमरी में से 7 के साथ मैकार्थी की एलआईएसपी मशीन हो सकते हैं, लेकिन आप अपने आप को कितना असुविधा उठाना चाहते हैं, इस पर निर्भर करते हुए आप अधिक संक्षिप्त रूप से परिभाषित कर सकते हैं। मुझे उनकी मशीन काफी पसंद है, या नई भाषाओं में कई प्राइमिटिव जैसे क्लोजर।


19
मैक्कार्थी को Y- कॉम्बीनेटर के बारे में जो सुझाव नहीं पता था वह त्रुटि में प्रतीत होता है। "रिकर्सिव फंक्शंस ..." के पेज 7 पर, मैककार्थी लिखते हैं: इसमें एक संलिप्तता है जो संचालकों को शामिल करता है जिन्हें चर के उपयोग के बिना कार्यों के संयोजन के लिए कॉम्बिनेटर कहा जाता है। दुर्भाग्य से, कार्यों के दिलचस्प संयोजन के लिए संयोजी अभिव्यक्तियां लंबी और अपठनीय हैं।
लूजर ने 17

1
यहाँ कुछ याद आ रहा है। ऐसा लिस्प दो नंबर नहीं जोड़ सकता है या यह भी समझ सकता है कि 12 एक संख्या है।
अल्बर्ट वैन डेर होर्स्ट

1
यह वास्तव में हो सकता है! मैंने इस पर एक ब्लॉग पोस्ट भी लिखी है। blog.isaachodes.io/p/set-theory-and-lisp
आइज़ैक

1
यह सुनिश्चित करने के लिए, यह पूर्णांक के पारंपरिक मशीन प्रतिनिधित्व का उपयोग नहीं करेगा, और परिणामस्वरूप परिणामस्वरूप अक्षम होगा।
इसहाक

14

यह सुनिश्चित करने के लिए वास्तव में सबसे अच्छा तरीका है कि क्या आप इसे लागू करते हैं। Zozotez बनाने के लिए मैंने 3 गर्मियों का उपयोग किया जो कि ब्रेनफक पर चलने वाला मैकार्थी -ईश LISP है

मैंने यह पता लगाने की कोशिश की कि मुझे क्या चाहिए और एक मंच पर आपको एक धागा मिलेगा जो कहता है कि आपको केवल लैम्ब्डा की आवश्यकता है। इस प्रकार, आप लैम्बडा कैलकुलस में एक पूरी LISP बना सकते हैं, जो मैं चाहूंगा। मुझे यह दिलचस्प लगा, लेकिन यह शायद ही कोई रास्ता है अगर आप ऐसा कुछ चाहते हैं जो अंततः दुष्प्रभाव और वास्तविक दुनिया में काम करता है।

ट्यूरिंग पूर्ण एलआईएसपी के लिए मैंने मैक्कार्थी के पेपर के पॉल ग्रेहम्स स्पष्टीकरण का उपयोग किया और आपको वास्तव में इसकी आवश्यकता है:

  • प्रतीक-मूल्यांकन
  • विशेष प्रपत्र उद्धरण
  • विशेष रूप यदि (या कोंड)
  • विशेष रूप लैम्ब्डा (उद्धरण के समान)
  • समारोह eq
  • समारोह परमाणु
  • समारोह विपक्ष
  • फंक्शन कार
  • समारोह cdr
  • समारोह-प्रेषण (सूची-लंबा)

Thats 10. इसके अलावा, एक कार्यान्वयन है जिसे आप परीक्षण कर सकते हैं और न केवल एक ड्राइंग बोर्ड पर:

  • समारोह पढ़ा
  • फ़ंक्शन लिखें

Thats 12. मेरे Zozotez में मैंने सेट और फ्लैम्ब्डा (अनाम मैक्रो, जैसे लैम्ब्डा) को भी लागू किया। मैं इसे फ़ाइल I / O के अपवाद के साथ किसी भी गतिशील बाध्य लिस्प (Elisp, picoLisp) को लागू करने वाला पुस्तकालय खिला सकता हूं (क्योंकि अंतर्निहित BF स्टड / स्टडआउट के अलावा इसका समर्थन नहीं करता है)।

मैं LISP1-दुभाषिया को LISP और (LISP दोनों में) लागू करने के लिए किसी को भी पूरी तरह से समझने की सलाह देता हूं कि किसी भाषा को कैसे लागू किया जाता है। LISP में एक बहुत ही सरल वाक्यविन्यास है इसलिए यह एक पार्सर के लिए एक अच्छा प्रारंभिक बिंदु है। मैं वर्तमान में एक योजना संकलक पर काम कर रहा हूं जो विभिन्न लक्ष्यों के साथ योजना में लिखा गया है (जैसे स्टालिन लक्ष्य सी के लिए है), उम्मीद है कि बीएफ उनमें से एक है।


3
लैंबडा और कुछ नहीं, लैंबडा के उपयोग के बारे में, "वन इंस्ट्रक्शन सेट कंप्यूटर", "नंद लॉजिक", "SKI कॉम्बीनेटर कैलकुलस", ... :-)
ajm475du

2
@ ajm475du उन सभी को "आपको केवल लंबोदर की आवश्यकता है" के समान है। यह I / O की कमी के कारण पूर्ण लेकिन लगभग उपयोग करना असंभव है। बीएफ को केवल 6 निर्देशों की आवश्यकता है जो पूर्ण रूप से ट्यूरिंग हो। बाकी अगर यह व्यावहारिक बनाने के लिए।
सिल्वेस्टर

1
हम्म। यदि आप bf दुभाषिया के stdin / stdout को किसी अन्य प्रोग्राम से जोड़ते हैं जो फ़ाइल / io कमांड की व्याख्या कर सकता है? तब bf-lisp अनुरोध लिख सकता है और फिर अनुरोधित फ़ाइल से पढ़ सकता है।
लूसर ड्रग

2
@luserdroog आप जो सुझाव दे रहे हैं वह सिस्टम कॉल को लागू करने के लिए कुछ प्रोग्राम / OS के लिए एक संदेश बस के रूप में stdin / stdout का उपयोग कर रहा है। मैं वास्तव में अपने कंपाइलर के लिए वह करने की सोच रहा हूं जो बीएफ को संकलित करेगा। उदाहरण के लिए। यदि आप पढ़ने / लिखने की तुलना में अधिक I / O का उपयोग करते हैं, तो प्रोग्राम एक जादू की आवश्यकता-स्ट्रिंग भेजता है और तेह एपीआई 90% में डॉस बैक में विंडोज़ प्रोग्राम चलाने के दौरान त्रुटियों को ठीक उसी तरह से देगा जिस तरह से आपको त्रुटियां मिलीं। ध्यान दें कि बीएफ को अभी भी टर्मिनल प्रदान करने की आवश्यकता है, इस प्रकार I / O के साथ शुरू करने के लिए यह अभी और विस्तार है।
सिल्वेस्टर

10

मैकार्थी सात ऑपरेटरों का उपयोग किया मूल लिस्प परिभाषित करने के लिए: quote, atom, eq, car, cdr, consऔर condयह लेख उनके कदमों को पीछे हटाता है।


1
वह वास्तव में भी इस्तेमाल किया label, हालांकि यह आवश्यक नहीं था।
आइजैक

2
और उसे जरूरत lambdaभी थी।
आइजैक

9
मैं इस बारे में पहले भी उलझन में था, लेकिन वह वास्तव में परिभाषित है lambdaऔर labelदिए गए सात आदिम के संदर्भ में है। वह केवल evalधारा 4 की परिभाषा में अपना कार्यान्वयन देने से पहले वह जो कुछ भी करने का इरादा रखता है उसका परिचय देता है । आप देख सकते हैं कि कार्यान्वयन या तो बिना किसी आधार के / के evalलिए समर्थन प्रदान करता है। lambdalist
अमलियॉ

8

यह दोष बताता है:

आदिमों का कोई एकल "सर्वश्रेष्ठ" न्यूनतम सेट नहीं है; यह सब कार्यान्वयन पर निर्भर करता है। उदाहरण के लिए, यहां तक ​​कि संख्या के रूप में बुनियादी कुछ भी आदिम होने की आवश्यकता नहीं है, और सूचियों के रूप में प्रतिनिधित्व किया जा सकता है। प्राइमेटिव के एक संभावित सेट में एस-एक्सप्रेशंस / आउटपुट के लिए एस-एक्सप्रेशन और आउटपुट के लिए एस-एक्सप्रेशंस और एपीपीएलवाई और ईवीएएल के इंटरप्रेटर के लिए कार, सीडीआर, और कॉन्स के हेरफेर शामिल हो सकते हैं। लेकिन फिर आप कार्यों के लिए LAMBDA, समानता के लिए EQ, सशर्त के लिए COND, असाइनमेंट के लिए SET और परिभाषाओं के लिए DEFUN जोड़ना चाह सकते हैं। बहुत काम आ सकता है।

यह स्कूल ऑफ कंप्यूटर साइंस, कार्नेगी मेलन वेबसाइट से आता है।


2

पॉल ग्राहम सात का उपयोग करते हुए निष्कासन करता है ।

LISP के लिए मैकार्थी के माइक्रो मैनुअल में उन्होंने दस का उपयोग करके इम्प्लिमेंट को लागू किया ।


2

आपको बस एक x86 MOVनिर्देश की आवश्यकता है

"M / o / Vfuscator (लघु 'o'," mobfuscator "की तरह लगता है)" mov "निर्देशों में कार्यक्रमों को संकलित करता है, और केवल" mov "निर्देश। अंकगणितीय, तुलना, कूदता है, फ़ंक्शन कॉल करता है, और बाकी सब कुछ एक प्रोग्राम की आवश्यकता है। सभी को mov संचालन के माध्यम से प्रदर्शन किया गया है, कोई स्व-संशोधित कोड नहीं है, कोई परिवहन-ट्रिगर गणना नहीं है, और गैर-चालित धोखाधड़ी का कोई अन्य रूप नहीं है। "

गंभीरता से, हालांकि, ये आदिम लिस्प मशीन को लागू नहीं करेंगे। मशीन को I / O, और कचरा संग्रह जैसी सुविधाओं की आवश्यकता होती है। एक समारोह बुला तंत्र का उल्लेख नहीं करने के लिए! ठीक है, आपके पास सात आदिम हैं जो फ़ंक्शन हैं। मशीन एक फ़ंक्शन को कैसे बुलाती है?

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

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

दूसरे शब्दों में, एक ही तरीका है कि सात निर्देश व्यावहारिक रूप से काम कर सकते हैं यदि वे एक बड़ी मशीन में होस्ट किए जाते हैं जो पर्यावरण प्रदान करता है।

यह भी ध्यान दें कि ग्राहम के सात प्राइमेटिक्स में संख्याओं के लिए कोई स्पष्ट समर्थन नहीं है, इसलिए आपको उन्हें फ़ंक्शन ("चर्च अंक" तकनीक) से बाहर करना होगा। कोई भी उत्पादन लिस्प कार्यान्वयन ऐसा पागल काम नहीं करता है।


1
इसे प्यार करना। मैं UTM के बारे में एक प्रश्न पूछूंगा, लेकिन मुझे लगता है कि आपने पहले ही इसे तोड़ दिया है। मैं एक प्रश्न के बारे में सोचने की कोशिश कर रहा हूँ जिसमें घर का काढ़ा 8-लेकिन कंप्यूटिंग, UTM और लिस्प शामिल है।
हॉकआई
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.