फिक्स्ड-पॉइंट कॉम्बिनेटर (वाई कॉम्बिनेटर) की स्पष्ट, सहज व्युत्पत्ति?


28

फिक्स्ड-पॉइंट कॉम्बीनेटर FIX (उर्फ वाई कॉम्बीनेटर) में (अप्रकाशित) लैम्ब्डा कैलकुलस ( ) को इस प्रकार परिभाषित किया गया है:λ

FIX≜λf.(λx.f (λy.x x y)) (λx.f (λy.x x y))

मैं इसका उद्देश्य समझता हूं और मैं इसके आवेदन के निष्पादन को पूरी तरह से ठीक कर सकता हूं; मैं समझना चाहता हूं कि पहले सिद्धांतों से एफआईएक्स को कैसे प्राप्त किया जाए ।

जब तक मैं इसे स्वयं प्राप्त करने का प्रयास करता हूं, तब तक यहां है:

  1. FIX एक फ़ंक्शन है: FIX ≜λ…
  2. FIX इसे पुनरावर्ती बनाने के लिए एक और फ़ंक्शन, f लेता है f: FIX ≜λf.…
  3. फ़ंक्शन f का पहला तर्क फ़ंक्शन का "नाम" है, जिसका उपयोग एक पुनरावर्ती अनुप्रयोग का उद्देश्य है। इसलिए, f के पहले तर्क के सभी दिखावे को fएक फ़ंक्शन द्वारा प्रतिस्थापित किया जाना चाहिए, और इस फ़ंक्शन को f के बाकी तर्कों की उम्मीद करनी चाहिए f(चलो मान लेते हैं कि f एक तर्क लेता है): FIX ≜λf.…f (λy.…y)

यह वह जगह है जहां मैं नहीं जानता कि मेरे तर्क में "एक कदम" कैसे उठाया जाए। छोटे दीर्घवृत्त यह दर्शाते हैं कि मेरी FIX कहां गायब है (हालांकि मैं केवल यह जान पा रहा हूं कि "वास्तविक" FIX से तुलना करके)।

मैंने पहले से ही टाइप और प्रोग्रामिंग लैंग्वेज पढ़ी हैं , जो इसे सीधे प्राप्त करने का प्रयास नहीं करता है, और इसके बजाय एक व्युत्पत्ति के लिए पाठक को द लिटिल शेमर को संदर्भित करता है । मैंने पढ़ा है कि, और इसकी "व्युत्पत्ति" भी इतनी मददगार नहीं थी। इसके अलावा, यह एक सीधा व्युत्पत्ति के कम और अधिक एक बहुत विशिष्ट उदाहरण और में एक उपयुक्त पुनरावर्ती क्रिया लिखने के लिए एक तदर्थ प्रयास का उपयोग की है λ ।


1
यह पोस्ट मददगार हो सकती है। सामान्य तौर पर, मुझे लगता है कि कंबाइनेटर के कई पुनरावृत्तियों के माध्यम से बस गुजरना और यह पता लगाना उपयोगी है कि यह क्यों काम करता है।
— Xodarap

2
कई अलग-अलग फिक्स्ड पॉइंट कॉम्बिनेटर हैं। शायद लोग सिर्फ कॉम्बिनेटरों के साथ खेलते थे जब तक कि वे उन पर ठोकर नहीं खाते।
— युवल फिल्मस

@ युवलफिल्मस, यही मेरा शोध है और इस सवाल का जवाब मुझे सोचने लगा है। लेकिन मुझे अभी भी लगता है कि यह "देखना" निर्देशात्मक होगा कि कैसे कंबाइनेटर (ओं) को तार्किक रूप से बनाया जाता है, एक ऐसा कौशल जो विशेष रूप से तब सहायक होता है, जब एक नए कॉम्बीनेटर के निर्माण की कोशिश की जाती है।
— BlueBomber

डैनियल पी। फ्रीडमैन (या "द लिटिल स्कीमर") द्वारा "द लिटिल लिस्पर" में अध्याय 9 पढ़ें।
— user18199

2
ओपी को लगता है कि वे पहले ही पढ़ चुके हैं।
— राफेल

जवाबों:


29

मैंने इसे कहीं नहीं पढ़ा है, लेकिन यह है कि मेरा मानना ​​है कि व्युत्पन्न हो सकता है:Y

चलो एक पुनरावर्ती कार्य , शायद एक तथ्य या ऐसा कुछ और। अनौपचारिक रूप से, हम को छद्म लंबोदर शब्द के रूप में परिभाषित करते हैं, जहां अपनी परिभाषा में होता है:fff

f=…f…f…

सबसे पहले, हम महसूस करते हैं कि पुनरावर्ती कॉल को एक पैरामीटर के रूप में फैक्टर किया जा सकता है:

f=(λr.(…r…r…))⏟Mf

