प्रतिबिंब के साथ


23

मैं एक सरल पथरी की तलाश कर रहा हूं जो प्रतिबिंब के बारे में तर्क का समर्थन करता है , अर्थात्, चल रहे कार्यक्रमों का आत्मनिरीक्षण और हेरफेर।

वहाँ एक untyped है -calculus विस्तार है कि एक सक्षम बनाता है परिवर्तित करने के लिए एक रूप है कि वाक्य रचना हेरफेर किया जा सकता है और फिर बाद में मूल्यांकन किया जाता में -नियम?λλ

मुझे लगता है कि पथरी के दो मुख्य अतिरिक्त शब्द हैं:

  • reflect v : लेता और का प्रतिनिधित्व का उत्पादन वाक्यात्मक हेरफेर करने के लिए संशोधनीय।vv
  • eval v : किसी शब्द का वाक्य-विन्यास निरूपण करता है और उसका मूल्यांकन करता है।

परावर्तन का समर्थन करने के लिए, शब्दों के वाक्यविन्यास प्रतिनिधित्व की आवश्यकता होती है। यह कुछ इस तरह दिखेगा:

  • λx.e एक शब्द के रूप में प्रतिनिधित्व किया जाएगा है, जहां की परिलक्षित संस्करण है ,(LAM R(e))R(e)e
  • e e शब्द , और के रूप में दर्शाया जाएगा(APP R(e) R(e))
  • x को रूप में दर्शाया जाएगा ।(VAR x)

इस प्रतिनिधित्व के साथ, पैटर्न मिलान का उपयोग शर्तों में हेरफेर करने के लिए किया जा सकता है।

लेकिन हम एक समस्या में भागते हैं। और को पैटर्न मिलान के रूप में शब्दों के रूप में एन्कोड किया जाना चाहिए। इससे निपटना सीधा प्रतीत होता है, , और को जोड़ते हुए, लेकिन क्या मुझे इनका हेरफेर करने के लिए अन्य शर्तों को जोड़ने की आवश्यकता होगी?reflectevalREFLECTEVALMATCH

ऐसे डिज़ाइन विकल्प हैं जिन्हें बनाने की आवश्यकता है। फ़ंक्शन को ऊपर से क्या करना चाहिए जो कि और के शरीर के साथ करते हैं ? शरीर को रूपांतरित करना चाहिए या नहीं?R()reflectevalR()

जैसा कि मैं स्वयं प्रतिबिंब का अध्ययन करने में बहुत दिलचस्पी नहीं रखता हूं - पथरी अन्य अनुसंधान के लिए एक वाहन के रूप में काम करेगी - मैं पहिया को फिर से स्थापित नहीं करना चाहता हूं।

क्या कोई मौजूदा गणना है जो मैंने अभी वर्णित की है, उससे मेल खाती है

जहां तक ​​मैं बता सकता हूं, मेटाली जैसे कैल्सी, एक टिप्पणी में सुझाव दिया गया है, एक लंबा रास्ता तय करना है, लेकिन वे मैच के पैटर्न को समेटने और कोड के टुकड़े को डिक्रिप्ट करने की क्षमता शामिल नहीं करते हैं जो पहले से ही बनाए गए हैं।

एक चीज जो मैं करना चाहता हूं वह निम्नलिखित है:

  • let x=λy.y in reflect x(LAM (VAR y) (VAR y))

और फिर एक पूरी तरह से अलग अभिव्यक्ति बनाने के लिए परिणाम पर मिलान पैटर्न प्रदर्शन करते हैं।

यह निश्चित रूप से -calculus के लिए एक रूढ़िवादी विस्तार नहीं है और मेटा-थ्योरी बदसूरत होने की संभावना है, लेकिन यह मेरे आवेदन के लिए बिंदु की तरह है। मैं -abstractions को अलग करना चाहता हूं ।λλ


मेटामाएल एक टाइप की गई रिफ्लेक्टिव भाषा है, जो आपके रीफ्लेक्ट को निष्पादित करने और EVAL को क्रैक करने के ऑपरेटर के साथ है। टाइपिंग बुनियादी है, लेकिन आप इस पेपर की तरह काम में मोडल S4 से विरासत में मिला टुकड़ा देख सकते हैं जो आपकी मदद कर सकता है।
EX0du5

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

योजना (बगावत और अन्य जटिलताओं के बिना)?
गिल्स एसओ- बुराई को रोकना '

@ गिल्स: स्कीम एक प्रोग्रामिंग लैंग्वेज है, कैलकुलस नहीं। इसके अलावा, मुझे नहीं लगता कि यह वह कर सकता है जो मैं चाहता हूं।
डेव क्लार्क

