लैंबडा कैलकुलस जेनरेटर


10

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

मैं यह जानने के लिए उत्सुक हूं कि क्या इसका लैम्ब्डा कैलकुलस जनरेटर बनाना संभव है; अनिवार्य रूप से, एक लूप जो अनंत समय को देखते हुए, हर संभव लैम्ब्डा कैलकुलस फ़ंक्शन का उत्पादन करेगा। (एक स्ट्रिंग के रूप में)।

चूँकि लैम्ब्डा कैलकुलस इतना सरल है, इसके संकेतन में केवल कुछ ही तत्व होने के कारण मुझे लगा कि यह संभव हो सकता है (हालाँकि, बहुत उपयोगी नहीं है) उस संकेतन तत्वों के सभी संभावित संयोजनों का उत्पादन करना, सबसे सरल संयोजनों से शुरू होता है, और इस तरह हर संभव लैम्ब्डा का उत्पादन होता है। कलन समारोह।

बेशक, मैं लैंबडा कैलकुलस के बारे में लगभग कुछ भी नहीं जानता हूं, इसलिए मुझे पता नहीं है कि क्या यह वास्तव में संभव है।

क्या यह? यदि हां, तो क्या यह बहुत सीधा है जैसे मैंने इसकी कल्पना की है, या यह तकनीकी रूप से संभव है, लेकिन इतना मुश्किल है कि यह प्रभावी रूप से असंभव है?

पुनश्च। मैं बीटा-कम किए गए फ़ंक्शंस के बारे में बात नहीं कर रहा हूं, मैं सिर्फ हर लैम्ब्डा कैलकुलस फ़ंक्शन के प्रत्येक मान्य संकेतन के बारे में बात कर रहा हूं।

जवाबों:


19

ज़रूर, यह एक मानक एन्कोडिंग अभ्यास है।

सबसे पहले, किसी भी बायजेक्टिव कंप्यूटेबल फ़ंक्शन को युग्मन फ़ंक्शन कहते हैं। एक मानक विकल्प हैपी:एन2एन

पी(n,)=(n+)(n++1)2+n

कोई यह साबित कर सकता है कि यह एक आक्षेप है, इसलिए किसी भी प्राकृतिक देखते हुए , हम गणना कर सकते हैं जैसे कि ।n , m p ( n , m ) = kn,पी(n,)=

लैम्ब्डा शब्दों की गणना करने के लिए, चर नामों के लिए किसी भी एन्यूमरेशन को ठीक करें: ।एक्स0,एक्स1,एक्स2,...

फिर, प्रत्येक प्राकृतिक संख्या , प्रिंट करें , निम्नानुसार पुन: परिभाषित:एल एक मीटर एक ( मैं )मैंएल(मैं)

  • अगर भी हूँ, तो और वेरिएबलj = i / 2 x jमैंजे=मैं/2एक्सजे
  • यदि विषम है, तोj = ( i - 1 ) / 2मैंजे=(मैं-1)/2
    • यदि सम है, तो और ज्ञात करें ऐसा कि ; compute ; वापसी आवेदनk = j / 2 n , m p ( n , m ) = k N = l a m b d a ( n ) , M = l a m b d a ( m ) ( N M )जेk=j/2n,mp(n,m)=kN=lambda(n),M=lambda(m)(NM)
    • अगर विषम है, तो और ऐसा कि ; कंप्यूट ; अमूर्त वापसीk = ( j - 1 ) / 2 n , m p ( n , m ) = k M = l a m b d a ( m ) ( λ x nM )jk=(j1)/2n,mp(n,m)=kM=lambda(m)(λxn. M)

यह कार्यक्रम निम्नलिखित "बीजीय" जीव द्वारा उचित है जिसमें सभी लैंबडा शब्द के सेट शामिल हैं :Λ

ΛN+(Λ2+N×Λ)

