haskell - ऑनल - ट्रांसलेट वर्ड्स




आश्रित प्रकार साबित कर सकते हैं कि आपका कोड एक विनिर्देश के लिए सही है। लेकिन आप कैसे साबित करते हैं कि विनिर्देश सही है? (5)

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

औपचारिक तरीकों का मूल्य दो गुना है:

  1. आपको यह नहीं पता चल रहा है कि आपका प्रोग्राम सही है या नहीं, जब तक आप नहीं जानते कि यह वास्तव में कौन सी संपत्तियों को संतुष्ट करता है। इससे पहले कि आप जानते हों कि आपकी तरह की दिनचर्या "सही" है, तो आपको पहले यह जानना होगा कि वास्तव में यह क्या करता है। इसे खोजने के लिए कोई भी प्रक्रिया एक औपचारिक विधि (यहां तक ​​कि इकाई परीक्षण!) होने जा रही है, इसलिए जो लोग "औपचारिक तरीकों" को अस्वीकार करते हैं, वे वास्तव में उपलब्ध विधियों के एक छोटे से सबसेट में खुद को सीमित कर रहे हैं।

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

आश्रित प्रकारों को प्रायः एक ऐसे तरीके के रूप में विज्ञापित किया जाता है ताकि आप यह सुनिश्चित कर सकें कि एक कार्यक्रम एक विनिर्देश के लिए सही है। इसलिए, उदाहरण के लिए, आपको एक कोड लिखने के लिए कहा जाता है जो एक सूची टाइप करता है - आप यह साबित करने में सक्षम हैं कि कोड एक प्रकार के रूप में "सॉर्ट" की धारणा को एन्कोड करके सही है, और एक फ़ंक्शन लिखना जैसे List a -> SortedList a । लेकिन आप कैसे साबित करते हैं कि विनिर्देश, SortedList , सही है? क्या यह मामला नहीं होगा कि, आपके विनिर्देश जितना अधिक जटिल होगा, उतना ही अधिक होगा कि उस विनिर्देश का आपका एन्कोडिंग एक प्रकार के रूप में गलत है?


एक बात औपचारिक विधियां कर सकती हैं जो मुझे नहीं लगता कि दूसरों ने छू लिया है, मदद सरल चीजों को अधिक जटिल लोगों से जोड़ती है। आप निश्चित रूप से यह नहीं जान सकते कि कैसे Set डेटा संरचना का व्यवहार करना चाहिए, लेकिन यदि आप क्रमबद्ध सूचियों के आधार पर एक साधारण संस्करण लिख सकते हैं, तो आप साबित कर सकते हैं कि संतुलित खोज पेड़ के आधार पर आपका फैंसी संस्करण सही तरीके से संबंधित है toList फ़ंक्शन। यही है, आप संतुलित खोज पेड़ों में क्रमबद्ध सूचियों में अपने आत्मविश्वास को स्थानांतरित करने के लिए औपचारिक तरीकों का उपयोग कर सकते हैं।


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


मुझे लगता है कि यह चारों ओर एक और तरीका है: एक अच्छी तरह से टाइप किया गया कार्यक्रम बकवास साबित नहीं कर सकता (माना जाता है कि प्रणाली स्थिर है), जबकि विनिर्देश असंगत या मूर्खतापूर्ण हो सकते हैं। तो यह नहीं है कि "यह सुनिश्चित करने के लिए कि कोड का यह टुकड़ा मेरे प्लैटोनिक विचारों को प्रतिबिंबित करता है?", बल्कि "यह सुनिश्चित करने के लिए कि मेरे विचार अर्थपूर्ण रूप से शुद्ध वाक्य रचना नियमों के एक अच्छी तरह से स्थापित विमान पर प्रोजेक्ट करते हैं?"। यह सुनिश्चित करने के लिए कि आप जिस चिड़िया को देखते हैं वह एक मॉकिंगबर्ड है [मॉकिंगबर्डनेस की कुछ आपूर्ति की गई धारणा के लिए]? खैर, पक्षियों का अध्ययन करें और आपको सही होने की संभावना बढ़ाएं। लेकिन always humans साथ, आप 100% सुनिश्चित can't हो can't

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

तो यह नहीं है "क्या यह वाक्यविन्यास मेरे बहुत सटीक अर्थशास्त्र को दर्शाता है?", लेकिन "क्या मैं अपने कच्चे अर्थशास्त्र को इस दृढ़ता से संरचित वाक्यविन्यास से जोड़ सकता हूं?"। कार्यक्रम उचित भौतिक वस्तुएं हैं, जबकि विचार बोझिल अनुमान हैं, जो केवल सम्मेलन द्वारा उचित भौतिक वस्तुएं बन सकते हैं। इसलिए हम सम्मेलनों का उपयोग करके कुछ आधार बनाते हैं, और फिर हम इसे भरोसा करते हैं, क्योंकि उन सभी की तुलना में आपके सभी विचारों के एक छोटे से सबसेट पर भरोसा करना ज्यादा समझदार है।


यह स्थैतिक, प्रकार-प्रणाली संस्करण है, आप कैसे कहते हैं कि आपके परीक्षण सही हैं?

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

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

लेकिन यह स्पष्ट नहीं हो सकता है कि कुछ औपचारिकता कैसे करें, जिसका प्रभाव यह है कि या तो आप अपने विचारों को औपचारिकता में अनुवाद करने में गलती कर सकते हैं - आपको लगता है कि आप एक चीज साबित कर सकते हैं , जब वास्तव में आप एक और साबित होते हैं - या आप स्वयं को प्रकार कर सकते हैं एक विचार औपचारिक बनाने के लिए सिद्धांत अनुसंधान।





type-theory