@DaveClarke एक प्रोग्रामिंग भाषा बहुत सारे मौसा के साथ एक पथरी है। एक योजना कोर पहली नज़र में उपयुक्त लगती है, लेकिन मैंने आपकी आवश्यकताओं को सुनिश्चित करने के लिए पर्याप्त विचार नहीं दिए हैं। तुम्हें क्या लगता है काम नहीं करेगा? ( अगर आपको पसंद है तो चैट में ड्रॉप करें ।)
गिल्स एसओ- बुराई को रोकना '

जवाबों:


15

जीन लुई क्रिविन ने एक अमूर्त कलन की शुरुआत की, जो "क्रिविने मशीन" को बहुत ही गैर-तुच्छ तरीके से प्रस्तुत करता है (ध्यान दें कि क्रिवाइन मशीन पहले से ही कॉल का समर्थन करती है / लिस्प से निर्देश):

वह निम्नलिखित तरीके से परिभाषित इस लेख में एक "उद्धरण" ऑपरेटर का परिचय देता है: if एकϕ अवधि, नोट n φ की छवि φ कुछ द्विभाजन द्वारा π : Λ एन प्राकृतिक संख्या को लैम्ब्डा शर्तों से। नोट ¯ n चर्च अंक जो से मेल खाती है n एन । Krivine ऑपरेटर को परिभाषित करता है χ मूल्यांकन शासन द्वारा: χ φ φ ¯ n φλnϕϕπ:ΛNn¯nNχ

χ ϕϕ nϕ¯
मुझे विश्वास है कि क्लेनेन जादूगर यह दिखाएगा कि आप जो चाहते हैं वह करने के लिए यह पर्याप्त है: यानी एक उद्धरण और eval ऑपरेटरों को परिभाषित करें, अगर गणना योग्य है।π

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

उम्मीद है की यह मदद करेगा!


λ

(λ(x y).x)((λx.x x) (λy.y))

λx.x x


मैं इस उचित उत्तर का उत्थान करना चाहूंगा, लेकिन मुझे इस बात का कोई पता नहीं है कि क्या यह प्रश्न का उत्तर देना शुरू करता है।
राफेल

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

1
(λx.x x) (λy.y)λy.y(x y)

1
quotereflectquote

8

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

मेरा मानना ​​है कि इस क्षमता के होने से आपके समान सिद्धांत के लिए कुछ बुरे काम होते हैं। विशेष रूप से आप केवल यह साबित करने में सक्षम होंगे कि दो मूल्य समान हैं यदि अल्फा समतुल्य हैं।

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


1
ध्यान दें कि Krivine पथरी प्रस्तावों की एक गणना नहीं है, बल्कि इन के लिए realizers की है, जो एक अत्यधिक गैर तुच्छ समीकरण सिद्धांत है।
कोड़ी

5

प्रोग्रामिंग भाषाओं के सिद्धांत में जिस फीचर के बारे में आप बोलते हैं उसे आमतौर पर "उद्धरण" के रूप में संदर्भित किया जाता है। उदाहरण के लिए, जॉन लॉन्गले ने अपने किसी काम में इसके बारे में लिखा था, इस पत्र को देखें ।

यदि आप सैद्धांतिक विचारों के बाद (जैसा कि एक वास्तविक उपयोगी कार्यान्वयन के विपरीत) है, तो आप अपने तर्क के एक Gödel कोड को वापस करके पूर्णांक के प्रकार में नक्शे quote(या reflectजैसा कि आप इसे कहते हैं) के द्वारा चीजों को सरल कर सकते हैं nat। आप तब संख्या को विघटित कर सकते हैं जैसे आप एक सार सिंटैक्स ट्री को। इसके अलावा, आपको इसकी आवश्यकता नहीं है evalक्योंकि इसे भाषा में लागू किया जा सकता है - यह अनिवार्य रूप से भाषा के लिए एक दुभाषिया है।

nmφn(m)φnnλquote

यदि आप मुझे बताते हैं कि आप क्या कर रहे हैं, तो मैं आपको अधिक विशिष्ट संदर्भ देने में सक्षम हो सकता हूं।

वैसे, यहाँ एक खुली समस्या है:

λquoteξ

ξ

e1e2λx.e1λx.e2
λλquotequote
e1e2quotee1quotee2,
quote((λx.x)y)quotey.
quoteλ

βquoteλξ

ξβ

निम्नलिखित पेपर (paper) समीकरण के साथ कुछ समस्याएं दिखाता है: लैम्बडा कैलकुलस बीजगणितीय, पीटर सेलिंगर है। दिलचस्प है, कुछ नया मुझे पता नहीं था! ठंडा।
ट्रांसफ़रन नंबर्स

4

