डेटा समानांतर ऑपरेटरों के साथ कुल कार्यात्मक भाषा का उपयोग करके कौन से एल्गोरिदम व्यक्त किए जा सकते हैं?


11

एक कार्यात्मक प्रोग्रामिंग भाषा की कल्पना करें, जिसका एकमात्र डेटा प्रकार संख्यात्मक स्केल और सरणियों के मनमाने ढंग से घोंसले हैं। भाषा में अनबाउंड इटरेशन के किसी भी साधन का अभाव है, इसलिए निम्नलिखित अस्वीकृत हैं:

  • स्पष्ट छोरों (साइड-इफेक्ट्स के बिना किसी भी तरह से अधिक उपयोग नहीं)
  • प्रत्यावर्तन
  • मनमाना प्रथम श्रेणी के कार्य (कोई वाई-कॉम्बिनेटर)

भाषा, हालांकि, है:

  • शीर्ष स्तर के कार्य
  • lexically scoped बाँधने देना
  • शाखा नियंत्रण प्रवाह
  • सामान्य स्केलर गणित और तर्क कार्य
  • भरण (n, x) जैसे कुछ सरल सरणी निर्माता जो समान मान x के साथ n-तत्व सरणी बनाता है
  • सबसे महत्वपूर्ण: उच्च-क्रम ऑपरेटरों का एक सीमित सेट जो समानांतर संरचित पुनरावृत्ति (जैसे कि नक्शा, कम, स्कैन, सभी जोड़े) करते हैं।

डेटा समानांतर ऑपरेटरों के बारे में अधिक विशिष्ट होना:

  • y = नक्शा (f, x) => y [i] = f [i]
  • y = कम करना (f, a, x) => y = f (a, f (y [p [0]], f (y [p [1]], ...))) कुछ क्रमपरिवर्तन p के लिए
  • y = स्कैन (f, a, x) => y [i] = कम करना (f, a, y [० ... i-१)
  • y = allpairs (f, x, y) => y [i, j] = f (x [i], y / j])

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

स्पष्ट रूप से कुछ निर्माण हैं जिन्हें इस भाषा में व्यक्त नहीं किया जा सकता है, जैसे:

while f(x) > tol:
    x <- update(x)   

हम इस प्रणाली में क्या व्यक्त कर सकते हैं? क्या हम केवल एफपी में समस्याओं को खोजने के लिए सीमित हैं? क्या हम सभी बहुपद समय एल्गोरिदम पर कब्जा कर सकते हैं? इसके अलावा, क्या इस वर्ग के लिए ऑपरेटरों का कुछ न्यूनतम सेट है?

जवाबों:


7

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

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

मैं संक्षिप्त, संक्षिप्त जवाब देता हूं कि आप काफी कुछ व्यक्त कर सकते हैं।


1
NESL कुल भाषा नहीं है।
4

मैं कुछ समय के लिए NESL के बारे में सतही रूप से अवगत रहा हूं, लेकिन पहली बार Blelloch के पत्रों में से एक को विस्तार से पढ़ा। पारितोषिक के लिए धन्यवाद। NESL उस भाषा के समान है जो मैंने ऊपर वर्णित की है, जैसा कि प्रति Vognsen ने देखा है, यह पुनरावृत्ति की अनुमति देता है।
एलेक्स रुबिनस्टेन

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

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

7

मेरे अन्य उत्तर ने भाषा में खामियों की ओर संकेत किया क्योंकि यह खड़ी है। इस उत्तर में मैं कुल भाषा में सिलवटों और खुलासा के सह-अस्तित्व के साथ मुद्दों पर अधिक विस्तार दूंगा। तब मैं एक प्रस्ताव का प्रस्ताव करूंगा और दिखाऊंगा कि पी (और वास्तव में कई और) में सभी समस्याओं को इस विस्तारित भाषा में हल किया जा सकता है।

कुल भाषा में तह करना सूची का उपभोग करता है:

fold :: (a -> b -> b) -> b -> List a -> b

कुल भाषा में अनफोल्डिंग स्ट्रीम उत्पन्न करता है, जो संभावित रूप से अनबाउंड हैं:

unfold :: (b -> Maybe (a, b)) -> b -> Stream a

दुर्भाग्य से, सूचियाँ और धाराएँ अलग-अलग दुनिया में रहती हैं, इसलिए इन ऑपरेटरों की रचना नहीं की जा सकती है। हमें आंशिक पत्राचार की आवश्यकता है:

stream :: List a -> Stream a
list :: Int -> Stream a -> List a

स्ट्रीम ऑपरेटर एक सूची को एक बंधी हुई स्ट्रीम में एम्बेड करता है। सूची फ़ंक्शन पहले n तत्वों (या इससे कम यदि स्ट्रीम पहले समाप्त होता है) को एक सूची में निकालता है। इस प्रकार हमारे पास निम्नलिखित समीकरण हैं:

for all xs :: List a, xs == list (length xs) (stream xs)

एक दक्षता अनुकूलन के रूप में हम एक मध्यवर्ती डेटा संरचना के रूप में धाराओं को पूरी तरह से काट सकते हैं:

unfoldList :: Int -> (b -> Maybe (a, b)) -> b -> List a

मैं अब इस बात का प्रमाण दूंगा कि यह (मूल प्रश्न में पहले से ही निहित अन्य परिचालकों के साथ) हमें किसी भी बहुपद-कालिक एल्गोरिथ्म का अनुकरण करने देता है।

परिभाषा के अनुसार, एक भाषा L, P में है जब एक ट्यूरिंग मशीन M और एक बहुपद p है, जिसमें L में x की सदस्यता का निर्धारण M को p (n) पुनरावृत्तियों पर चलाने के द्वारा किया जा सकता है जहाँ n = x | एक मानक तर्क से, मशीन का टेप पुनरावृति k में अधिकतम 2k + 1 की लंबाई के साथ एन्कोड किया जा सकता है, भले ही मशीन का टेप अनंत हो।

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

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


4

यह बहुत जुझारू भाषा है। फैक्टोरियल फंक्शन की प्रोग्रामिंग करने की कोशिश करें:

fact 0 = 1
fact n = n * fact (n-1)

समस्या यह है कि आपकी भाषा में केवल तह होती है, लेकिन कोई खुलासा नहीं होता है। फैक्टरियल को व्यक्त करने का प्राकृतिक तरीका सूची में n [1, 2, ..., n] की एक तह को बनाना है, जो गुना करते समय इसे फाड़ता है।

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

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


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

अनफॉल्डिंग स्वाभाविक रूप से स्ट्रीम-वैल्यू है, न कि ऐरे-वैल्यू, जो कुल सख्त भाषाओं में कॉर्कसियन के साथ एक मूल समस्या है।
प्रति सोग्न
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.