जिसे "लंबो शर्तों के रूप में पढ़ा जाता है, वाक्यात्मक रूप से, 1 का असम्बद्ध संघ है) (एक प्राकृतिक के रूप में प्रतिनिधित्व), 2) अनुप्रयोगों (दो लंबो शर्तों द्वारा बनाएं), और 3) अमूर्त (एक जोड़ी चर / प्राकृतिक + लंबो शब्द) ) "।

यह देखते हुए कि हम ऊपर दिए गए एल्गोरिथ्म को प्राप्त करने के लिए पुनरावर्ती रूप से ( ) और (मानक सम / विषम एक) लागू करते हैं। पी एन + एन एनN2NpN+Nएन

यह प्रक्रिया सामान्य है, और संदर्भ-मुक्त व्याकरण के माध्यम से उत्पन्न लगभग किसी भी भाषा पर काम करेगी, जो ऊपर दिए गए एक समान समरूपता प्रदान करेगी।


वाह, धन्यवाद, क्या यह संभव है कि आप प्रतिनिधित्व कर सकें कि यह छद्म कोड है? मैं निश्चित रूप से बेहतर समझूंगा कि मेरे पास सीएस की डिग्री नहीं है।
लेगिट स्टैक

3
@LegitStack खैर, ऊपर छद्म कोड है :) आप एक पुनरावर्ती फ़ंक्शन को परिभाषित कर सकते हैं और फिर उपयोग कर सकते हैं । केवल nontrivial चरण ढूंढ रहा है ऐसा कि : यह सभी जोड़े साथ (तेजी से एल्गोरिदम भी मौजूद है) की कोशिश करके किया जा सकता हैlambda(n)if n%2==0 ...n,mp(n,m)=kn,mn,mk
chi

1
दरअसल, विकिपीडिया के अनुसार, इस विशेष युग्मन फ़ंक्शन का व्युत्क्रम माध्यम से पाया जा सकता है । a=12(8k+11),b=12a(a+1),n=bk,m=an
लीजनमोनमाल 978

12

हाँ। कुछ ऐसा लीजिए जो एएससीआईआई के सभी संभावित संकेतों की पुष्टि करता है। प्रत्येक आउटपुट के लिए, जांचें कि क्या यह एक मान्य लैम्ब्डा कैलकुलस सिंटैक्स है जो एक फ़ंक्शन को परिभाषित करता है; यदि नहीं, तो इसे छोड़ें। (उस जाँच को किया जा सकता है।) यह सभी लंबू कैलकुलस फ़ंक्शंस को बताता है।


5
अनिवार्य रूप से, इस तरह की सभी समस्याएं टाइपिंग बंदर को आमंत्रित करके हल की जाती हैं ...
xuq01

5
या आप लैम्बडा कैलकुलस शब्द को सीधे एन्युमरेट कर सकते हैं। प्रत्येक आउटपुट के रूप में यादृच्छिक स्ट्रिंग्स की तुलना में बहुत तेज़ एक उचित स्वरूपित शब्द है। यह एक शेक्सपियर प्ले जनरेटर के साथ टाइपिंग बंदरों को बदलने की तरह होगा।
दान D.

11

जैसा कि उल्लेख किया गया है, यह सिर्फ एक संदर्भ मुक्त भाषा से शब्दों की गणना है, इसलिए निश्चित रूप से उल्लेखनीय है। लेकिन इसके पीछे और भी दिलचस्प गणित है, जो ऑल्टिकल कॉम्बिनेटरिक्स के क्षेत्र में जा रहा है।

बाइनरी लैम्ब्डा कैलकुलस में शब्दों को गिनने और उत्पन्न करने वाले पेपर में एन्यूमरेशन समस्या का उपचार होता है, और बहुत कुछ। चीजों को सरल बनाने के लिए, वे बाइनरी लैम्ब्डा कैल्यूलस नामक किसी चीज का उपयोग करते हैं , जो डी ब्रूजन सूचकांकों का उपयोग करते हुए लैम्बडा शब्दों का सिर्फ एक एन्कोडिंग है , इसलिए आपको चर नाम रखने की आवश्यकता नहीं है।

