2012-02-22 17 views
13

मान लीजिए मैं निम्नलिखित clojure कार्य:क्लोजर - फ़ंक्शन अभिव्यक्ति की समानता के लिए परीक्षण?

(defn a [x] (* x x)) 

(def b (fn [x] (* x x))) 

(def c (eval (read-string "(defn d [x] (* x x))"))) 

वहाँ एक रास्ता समारोह अभिव्यक्ति की समानता के लिए परीक्षण करने के लिए है -

(eqls a b) 

रिटर्न सच

के कुछ बराबर?

+1

असंभव - कार्यों का समकक्ष अपरिहार्य है। –

+0

ओह, बक्षीस टिप्पणी प्रारूप के बारे में खेद है - प्रारूपण का एहसास नहीं हुआ कि वैसे ही काम नहीं करेगा। –

+1

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

उत्तर

3

मैं क्लोजर के संबंध में उपरोक्त उत्तरों से सहमत हूं कि दो कार्यों के समानता को निर्धारित करने की क्षमता में निर्मित नहीं है और यह साबित हुआ है कि आप प्रोग्राम को कार्यात्मक रूप से परीक्षण नहीं कर सकते (जिसे ब्लैक बॉक्स परीक्षण भी कहा जाता है) निर्धारित करने के लिए रोकथाम की समस्या के कारण समानता (जब तक कि इनपुट सेट सीमित और परिभाषित न हो)।

मैं यह इंगित करना चाहता हूं कि बीजगणितीय रूप से दो कार्यों के समानता को निर्धारित करना संभव है, भले ही उनके पास विभिन्न रूप (अलग बाइट कोड) हों।

1 9 30 के दशक में अलोनोजो चर्च द्वारा समानता को साबित करने की विधि विकसित की गई थी और लैम्ब्डा कैलकुस में बीटा कमी के रूप में जानी जाती है। यह विधि निश्चित रूप से आपके प्रश्न के सरल रूपों (जो एक ही बाइट कोड भी प्रदान करेगी) पर लागू होती है और यह भी अधिक जटिल रूपों के लिए होती है जो विभिन्न बाइट कोड उत्पन्न करती हैं।

11

यह "फ़ंक्शन अभिव्यक्ति की समानता" के आधार पर सटीक रूप से निर्भर करता है।

ये फ़ंक्शन बाइटकोड के रूप में समाप्त होने जा रहे हैं, इसलिए मैं उदाहरण के लिए प्रत्येक फ़ंक्शन से संबंधित बाइटकोड को बाइट [] पर डंप कर सकता हूं और फिर दो बाइटकोड सरणी की तुलना कर सकता हूं।

हालांकि, अर्थात् समकक्ष तरीके से लिखने के कई अलग-अलग तरीके हैं, जिनके बाइटकोड में समान प्रतिनिधित्व नहीं होगा।

सामान्यतः, यह बताना असंभव है कि कोड का एक टुकड़ा इसे चलाने के बिना क्या करता है। तो यह बताने में असंभव है कि कोड के दो बिट्स दोनों संभावित इनपुट पर, दोनों को चलाने के बराबर हैं या नहीं।

यह कम से कम खराब, कम्प्यूटेशनल रूप से बोल रहा है, क्योंकि समस्या निवारण समस्या और संभवतः बदतर है।

रोकथाम की समस्या उतनी ही अजीब है जितनी है, इसलिए यहां सामान्य मामला जवाब निश्चित रूप से नहीं है (न केवल क्लोजर के लिए बल्कि प्रत्येक प्रोग्रामिंग भाषा के लिए)।

0

मैं दूसरों द्वारा उत्कृष्ट उत्तरों में नहीं जोड़ सकता, लेकिन एक और दृष्टिकोण पेश करना चाहता हूं जिसने मेरी मदद की। यदि आप उदा। यह परीक्षण करना कि फ़ंक्शन ऑब्जेक्ट की तुलना करने के बजाय, आपके फ़ंक्शन से सही फ़ंक्शन वापस किया गया है, आप केवल 'symbol के रूप में फ़ंक्शन को वापस करने के साथ दूर हो सकते हैं।

मुझे पता है कि शायद यह लेखक नहीं है, लेकिन सरल मामलों के लिए यह संभवतः ऐसा नहीं हो सकता है।