अब हम को परिभाषित कर सकते हैं यदि हमारे पास केवल एक तरीका है कि हम इसे अपने तर्क के रूप में कैसे पारित करें। यह इसलिए नहीं कि हमारे पास नहीं है, निश्चित रूप से संभव है, हाथ में। हमारे हाथ में जो है वह । चूँकि में वह सब कुछ है जो हमें को परिभाषित करने की आवश्यकता है , हम को बजाय तर्क के रूप में पास करने का प्रयास कर सकते हैं और बाद में से इसे फिर से जोड़ने का प्रयास कर सकते हैं । हमारा पहला प्रयास इस तरह दिखता है:ffMMfMff

f=(λr.(…r…r…))⏟M(λr.(…r…r…))⏟M

हालाँकि, यह पूरी तरह से सही नहीं है। इससे पहले, को अंदर लिए प्रतिस्थापित किया गया था । लेकिन अब हम इसके बजाय पास करते हैं। हमें किसी तरह उन सभी जगहों को ठीक करना होगा जहाँ हम उपयोग करते हैं ताकि वे से को फिर से । वास्तव में, यह बिल्कुल भी मुश्किल नहीं है: अब जब हम जानते हैं कि , हर जगह हम उपयोग करते हैं, हम इसे बस बदल देते हैं ।frMMrfMf=MMr(rr)

f=(λr.(…(rr)…(rr)…))⏟M′(λr.(…(rr)…(rr)…))⏟M′

यह समाधान अच्छा है, लेकिन हमें अंदर बदलना पड़ा । यह बहुत सुविधाजनक नहीं है। हम को संशोधित करने के लिए बिना किसी और को शुरू किए बिना इसे और अधिक भव्यता से कर सकते हैं जो अपने तर्क पर लागू होता है: को रूप में व्यक्त करके हम प्राप्त करते हैंMMλMM′λx.M(xx)

f=(λx.(λr.(…r…r…))⏟M(xx))(λx.(λr.(…r…r…))⏟M(xx))

इस तरह, जब को लिए प्रतिस्थापित किया जाता है , को लिए प्रतिस्थापित किया जाता है, जो कि बराबर परिभाषा द्वारा होता है । यह हमें की एक गैर-पुनरावर्ती परिभाषा देता है , जिसे एक मान्य लंबोदर शब्द के रूप में व्यक्त किया जाता है!MxMMrff

लिए संक्रमण अब आसान है। हम बजाय एक मनमाना लंबोदर शब्द ले सकते हैं और इस पर यह प्रक्रिया कर सकते हैं। इसलिए हम को परिभाषित और परिभाषित कर सकते हैंYMM

Y=λm.(λx.m(xx))(λx.m(xx))

वास्तव में, को कम कर देता है क्योंकि हमने इसे परिभाषित किया है।YMf


नोट: मैंने प्राप्त किया है क्योंकि यह साहित्य में परिभाषित है। आपके द्वारा वर्णित कॉम्बिनेटर कॉल-बाय-वैल्यू भाषाओं के लिए का एक प्रकार है , जिसे कभी - कभी भी कहा जाता है । यह विकिपीडिया लेख देखें ।YYZ


1
लापता-लेकिन-स्पष्ट रूप से स्पष्ट अंतर्ज्ञान कि आपकी उत्कृष्ट प्रतिक्रिया ने मुझे दिया है कि एक पुनरावर्ती कार्य को एक तर्क के रूप में स्वयं की आवश्यकता है, इसलिए हम एक धारणा के साथ शुरू करते हैं कि फ़ंक्शन में कुछ लिए फॉर्म । तो फिर, जैसा कि हम निर्माण , हम उस दावे के उपयोग कि में आंतरिक रूप से खुद के लिए कुछ के आवेदन के रूप में परिभाषित किया गया है , जैसे, लागू करने के के लिए आपका जवाब है, जो परिभाषा से है के बराबर में । चित्त आकर्षण करनेवाला! f=X(X)XXfXxxf
— BlueBomber

11

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

यह पूछ कैसे लोगों को प्राप्त की तरह है के लिए एक समाधान के रूप में । वे नहीं! समीकरण में एक अनूठा समाधान नहीं है।(x,y)=(0,0)x=y


बस इस मामले में कि आप क्या जानना चाहते हैं कि पहला निश्चित-बिंदु प्रमेय कैसे खोजा गया था। मुझे यह कहने दें कि मैं यह भी सोचता हूं कि जब मैंने पहली बार उन्हें देखा था तो वे निश्चित-बिंदु / पुनरावृत्ति सिद्धांत के साथ कैसे आए थे। यह बहुत सरल लगता है। विशेष रूप से कम्प्यूटेबिलिटी सिद्धांत रूप में। युवल जो कहता है, उसके विपरीत यह ऐसा मामला नहीं है कि लोगों ने कुछ न कुछ मिलने तक चारों ओर खेला। यहाँ मैं क्या पाया है:

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


आप जिस ऑपरेटर से पूछ सकते हैं उसे कैसे प्राप्त करें? यहाँ है कि मैं इसे कैसे ध्यान में रखता हूं। फिक्स्ड-पॉइंट प्रमेय स्व-संदर्भ को हटाने के बारे में है।

झूठा विरोधाभास सभी जानते हैं:

मैं एक मांद हूं।

या अधिक भाषाई रूप में:

यह वाक्य झूठा है।

अब ज्यादातर लोगों को लगता है कि इस वाक्य में समस्या आत्म-संदर्भ के साथ है। यह नहीं! आत्म-संदर्भ को समाप्त किया जा सकता है (समस्या सच्चाई के साथ है, एक भाषा सामान्य रूप से अपने स्वयं के वाक्यों की सच्चाई के बारे में बात नहीं कर सकती है, देखें टार्स्की की सत्य प्रमेय की अपरिभक्ति देखें )। सेल्फ-रेफरेंस को हटाने का फॉर्म निम्नानुसार है:

यदि आप निम्नलिखित उद्धरण को दो बार लिखते हैं, तो दूसरी बार उद्धरण के अंदर, परिणामी वाक्य गलत है: "यदि आप निम्न उद्धरण को दो बार लिखते हैं, तो दूसरी बार उद्धरण के अंदर, परिणामी वाक्य गलत है:"

कोई स्व-संदर्भ नहीं, हमारे पास निर्देश हैं कि कैसे एक वाक्य का निर्माण करें और फिर उसके साथ कुछ करें। और जो वाक्य बनता है वह निर्देशों के बराबर होता है। ध्यान दें कि -calculus में हमें उद्धरण की आवश्यकता नहीं है क्योंकि डेटा और निर्देशों के बीच कोई अंतर नहीं है।λ

अब अगर हम इसका विश्लेषण करें तो हमारे पास जहां का निर्माण करने और इसके लिए कुछ करने के निर्देश हैं ।MMMxxx

Mx=f(xx)

तो है और हमारे पास हैMλx.f(xx)

MM=(λx.f(xx))(λx.f(xx))

यह एक निश्चित । यदि आप इसे एक ऑपरेटर बनाना चाहते हैं तो हम सिर्फ जोड़ते हैं और हमें मिलता है :fλfY

Y=λf.(MM)=λf.((λx.f(xx))(λx.f(xx)))

इसलिए मैं सिर्फ स्व-संदर्भ के बिना विरोधाभास को ध्यान में रखता हूं और इससे मुझे यह समझने में मदद मिलती है कि क्या है।Y


3

तो आपको एक निश्चित बिंदु कॉम्बिनेटर को परिभाषित करने की आवश्यकता है

fix f = f (fix f)
      = f (f (fix f))
      = f (f (f ... ))

लेकिन स्पष्ट पुनरावृत्ति के बिना। आइए सबसे सरल irreducible कॉम्बिनेटर के साथ शुरू करें

omega = (\x. x x) (\x. x x)
      = (\x. x x) (\x. x x)
      = ...

xपहले लैम्ब्डा में बार-बार दूसरे लैम्ब्डा द्वारा दिया जाता है। सरल अल्फा-रूपांतरण इस प्रक्रिया को स्पष्ट करता है:

omega =  (\x. x x) (\x. x x)
      =α (\x. x x) (\y. y y)
      =β (\y. y y) (\y. y y)
      =α (\y. y y) (\z. z z)
      =β (\z. z z) (\z. z z)

यानी पहले लैम्ब्डा में वेरिएबल हमेशा गायब हो जाता है। इसलिए यदि हम fपहले लंबोदर में एक जोड़ते हैं

(\x. f (x x)) (\y. y y)

fइच्छा बॉब अप

f ((\y. y y) (\y. y y))

हमें अपनी omegaपीठ मिल गई है। अब यह स्पष्ट होना चाहिए, कि यदि हम fदूसरे लैम्ब्डा में एक जोड़ते हैं , तो fवसीयत पहले लैम्ब्डा में दिखाई देगी और फिर यह ऊपर जाएगी:

Y f = (\x. x x)     (\x. f (x x))
      (\x. f (x x)) (\x. f (x x)) -- the classical definition of Y

जबसे

(\x. s t) z = s ((\x. t) z), if `x' doesn't occur free in `s'

हम अभिव्यक्ति को फिर से लिख सकते हैं

f ((\x. x x) (\x. f (x x))

जो बस है

f (Y f)

और हमें अपना समीकरण मिल गया है Y f = f (Y f)। तो Yकंबाइनेटर अनिवार्य रूप से है

  1. दोगुना f
  2. बनाने के पहले fबाल काटा
  3. दोहराना

2

आपने सामान्य रूप के बिना समीकरण का क्लासिक उदाहरण देखा होगा:

(λx.xx)(λx.xx)▹(λx.xx)(λx.xx)

सामान्य पुनरावृत्ति के लिए इसके समान समीकरण का सुझाव दिया गया है:

(A)(λx.R(xx))(λx.R(xx)) ▹R( (λx.R(xx))(λx.R(xx)) )▹R(R( (λx.R(xx))(λx.R(xx)) ))▹…

(ए) लैम्ब्डा कैलकुलस (आदिम पुनरावर्ती से परे) में सामान्य पुनरावर्ती समीकरण लिखने का एक तरीका है। तो आप समीकरण को कैसे हल ? प्राप्त करने के लिए उपरोक्त समीकरण में लिए प्लग :Yf=f(Yf)fR

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