उस कागज में उनकी पीढ़ी के एल्गोरिथ्म को लागू करने वाले ठोस हास्केल कोड भी होते हैं। यह निश्चित रूप से प्रभावी रूप से संभव है।

मैं जूलिया में उनके दृष्टिकोण के कार्यान्वयन को लिखा है ।


7

ज़रूर। हम सीधे उन्हें लंबोदर शब्दों की परिभाषा के अनुसार उत्पन्न कर सकते हैं।

हास्केल में, हम पहले डेटा प्रकार को परिभाषित करते हैं,

data LC a  =  Var  a                -- Constructor <type> <type> ...
           |  App (LC a) (LC a)     --
           |  Lam  a     (LC a)     --  ... alternatives ...

instance Show a => Show (LC a)      -- `LC a` is in Show if `a` is in Show, and
  where
    show (Var i)    =  [c | c <- show i, c /= '\'']
    show (App m n)  =  "("  ++ show m       ++ " " ++ show n ++ ")"
    show (Lam v b)  =  "(^" ++ show (Var v) ++ "." ++ show b ++ ")"

और फिर एक उचित (एर) के उपयोग के साथ join,

lambda :: [a] -> [LC a]
lambda vars  =  terms 
  where
  terms  =  fjoin [ map Var vars ,
                    fjoin [ [App t s | t <- terms] | s <- terms ] ,
                    fjoin [ [Lam v s | v <- vars ] | s <- terms ] ]

  fjoin :: [[a]] -> [a]
  fjoin xs  =  go [] xs             -- fairer join
      where 
      go [] []  =  []
      go a  b   =  reverse (concatMap (take 1) a) ++ go 
                       (take 1 b ++ [t | (_:t) <- a]) (drop 1 b)

हम बस उन्हें घेर लेते हैं, जैसे कि

> take 20 $ lambda "xyz"
[x,y,(x x),z,(y x),(^x.x),(x y),(^y.x),((x x) x),(^x.y),(y y),(^z.x),(x (x x)),
 (^y.y),(z x),(^x.(x x)),((x x) y),(^z.y),(y (x x)),(^y.(x x))]

> take 5 $ drop 960 $ lambda "xyz"
[(((x x) y) (z x)),(^y.(^x.((x x) (x x)))),((^x.(x x)) (^x.(x x))),(^x.((^z.x) 
 y)),((z x) ((x x) y))]

देखो, प्रसिद्ध Ω=(λx.xx)(λx.xx) अवधि ऊपर से नहीं है कि अब तक नीचे वहाँ में है!

fjoinके बराबर है इकाई ओमेगा की diagonal


0

मैं ऑनलाइन एक उपकरण भर में आया हूं जो एक नियमित अभिव्यक्ति से नमूना तार उत्पन्न कर सकता है: https://www.browserling.com/tools/text-from-regex । आप कुछ इस तरह से इनपुट करके ढेर सारे सैंपल लैंबडा शब्द बना सकते हैं:

(\( (lambda \w\. )* \w+ \))* 

बेशक, घोंसले के शिकार के स्तर के साथ शर्तों को प्राप्त करने के लिए, आपको एक संदर्भ-मुक्त व्याकरण का उपयोग करने की आवश्यकता है, जो एक नियमित अभिव्यक्ति की तुलना में भाषा को परिभाषित करने के लिए अधिक वर्णनात्मक उपकरण है। मैं एक संदर्भ-मुक्त व्याकरण की परिभाषा के आधार पर नमूना भाषा के वाक्यों को उत्पन्न करने के लिए एक मौजूदा उपकरण के पार नहीं आया हूं, लेकिन ऐसा कोई कारण नहीं है जिसे बनाया नहीं जा सकता।


2
-नियम नियमित अभिव्यक्ति (के रूप में आप पर ध्यान दें) नहीं हैं। इस तरह से एक शुरुआतकर्ता के सवाल का जवाब देना हानिकारक है क्योंकि यह एक महत्वपूर्ण अंतर (जैसे संदर्भ-मुक्त व्याकरण और नियमित अभिव्यक्ति के बीच) को अस्पष्ट करता है।λ
बाउर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.