यदि कोई फ़ंक्शन शुद्ध है, तो गणना करें


11

विकिपीडिया के अनुसार:

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

मैं सोच रहा हूं कि क्या यह संभव है कि एक फ़ंक्शन शुद्ध या नहीं तो गणना करने के लिए फ़ंक्शन लिखें। जावास्क्रिप्ट में उदाहरण कोड:

function sum(a,b) {
    return a+b;
}

function say(x){
    console.log(x);
}

isPure(sum) // True
isPure(say) // False

7
यह कंप्यूटर साइंस स्टैक एक्सचेंज का उम्मीदवार हो सकता है । यह व्यावहारिक और डिजाइन के बजाय सिद्धांत ("संभव") के दायरे में अधिक जाता है ... यह मेरे केन से थोड़ा परे है।

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

मुझे लगता है कि आप यह निर्धारित कर सकते हैं कि किसी फ़ंक्शन को उसकी परिभाषा में टाइप किए गए कार्यों को देखकर शुद्ध है या नहीं। मेरा मतलब है, आप कार्यों की संरचना पर प्रेरण द्वारा शुद्धता को परिभाषित कर सकते हैं।
जियोर्जियो

7
प्लेटफ़ॉर्म-विशिष्ट प्रतिबिंब हैक के बिना करना संभव नहीं है। यदि कोई फ़ंक्शन एक ब्लैक बॉक्स है, तो कोई भी प्रयोग यह साबित नहीं कर सकता है कि यह शुद्ध है। उदाहरण के लिए, अगर ऐसा कुछ है, तो if (rand(1000000)<2) return WRONG_ANSWERएक सुसंगत व्यवहार के लिए फ़ंक्शन को कई बार जांचना मदद नहीं करेगा। लेकिन, यदि आपके पास फ़ंक्शन परिभाषा तक पहुंच है, तो सबूत तुच्छ है।
SK-तर्क

1
@ user470365 एक शुद्ध फ़ंक्शन की परिभाषा से - "परिणाम का मूल्यांकन किसी भी शब्दानुभवनीय दुष्प्रभाव या आउटपुट का कारण नहीं बनता है, जैसे कि उत्परिवर्तनीय वस्तुओं का उत्परिवर्तन या I / O उपकरणों के आउटपुट।" - जो भी IO को लिखता है वह परिभाषा से अशुद्ध होता है। उदाहरण में, sayकॉल console.logजो अशुद्ध sayहै वह अशुद्ध भी है।

जवाबों:


17

हाँ, यह संभव है, भाषा पर निर्भर करता है।

जावास्क्रिप्ट में, आप बता सकते हैं कि क्या कोई फ़ंक्शन निम्न मानदंडों से शुद्ध है:

  • यह केवल मापदंडों और स्थानीय लोगों को पढ़ता है;

  • यह केवल स्थानीय लोग लिखते हैं;

  • गैर-स्थानीय लोगों पर, यह केवल शुद्ध कार्य कहता है;

  • अंतर्निहित रूप से पुकारने वाले सभी कार्य शुद्ध हैं, उदाहरण के लिए toString; तथा

  • यह केवल स्थानीय लोगों के गुणों को लिखता है अगर वे गैर-स्थानीय लोगों को उर्फ ​​नहीं करते हैं।

सामान्य मामले में जावास्क्रिप्ट का निर्धारण करने के लिए एलियासिंग संभव नहीं है, क्योंकि आप हमेशा गतिशील रूप से किसी वस्तु के गुणों को देख सकते हैं object["property"]। बशर्ते आप कभी भी ऐसा न करें, और आपके पास पूरे कार्यक्रम का स्रोत हो, तो मुझे लगता है कि समस्या काफी विकट है। आपको इस बात की भी जानकारी होनी चाहिए कि कौन से मूल कार्यों के साइड-इफेक्ट्स हैं, जैसे कि console.logया डोम से जुड़े कुछ भी।

"शुद्ध" शब्द भी कुछ स्पष्टीकरण का उपयोग कर सकता है। यहां तक ​​कि एक दृढ़ता से, सांख्यिकीय रूप से टाइप की गई, विशुद्ध रूप से कार्यात्मक प्रोग्रामिंग भाषा में, जहां सभी फ़ंक्शन संदर्भित रूप से पारदर्शी हैं, एक फ़ंक्शन अभी भी समाप्त करने में विफल हो सकता है। इसलिए जब हम बात करते हैं id :: a -> a, तो हम जो कह रहे हैं वह नहीं है:

कुछ प्रकार के मूल्य को देखते हुए a, फ़ंक्शन idप्रकार के मूल्य का उत्पादन करता है a

बल्कि:

कुछ प्रकार के मूल्य को देखते हुए a, फ़ंक्शन उस मान का उत्पादन नहींid करता है जो प्रकार का नहीं है ।a

क्योंकि का एक वैध कार्यान्वयन idहै error "Not implemented!"। जैसा कि पीटरिस बताते हैं, इस असमानता को एक प्रकार की अशुद्धता के रूप में देखा जा सकता है। कोका एक कार्यात्मक प्रोग्रामिंग भाषा है - जावास्क्रिप्ट पर वाक्य रचना के साथ-जो विचलन (गैर-गतिरोध), संदर्भात्मक पारदर्शिता, अपवादों को फेंकने और I / O क्रियाओं जैसे संभावित प्रभावों का अनुमान लगा सकती है।



मुझे लगता है कि आपको मापदंड की सूची में "इसे केवल शुद्ध कार्य कहते हैं" जोड़ना होगा।
ग्रेग हेविगेल

1
@GregHewgill: अच्छी पकड़। मैंने उसी हिसाब से जवाब अपडेट किया। स्थानीय लोगों पर उत्परिवर्तन कार्यों को कॉल करना ठीक है , जब तक कि वे अन्यथा साइड-इफ़ेक्ट नहीं होते हैं। "प्योर" भी एक शब्द अतिभारित है ...
जॉन पूर्डी

आपको यह भी जांचना होगा कि toStringक्या आप स्ट्रिंग के रूप में उपयोग की जाने वाली किसी भी वस्तु के लिए शुद्ध हैं।
ओलेग वी। वोल्कोव

मुझे नहीं लगता कि यह उत्तर सही है, क्योंकि केवल परिस्थितियों का एक सबसेट है जहां आप वास्तव में ये निर्धारण कर सकते हैं। विचार करें: क्या यह कार्य शुद्ध है? function a (o) { return o.method(); }- हम वास्तव में इसका जवाब नहीं दे सकते हैं, क्योंकि यह इस बात पर निर्भर करता है कि क्या पैरामीटर oपारित किया गया है। इसके अलावा, हम इस बात का हिसाब नहीं दे सकते कि क्या होता है अगर पहले से प्रमाणित-शुद्ध फ़ंक्शन को गैर-शुद्ध कार्यान्वयन में बदल दिया जाता है, जो हमेशा जावास्क्रिप्ट के साथ एक संभावित मुद्दा होता है।
जूल्स

11

नहीं, आप आसानी से जांच सकते हैं कि क्या कोई फ़ंक्शन केवल "शुद्ध-सुरक्षित" संचालन करता है, जैसा कि जॉन प्यूडी के उत्तर में वर्णित है, लेकिन यह कि आईएमओ प्रश्न का उत्तर देने के लिए पर्याप्त नहीं है।

इस समारोह पर विचार करें:

function possiblyPure(x) {
    if (someCheck(x)) {
        return x+1; // pure code path
    }
    else {
        console.log("I'm so unpure..."); // unpure code path
    }
}

जाहिर है, अगर someCheckयह अस्पष्ट है, तो है possiblyPure। लेकिन, अगर someCheckशुद्ध है और trueहर संभव मूल्य के लिए रिटर्न x, possiblyPureशुद्ध है, क्योंकि अस्पष्ट कोड पथ अगम्य है!

और यहाँ मुश्किल भाग आता है: यह निर्धारित करना कि someCheckहर संभव इनपुट के लिए सही है या नहीं । उस प्रश्न का उत्तर देने की कोशिश करने से आप रुकने की समस्या और इसी तरह की समस्याओं के दायरे में आ जाते हैं।

संपादित करें: सबूत है कि यह असंभव है

वहाँ कुछ अनिश्चितता है या नहीं एक शुद्ध कार्य हर संभव इनपुट पर समाप्त करना चाहिए। लेकिन दोनों ही मामलों में, हॉल्टिंग समस्या का उपयोग यह दिखाने के लिए किया जा सकता है कि शुद्धता की जांच असंभव है।

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

केस बी) यदि किसी इनपुट पर एक शुद्ध फ़ंक्शन को समाप्त नहीं होने दिया जाता है, तो हम कुछ इस तरह का निर्माण कर सकते हैं: मान लेते हैं कि isPure(f)यदि fशुद्ध स्ट्रिंग को परिभाषित करने वाला एक स्ट्रिंग है तो गणना करता है।