यहाँ एक वैकल्पिक उत्तर है, मेरे नाममात्र दृष्टिकोण का उपयोग करने के बजाय जो अभी भी प्रयोगात्मक है कुछ और स्थापित दृष्टिकोण है जो कागज पर वापस जाता है:

LEAP: eval और बहुरूपता के साथ एक भाषा
फ्रैंक Pfenning और पीटर ली
https://www.cs.cmu.edu/~fp/papers/tapsoft89.pdf

कागज के साथ शुरू होता है:

इसके बाद हमें इस सवाल पर ले जाया गया, पहले रेनॉल्ड्स द्वारा प्रस्तुत किया गया था, चाहे जोरदार टाइप की गई भाषाएं मेटाकार्युलर दुभाषियों को स्वीकार करती हों। पारंपरिक ज्ञान से प्रतीत होता है कि उत्तर "नहीं" था। हमारा जवाब "लगभग" है।

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

solve(true).
solve((A,B)) :- solve(A), solve(B).
solve(H) :- clause(H,B), solve(B).

यदि आप हल करने के लिए निम्नलिखित खंड जोड़ते हैं / 1:

solve(clause(H,B)) :- clause(H,B).

और यदि आप इसे देखते हैं कि क्लॉज़ / 2 भी हल / 1 का क्लॉज़ लौटाता है। आप तब हल (हल (...)) को कॉल कर सकते हैं और देख सकते हैं कि हल खुद को कैसे निष्पादित करता है।

स्व अभ्यावेदन के प्रश्न अभी भी कुछ शोध को नष्ट करते हैं, उदाहरण के लिए देखें:

गिरार्ड सिस्टम यू
मैट ब्राउन, जेन्स पाल्सबर्ग http://compilers.cs.ucla.edu/popl15/popl15-full.pdf में स्व प्रतिनिधित्व


3

इस समस्या की पहचान कोल और इसाबेल / एचओएल जैसे सबूत सहायकों के आसपास के क्षेत्र में की जाती है। यह संक्षिप्त HOAS के अंतर्गत आता है । Λ-Prolog के आसपास कुछ दावे हैं कि नए such क्वांटिफायर के माध्यम से ऐसी चीजें की जा सकती हैं। लेकिन मुझे इस दावे की अभी तक पकड़ नहीं मिल सकी है। मुझे लगता है कि मुझे अब तक मिली मुख्य अंतर्दृष्टि यह है कि कोई निश्चित दृष्टिकोण नहीं है, कुछ संभावित दृष्टिकोण हैं।

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

datatype Expr = var Name                 /* written as n */
              | app Expr Expr            /* written as s t */
              | abs Name Expr Expr       /* written as λn:s.t */

मेटा लेवल एक्सप्रेशंस को ऑब्जेक्ट लेवल एक्सप्रेशंस से अलग किया जा सकता है, जिसमें हम वेरिएबल नाम n, m, .. आदि का इस्तेमाल करते हैं। जबकि हम वस्तु स्तर पर चर नाम x, y, .. आदि का उपयोग करते हैं। ऑब्जेक्ट लॉजिक में एक मेटा टर्म की व्याख्या तब निम्नानुसार काम करेगी। नाममात्र के संदर्भ में नाममात्र शब्द t की व्याख्या के लिए [t] L लिखते हैं, जो एक वस्तु शब्द देना चाहिए। हम तो होगा:

 [n]σ = lookup σ n
 [s t]σ = [s]σ [t]σ
 [λn:s.t]σ = λx:[s]σ.[t]σ,n:x

उपरोक्त परिभाषित करेगा कि ओपी एक EVAL फ़ंक्शन को क्या कहता है। पॉलसन के लिए छोटा अंतर, σ केवल एक परिमित सूची है और कार्यात्मक नहीं है। मेरी राय में यह केवल एक EVAL फ़ंक्शन शुरू करने के लिए संभव होगा न कि एक REFLECT फ़ंक्शन। चूँकि वस्तु स्तर पर आपमें कुछ समानता हो सकती है ताकि विभिन्न लंबोदर भाव समान हों। आपको क्या करना है यदि आप आवश्यकता महसूस होने पर प्रतिबिंब के बारे में भी कारण के लिए eval का उपयोग करेंगे।

यदि आप नाममात्र और गैर-नाममात्र के बीच की दीवार को फाड़ना चाहते हैं, तो आपको प्रोलॉग की तरह चरम सीमाओं पर जाने की आवश्यकता होगी। लेकिन जैसा कि λ-Prolog सिस्टम उदाहरण से पता चलता है, उच्च-क्रम मामले में अतिरिक्त समस्याएं हैं जो उदाहरण के लिए केवल ifier क्वांटिफायर जैसे नए साधनों को पेश करके तार्किक तरीके से दूर की जा सकती हैं!

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