function halts(f) {
   var fescaped = f.replace(/\"/g, '\\"');
   var upf = 'function() { '+f+'("'+fescaped+'\); console.log("unpure"); }';
   return isPure(upf);
}

अब isPureयह निर्धारित करना है कि fइनपुट के रूप में इसका अपना स्रोत है या नहीं । अगर यह upfरुका हुआ है , तो यह अस्पष्ट है; अगर यह समाप्त नहीं होता है, upfतो शुद्ध iff fशुद्ध है।

यदि isPureउम्मीद के मुताबिक काम किया जाता है (हर इनपुट पर सही परिणाम और समाप्ति होती है), तो हम रुकने की समस्या (*) को हल कर देते! चूँकि यह असंभव है, इसलिए isPureइसका अस्तित्व नहीं है।

(*) शुद्ध जावास्क्रिप्ट कार्यों के लिए, जो कि ट्यूरिंग मशीन के लिए इसे हल करने के लिए पर्याप्त है।


3
सच। एक रूढ़िवादी विश्लेषण करना हमेशा संभव होता है - यह जांचने के लिए कि क्या कोई फ़ंक्शन निश्चित रूप से शुद्ध है, लेकिन यह जांचना संभव नहीं है कि क्या यह निश्चित रूप से शुद्ध नहीं है।
एसके-तर्क

कई मामले तुच्छ रूप से निर्णायक होते हैं - जॉन पेडी या अशुद्ध कार्यों द्वारा वर्णित उन शुद्ध कार्य जो बिना शर्त कुछ गंदा करते हैं; लेकिन सामान्य तौर पर, कोई भी ऐसे मामलों का निर्माण कर सकता है जो अयोग्य हैं।
user281377

1

इस स्टैकओवरफ़्लो प्रश्न का उत्तर येलफेल्डम के पास है जो यहां प्रासंगिक है। (और किसी कारणवश मैं ऐसा नहीं कर सकता कि मैं थाह न पाऊं। क्या यह 3 साल की उम्र की किसी चीज को उभारने के लिए खराब शिष्टाचार होगा?) वह इस बात का प्रमाण देता है कि क्या कोई फ़ंक्शन शुद्ध है, जो किसी टिप्पणी में हल करने की समस्या से छुटकारा दिला सकता है।

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

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


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

0

बड़ा सवाल है।

सबसे अच्छा आप व्यवहार में कर सकते हैं, समारोह को कॉल करने के लिए i / o कार्यों को सुनने की कोई क्षमता नहीं मानते हुए कई बार संभव के रूप में। फिर देखें कि रिटर्न वैल्यू सुसंगत है या नहीं।

लेकिन आप सामान्य रूप से ऐसा नहीं कर सकते। तर्क से, गैर-रोक कार्यक्रम गैर-शुद्ध हैं, और हम समस्या को हल नहीं कर सकते।


1
-1: यह एक फ़ंक्शन लिखने के लिए तुच्छ से परे होगा जो इस परीक्षण को पास करता है और शुद्ध लेकिन कुछ भी है।
मटनज़

3
इस तर्क से, कोई भी voidकार्य "शुद्ध" होगा, जो स्पष्ट रूप से गलत है।
ग्रेग हेवगिल

1
@ अंग: विस्तार से, शून्य फू (शून्य) को भी शुद्ध होना होगा।
मटनज़

0

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


5
हमेशा के लिए चलने से किसी फ़ंक्शन को शुद्ध फ़ंक्शन के लिए अपने मानदंड से छूट नहीं लगती है।
4

+1: एक निहितार्थ है कि फंक्शनलआईयन "फ़ंक्शन द्वारा हमेशा एक ही परिणाम मान देता है ...." का मूल्यांकन करता है
मैट्नज़

2
किसी भी राज्य को संशोधित किए बिना लगातार चलाने से पूरी तरह से "शुद्ध" है। लेकिन, निश्चित रूप से, यह एक शब्दावली मुद्दा है।
एसके-तर्क

@mattnz, इस तरह के एक फ़ंक्शन हमेशा bottomमूल्य का मूल्यांकन करेगा ।
SK- तर्क

1
मैं देख सकता हूं कि शब्दावली का मुद्दा कहां आता है। कुछ व्याख्याओं में, एक "शुद्ध" फ़ंक्शन वह है जो नियतात्मक है और साथ ही कभी भी इसके निष्पादन के दौरान बाहर के साथ किसी भी राज्य या मूल्य का संचार नहीं करता है। अन्य व्याख्याओं में, आवश्यकताओं में ठहराव जोड़ा जाता है। पहली व्याख्या के साथ, यह निर्धारित करना आसान है कि क्या फ़ंक्शन शुद्ध है: एक मशीन जो किसी विशेष भाषा को निष्पादित करती है, यह निर्धारित करने में सक्षम होना चाहिए कि क्या उस भाषा में कोई प्रोग्राम बाहर के साथ कोई संचार करता है।
22
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.