हिंडले-मिलनर टाइप सिस्टम: Difference between revisions

From Vigyanwiki
Line 1: Line 1:
{{Short description|Type system used in computer programming and mathematics}}
{{Short description|Type system used in computer programming and mathematics}}
'''हिंडले-मिलनर (एचएम) टाइप प्रणाली''' [[पैरामीट्रिक बहुरूपता|प्राचलिक बहुरूपता]] के साथ [[लैम्ब्डा कैलकुलस|लैम्ब्डा कलन]] के लिए चिरसम्मत प्रकार की प्रणाली है। इसे '''दमास-मिलनर''' या '''दमास-हिंडले-मिलनर''' के नाम से भी जाना जाता है। इसका वर्णन सबसे पहले जे. रोजर हिंडले ने किया था<ref>{{cite journal | author-link = J. Roger Hindley | first = J. Roger | last = Hindley | date = 1969 | title = संयोजन तर्क में किसी वस्तु की प्रमुख प्रकार-योजना| journal = Transactions of the American Mathematical Society | volume = 146 | pages = 29–60 | jstor = 1995158 | doi=10.2307/1995158}}</ref> और बाद में [[रॉबिन मिलनर]] द्वारा पुनः खोजा गया था।<ref name="Milner">{{cite journal | author-link = Robin Milner | last = Milner | first = Robin | date = 1978 | title = प्रोग्रामिंग में टाइप पालीमॉर्फिज़्म का एक सिद्धांत| journal = Journal of Computer and System Sciences | volume = 17 | issue = 3 | pages = 348–374 | citeseerx = 10.1.1.67.5276 | doi=10.1016/0022-0000(78)90014-4| s2cid = 388583 }}</ref> लुइस दामास ने अपनी पीएचडी थीसिस में विधि का सीमित औपचारिक विश्लेषण और प्रमाण दिया था।<ref>{{cite thesis | first = Luis | last = Damas | date = 1985 | title = प्रोग्रामिंग भाषाओं में असाइनमेंट टाइप करें| degree = PhD  | publisher = University of Edinburgh |id=CST-33-85 |hdl=1842/13555 }}</ref><ref name="Damas">{{cite conference | last1 = Damas | first1 = Luis | author-link2 = Robin Milner | last2 = Milner | first2 = Robin | date = 1982 | title = कार्यात्मक कार्यक्रमों के लिए प्रमुख प्रकार-योजनाएँ| conference = 9th Symposium on Principles of programming languages (POPL'82) | pages = 207–212 | publisher = ACM | url = http://web.cs.wpi.edu/~cs4536/c12/milner-damas_principal_types.pdf |isbn=978-0-89791-065-1 |doi=10.1145/582153.582176}}</ref>
'''हिंडले-मिलनर (एचएम) टाइप प्रणाली''' [[पैरामीट्रिक बहुरूपता|प्राचलिक बहुरूपता]] के साथ [[लैम्ब्डा कैलकुलस|लैम्ब्डा कलन]] के लिए चिरसम्मत टाइप की प्रणाली है। इसे '''दमास-मिलनर''' या '''दमास-हिंडले-मिलनर''' के नाम से भी जाना जाता है। इसका वर्णन सबसे पहले जे। रोजर हिंडले ने किया था<ref>{{cite journal | author-link = J. Roger Hindley | first = J. Roger | last = Hindley | date = 1969 | title = संयोजन तर्क में किसी वस्तु की प्रमुख प्रकार-योजना| journal = Transactions of the American Mathematical Society | volume = 146 | pages = 29–60 | jstor = 1995158 | doi=10.2307/1995158}}</ref> और बाद में [[रॉबिन मिलनर]] द्वारा पुनः खोजा गया था।<ref name="Milner">{{cite journal | author-link = Robin Milner | last = Milner | first = Robin | date = 1978 | title = प्रोग्रामिंग में टाइप पालीमॉर्फिज़्म का एक सिद्धांत| journal = Journal of Computer and System Sciences | volume = 17 | issue = 3 | pages = 348–374 | citeseerx = 10.1.1.67.5276 | doi=10.1016/0022-0000(78)90014-4| s2cid = 388583 }}</ref> लुइस दामास ने अपनी पीएचडी थीसिस में विधि का सीमित औपचारिक विश्लेषण और प्रमाण दिया था।<ref>{{cite thesis | first = Luis | last = Damas | date = 1985 | title = प्रोग्रामिंग भाषाओं में असाइनमेंट टाइप करें| degree = PhD  | publisher = University of Edinburgh |id=CST-33-85 |hdl=1842/13555 }}</ref><ref name="Damas">{{cite conference | last1 = Damas | first1 = Luis | author-link2 = Robin Milner | last2 = Milner | first2 = Robin | date = 1982 | title = कार्यात्मक कार्यक्रमों के लिए प्रमुख प्रकार-योजनाएँ| conference = 9th Symposium on Principles of programming languages (POPL'82) | pages = 207–212 | publisher = ACM | url = http://web.cs.wpi.edu/~cs4536/c12/milner-damas_principal_types.pdf |isbn=978-0-89791-065-1 |doi=10.1145/582153.582176}}</ref>


एचएम के अधिक उल्लेखनीय गुणों में इसकी [[पूर्णता (तर्क)]] और प्रोग्रामर द्वारा प्रदत्त प्रकार के टिप्पणी या अन्य संकेतों के बिना किसी दिए गए प्रोग्राम के [[प्रमुख प्रकार|मूल]] टाइप इन्फेरेंस लगाने की क्षमता है। कलन विधि डब्ल्यू व्यवहार में टाइप इन्फेरेंस विधि है और इसे बड़े कोड आधारों पर सफलतापूर्वक लागू किया गया है, हालांकि इसमें उच्च सैद्धांतिक अभिकलनात्मक जटिलता है।<ref group="note">Hindley–Milner type inference is [[DEXPTIME]]-complete. In fact, merely deciding whether an ML program is typeable (without having to infer a type) is itself [[DEXPTIME]]-complete. Non-linear behaviour does manifest itself, yet mostly on [[Pathological (mathematics)|pathological]] inputs. Thus the complexity theoretic proofs by {{harvtxt|Mairson|1990}} and {{harvtxt|Kfoury|Tiuryn|Urzyczyn|1990}} came as a surprise to the research community.</ref> एचएम का उपयोग अधिमानतः [[कार्यात्मक भाषा|अभिलक्षकी भाषा]]ओं के लिए किया जाता है। इसे सबसे पहले प्रोग्रामिंग भाषा [[एमएल (प्रोग्रामिंग भाषा)]] के टाइप प्रणाली के हिस्से के रूप में लागू किया गया था। तब से, एचएम को विभिन्न तरीकों विशेष रूप से [[हास्केल (प्रोग्रामिंग भाषा)]] जैसे [[प्रकार वर्ग]] की बाधाओं के साथ विस्तारित किया गया है।
एचएम के अधिक उल्लेखनीय गुणों में इसकी [[पूर्णता (तर्क)]] और प्रोग्रामर द्वारा प्रदत्त टाइप के टिप्पणी या अन्य संकेतों के बिना किसी दिए गए प्रोग्राम के [[प्रमुख प्रकार|मूल]] टाइप इन्फेरेंस लगाने की क्षमता है। कलन विधि डब्ल्यू व्यवहार में टाइप इन्फेरेंस विधि है और इसे बड़े कोड आधारों पर सफलतापूर्वक लागू किया गया है, हालांकि इसमें उच्च सैद्धांतिक अभिकलनात्मक जटिलता है।<ref group="note">Hindley–Milner type inference is [[DEXPTIME]]-complete. In fact, merely deciding whether an ML program is typeable (without having to infer a type) is itself [[DEXPTIME]]-complete. Non-linear behaviour does manifest itself, yet mostly on [[Pathological (mathematics)|pathological]] inputs. Thus the complexity theoretic proofs by {{harvtxt|Mairson|1990}} and {{harvtxt|Kfoury|Tiuryn|Urzyczyn|1990}} came as a surprise to the research community.</ref> एचएम का उपयोग अधिमानतः [[कार्यात्मक भाषा|अभिलक्षकी]] लैंग्वेज के लिए किया जाता है। इसे सबसे पहले प्रोग्रामिंग लैंग्वेज [[एमएल (प्रोग्रामिंग भाषा)|एमएल (प्रोग्रामिंग लैंग्वेज)]] के टाइप प्रणाली के हिस्से के रूप में लागू किया गया था। तब से, एचएम को विभिन्न तरीकों विशेष रूप से [[हास्केल (प्रोग्रामिंग भाषा)|हास्केल (प्रोग्रामिंग लैंग्वेज)]] जैसे [[प्रकार वर्ग|टाइप वर्ग]] की व्यवरोध के साथ विस्तारित किया गया है।


== परिचय ==
== परिचय ==
{{main|अनुमान प्रकार}}
{{main|अनुमान प्रकार}}


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


मूल सरल रूप से टाइप लैम्ब्डा कलन के लिए टाइप इन्फेरेंस कलन विधि है जिसे 1958 में [[हास्केल करी]] और [[रॉबर्ट फेयस]] द्वारा तैयार किया गया था। 1969 में, जे. रोजर हिंडले ने इस काम को आगे बढ़ाया और साबित किया कि उनका कलन विधि हमेशा सबसे सामान्य टाइप इन्फेरेंस लगाता है। 1978 में, रॉबिन मिलनर,<ref>{{Citation
मूल सरल रूप से टाइप लैम्ब्डा कलन के लिए टाइप इन्फेरेंस कलन विधि है जिसे 1958 में [[हास्केल करी]] और [[रॉबर्ट फेयस]] द्वारा तैयार किया गया था। 1969 में, जे। रोजर हिंडले ने इस काम को आगे बढ़ाया और साबित किया कि उनका कलन विधि हमेशा सबसे सामान्य टाइप इन्फेरेंस लगाता है। 1978 में, रॉबिन मिलनर,<ref>{{Citation
  |last1= Milner |first1= Robin
  |last1= Milner |first1= Robin
  |title= A Theory of Type Polymorphism in Programming
  |title= A Theory of Type Polymorphism in Programming
Line 24: Line 24:
{{main|प्राचलिक बहुरूपता}}
{{main|प्राचलिक बहुरूपता}}


सरलता से टाइप किए गए लैम्ब्डा कलन में, प्रकार {{mvar|T}} या तो परमाणु प्रकार के स्थिरांक हैं या फंक्शन प्रकार के रूप हैं <math>T \rightarrow T</math>,  ऐसे प्रकार एकरूप होते हैं। विशिष्ट उदाहरण अंकगणितीय मानों में प्रयुक्त प्रकार हैं:
सरलता से टाइप किए गए लैम्ब्डा कलन में, टाइप {{mvar|T}} या तो परमाणु टाइप के स्थिरांक हैं या फंक्शन टाइप के रूप हैं <math>T \rightarrow T</math>,  ऐसे टाइप एकरूप होते हैं। विशिष्ट उदाहरण अंकगणितीय मानों में प्रयुक्त टाइप हैं:


   3      : Number
   3      : Number
Line 30: Line 30:
   add    : Number -> Number -> Number
   add    : Number -> Number -> Number


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


:id ≡ λ x .x
:id ≡ λ x ।x


जो जिस भी मान पर लागू होता है, उसे वापस लौटा देता है। अल्प तुच्छ उदाहरणों में [[सूची (कंप्यूटर विज्ञान)]] जैसे प्राचलिक प्रकार शामिल हैं।
जो जिस भी मान पर लागू होता है, उसे वापस लौटा देता है। अल्प तुच्छ उदाहरणों में [[सूची (कंप्यूटर विज्ञान)]] जैसे प्राचलिक टाइप शामिल हैं।


जबकि सामान्य तौर पर बहुरूपता का अर्थ है कि ऑपरेशन एक से अधिक प्रकार के मानnको स्वीकार करते हैं, यहां प्रयुक्त बहुरूपता प्राचलिक है। साहित्य में प्रकार की योजनाओं का उल्लेख भी मिलता है, जो बहुरूपता की प्राचलिक प्रकृति पर जोर देता है। इसके अतिरिक्त, स्थिरांक को (मात्राबद्ध) प्रकार के चर के साथ टाइप किया जा सकता है। जैसे:
जबकि सामान्य तौर पर बहुरूपता का अर्थ है कि ऑपरेशन एक से अधिक टाइप के मानnको स्वीकार करते हैं, यहां प्रयुक्त बहुरूपता प्राचलिक है। साहित्य में टाइप की योजनाओं का उल्लेख भी मिलता है, जो बहुरूपता की प्राचलिक प्रकृति पर जोर देता है। इसके अतिरिक्त, स्थिरांक को (मात्राबद्ध) टाइप के चर के साथ टाइप किया जा सकता है। जैसे:


   cons : forall a . a -> List a -> List a
   cons : forall a a -> List a -> List a
   nil  : forall a . List a
   nil  : forall a List a
   id  : forall a . a -> a
   id  : forall a a -> a


बहुरूपी प्रकार अपने चरों के लगातार प्रतिस्थापन से एकरूप बन सकते हैं। एकरूप उदाहरणों के उदाहरण हैं:
बहुरूपी टाइप अपने चरों के लगातार प्रतिस्थापन से एकरूप बन सकते हैं। एकरूप उदाहरणों के उदाहरण हैं:


  id'  : String -> String
  id'  : String -> String
  nil' : List Number
  nil' : List Number


अधिक आम तौर पर, प्रकार बहुरूपी होते हैं जब उनमें प्रकार चर होते हैं, जबकि उनके बिना प्रकार एकरूप होते हैं।
अधिक आम तौर पर, टाइप बहुरूपी होते हैं जब उनमें टाइप चर होते हैं, जबकि उनके बिना टाइप एकरूप होते हैं।


उदाहरण के लिए [[पास्कल (प्रोग्रामिंग भाषा)]] (1970) या [[सी (प्रोग्रामिंग भाषा)]] (1972) में प्रयुक्त प्रकार प्रणालियों के विपरीत, जो केवल एकरूप टाइप का समर्थन करते हैं, एचएम को प्राचलिक बहुरूपता पर जोर देने के साथ डिजाइन किया गया है। उल्लिखित भाषाओं के उत्तराधिकारी, जैसे [[C++]] (1985), विभिन्न प्रकार के बहुरूपता पर ध्यान केंद्रित करते हैं, अर्थात् बहुरूपता (कंप्यूटर विज्ञान) [[ ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग |ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] और ओवरलोडिंग के संबंध में उपटाइपिंग हैं। जबकि उपटाइपिंग एचएम के साथ असंगत है, हास्केल के एचएम-आधारित टाइप प्रणाली में व्यवस्थित ओवरलोडिंग का एक प्रकार उपलब्ध है।
उदाहरण के लिए [[पास्कल (प्रोग्रामिंग भाषा)|पास्कल (प्रोग्रामिंग लैंग्वेज)]] (1970) या [[सी (प्रोग्रामिंग भाषा)|सी (प्रोग्रामिंग लैंग्वेज)]] (1972) में प्रयुक्त टाइप प्रणालियों के विपरीत, जो केवल एकरूप टाइप का समर्थन करते हैं, एचएम को प्राचलिक बहुरूपता पर जोर देने के साथ डिजाइन किया गया है। उल्लिखित लैंग्वेज के उत्तराधिकारी, जैसे [[C++]] (1985), विभिन्न टाइप के बहुरूपता पर ध्यान केंद्रित करते हैं, अर्थात् बहुरूपता (कंप्यूटर विज्ञान) [[ ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग |ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] और ओवरलोडिंग के संबंध में उपटाइपिंग हैं। जबकि उपटाइपिंग एचएम के साथ असंगत है, हास्केल के एचएम-आधारित टाइप प्रणाली में व्यवस्थित ओवरलोडिंग का एक टाइप उपलब्ध है।


=== लेट-पॉलीमोर्फिज्म ===
=== लेट-पॉलीमोर्फिज्म ===


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


   (λ id . ... (id 3) ... (id "text") ... ) (λ x . x)
   (λ id ।।। (id 3) ।।। (id "text") ।।। ) (λ x x)


दुर्भाग्य से, [[सिस्टम एफ|बहुरूपी लैम्ब्डा कैलकुलस]] में टाइप इन्फेरेंस निर्णय योग्य नहीं है।<ref>{{cite book |first=J.B. |last=Wells |chapter=Typability and type checking in the second-order lambda-calculus are equivalent and undecidable |chapter-url=http://www.macs.hw.ac.uk/~jbw/papers/Wells:Typability-and-Type-Checking-in-the-Second-Order-Lambda-Calculus-Are-Equivalent-and-Undecidable:LICS-1994.ps.gz |title=Proceedings of the 9th Annual IEEE Symposium on Logic in Computer Science (LICS) |year=1994 |isbn=0-8186-6310-3 |pages=176–185 |doi=10.1109/LICS.1994.316068|s2cid=15078292 }}
दुर्भाग्य से, [[सिस्टम एफ|बहुरूपी लैम्ब्डा कैलकुलस]] में टाइप इन्फेरेंस निर्णय योग्य नहीं है।<ref>{{cite book |first=J.B. |last=Wells |chapter=Typability and type checking in the second-order lambda-calculus are equivalent and undecidable |chapter-url=http://www.macs.hw.ac.uk/~jbw/papers/Wells:Typability-and-Type-Checking-in-the-Second-Order-Lambda-Calculus-Are-Equivalent-and-Undecidable:LICS-1994.ps.gz |title=Proceedings of the 9th Annual IEEE Symposium on Logic in Computer Science (LICS) |year=1994 |isbn=0-8186-6310-3 |pages=176–185 |doi=10.1109/LICS.1994.316068|s2cid=15078292 }}
</ref> इसके बजाय, एचएम फॉर्म का लेट-पॉलीमोर्फिज्म प्रदान करता है
</ref> इसके बजाय, एचएम फॉर्म का लेट-पॉलीमोर्फिज्म प्रदान करता है


   '''let''' id = λ x . x
   '''let''' id = λ x x
   '''in''' ... (id 3) ... (id "text") ...
   '''in''' ।।। (id 3) ।।। (id "text") ।।।


अभिव्यक्ति सिंटैक्स के विस्तार में सीमित तंत्र को प्रतिबंधित करना है। केवल लेट निर्माण में सीमित मान तात्कालिकता के अधीन हैं, यानी बहुरूपी हैं, जबकि लैम्ब्डा-अमूर्त में मापदंडों को एकरूप माना जाता है।
अभिव्यक्ति सिंटैक्स के विस्तार में सीमित तंत्र को प्रतिबंधित करना है। केवल लेट निर्माण में सीमित मान तात्कालिकता के अधीन हैं, यानी बहुरूपी हैं, जबकि लैम्ब्डा-अमूर्त में मापदंडों को एकरूप माना जाता है।
Line 67: Line 67:
== सिंहावलोकन ==
== सिंहावलोकन ==


इस लेख का शेष भाग इस प्रकार है:
इस लेख का शेष भाग इस टाइप है:


* एचएम टाइप प्रणाली परिभाषित की गई है। यह निगमन प्रणाली का वर्णन करके किया जाता है जो सटीक बनाता है कि कौन से अभिव्यक्ति किस प्रकार के हैं, यदि कोई हो।
* एचएम टाइप प्रणाली परिभाषित की गई है। यह निगमन प्रणाली का वर्णन करके किया जाता है जो सटीक बनाता है कि कौन से अभिव्यक्ति किस टाइप के हैं, यदि कोई हो।
* वहां से, यह टाइप इन्फेरेंस विधि के कार्यान्वयन की दिशा में काम करता है। उपरोक्त निगमनात्मक प्रणाली का वाक्य-विन्यास-संचालित संस्करण पेश करने के बाद, यह एक कुशल कार्यान्वयन (कलन विधि जे) का रेखाचित्र बनाता है, जो पाठक के धातु संबंधी अंतर्ज्ञान को आकर्षित करता है।
* वहां से, यह टाइप इन्फेरेंस विधि के कार्यान्वयन की दिशा में काम करता है। उपरोक्त निगमनात्मक प्रणाली का वाक्य-विन्यास-संचालित संस्करण पेश करने के बाद, यह एक कुशल कार्यान्वयन (कलन विधि जे) का रेखाचित्र बनाता है, जो पाठक के धातु संबंधी अंतर्ज्ञान को आकर्षित करता है।
* क्योंकि यह विवृत रहता है कलन विधि जे वास्तव में प्रारंभिक निगमन प्रणाली का एहसास करता है, अल्प कुशल कार्यान्वयन (कलन विधि डब्ल्यू) पेश किया जाता है और प्रमाण में इसके उपयोग का संकेत दिया जाता है।
* क्योंकि यह विवृत रहता है कलन विधि जे वास्तव में प्रारंभिक निगमन प्रणाली का एहसास करता है, अल्प कुशल कार्यान्वयन (कलन विधि डब्ल्यू) पेश किया जाता है और प्रमाण में इसके उपयोग का संकेत दिया जाता है।
Line 78: Line 78:
== हिंडले-मिलनर टाइप प्रणाली ==
== हिंडले-मिलनर टाइप प्रणाली ==


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


=== सिंटेक्स ===
=== सिंटेक्स ===
Line 140: Line 140:
टाइप को वाक्यात्मक रूप से दो समूहों, मोनोटाइप्स और पॉलीटाइप्स में विभाजित किया गया है।<ref group="note">Polytypes are called "type schemes" in the original article.</ref>
टाइप को वाक्यात्मक रूप से दो समूहों, मोनोटाइप्स और पॉलीटाइप्स में विभाजित किया गया है।<ref group="note">Polytypes are called "type schemes" in the original article.</ref>
==== मोनोटाइप्स ====
==== मोनोटाइप्स ====
मोनोटाइप हमेशा एक विशेष प्रकार को निर्दिष्ट करते हैं। मोनोटाइप्स <math>\tau</math> वाक्यात्मक रूप से टर्म (तर्क) के रूप में दर्शाया जाता है।
मोनोटाइप हमेशा एक विशेष टाइप को निर्दिष्ट करते हैं। मोनोटाइप्स <math>\tau</math> वाक्यात्मक रूप से टर्म (तर्क) के रूप में दर्शाया जाता है।


मोनोटाइप के उदाहरणों में प्रकार स्थिरांक शामिल हैं <math>\mathtt{int}</math> या <math>\mathtt{string}</math>, और प्राचलिक प्रकार जैसे <math>\mathtt{Map\ (Set\ string)\ int}</math>. बाद वाले प्रकार प्रकार के फंक्शन के ''अनुप्रयोगों'' के उदाहरण हैं, उदाहरण के लिए, सेट से<math> \{ \mathtt{Map^2,\ Set^1,\ string^0,\ int^0},\ \rightarrow^2 \} </math>, जहां सुपरस्क्रिप्ट प्रकार के मापदंडों की संख्या को इंगित करता है। प्रकार के फंक्शन का पूरा सेट <math>C</math> एचएम में यादृच्छिक है,<ref group="note">The parametric types <math>C\ \tau\dots\tau</math> were not present in the original paper on HM and are not needed to present the method. None of the inference rules below will take care or even note them. The same holds for the non-parametric "primitive types" in said paper. All the machinery for polymorphic type inference can be defined without them. They have been included here for sake of examples but also because the nature of HM is all about parametric types. This comes from the function type <math>\tau\rightarrow\tau</math>, hard-wired in the inference rules, below, which already has two parameters and has been presented here as only a special case.</ref> सिवाय इसके कि इसमें न्यूनतम <math>\rightarrow^2</math>, फंक्शन का प्रकार शामिल होना चाहिए। सुविधा के लिए इसे अक्सर मध्यप्रत्यय संकेतन में लिखा जाता है। उदाहरण के लिए, पूर्णांकों को स्ट्रिंग्स से मैप करने वाले फ़ंक्शन का प्रकार <math>\mathtt{int}\rightarrow \mathtt{string}</math>  होता है, फिर से, कोष्ठक का उपयोग किसी प्रकार की अभिव्यक्ति को स्पष्ट करने के लिए किया जा सकता है। अनुप्रयोग मध्यप्रत्यय एरो की तुलना में अधिक मजबूती से सीमित होता है, जो राइट-सीमित है।
मोनोटाइप के उदाहरणों में टाइप स्थिरांक शामिल हैं <math>\mathtt{int}</math> या <math>\mathtt{string}</math>, और प्राचलिक टाइप जैसे <math>\mathtt{Map\ (Set\ string)\ int}</math>बाद वाले टाइप टाइप के फंक्शन के ''अनुप्रयोगों'' के उदाहरण हैं, उदाहरण के लिए, सेट से<math> \{ \mathtt{Map^2,\ Set^1,\ string^0,\ int^0},\ \rightarrow^2 \} </math>, जहां सुपरस्क्रिप्ट टाइप के मापदंडों की संख्या को इंगित करता है। टाइप के फंक्शन का पूरा सेट <math>C</math> एचएम में यादृच्छिक है,<ref group="note">The parametric types <math>C\ \tau\dots\tau</math> were not present in the original paper on HM and are not needed to present the method. None of the inference rules below will take care or even note them. The same holds for the non-parametric "primitive types" in said paper. All the machinery for polymorphic type inference can be defined without them. They have been included here for sake of examples but also because the nature of HM is all about parametric types. This comes from the function type <math>\tau\rightarrow\tau</math>, hard-wired in the inference rules, below, which already has two parameters and has been presented here as only a special case.</ref> सिवाय इसके कि इसमें न्यूनतम <math>\rightarrow^2</math>, फंक्शन का टाइप शामिल होना चाहिए। सुविधा के लिए इसे अक्सर मध्यप्रत्यय संकेतन में लिखा जाता है। उदाहरण के लिए, पूर्णांकों को स्ट्रिंग्स से मैप करने वाले फ़ंक्शन का टाइप <math>\mathtt{int}\rightarrow \mathtt{string}</math>  होता है, फिर से, कोष्ठक का उपयोग किसी टाइप की अभिव्यक्ति को स्पष्ट करने के लिए किया जा सकता है। अनुप्रयोग मध्यप्रत्यय एरो की तुलना में अधिक मजबूती से सीमित होता है, जो राइट-सीमित है।


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


दो मोनोटाइप समान हैं यदि उनके अभिव्यक्ति समान हैं।
दो मोनोटाइप समान हैं यदि उनके अभिव्यक्ति समान हैं।
Line 150: Line 150:
==== पॉलीटाइप्स (बहुप्रकार) ====
==== पॉलीटाइप्स (बहुप्रकार) ====


''पॉलीटाइप्स (या टाइप स्कीम)'' वे प्रकार हैं जिनमें सभी परिमाणकों के लिए शून्य या अधिक से सीमित चर होते हैं, उदाहरण के लिए <math>\forall\alpha.\alpha\rightarrow\alpha</math>.
''पॉलीटाइप्स (या टाइप स्कीम)'' वे टाइप हैं जिनमें सभी परिमाणकों के लिए शून्य या अधिक से सीमित चर होते हैं, उदाहरण के लिए <math>\forall\alpha.\alpha\rightarrow\alpha</math>


पॉलीटाइप वाला फ़ंक्शन <math>\forall\alpha.\alpha\rightarrow\alpha</math> एक ही प्रकार के किसी भी मान को स्वयं में मैप कर सकता है, और तत्समक फ़ंक्शन इस प्रकार के लिए मान है।
पॉलीटाइप वाला फ़ंक्शन <math>\forall\alpha.\alpha\rightarrow\alpha</math> एक ही टाइप के किसी भी मान को स्वयं में मैप कर सकता है, और तत्समक फ़ंक्शन इस टाइप के लिए मान है।


एक अन्य उदाहरण के रूप में, <math>\forall\alpha.(\mathtt{Set}\ \alpha)\rightarrow \mathtt{int}</math> फ़ंक्शन का प्रकार है जो सभी परिमित सेटों को पूर्णांकों में मैप करता है। फ़ंक्शन जो किसी सेट की [[प्रमुखता]] लौटाता है वह इस प्रकार का मान होगा।
एक अन्य उदाहरण के रूप में, <math>\forall\alpha.(\mathtt{Set}\ \alpha)\rightarrow \mathtt{int}</math> फ़ंक्शन का टाइप है जो सभी परिमित सेटों को पूर्णांकों में मैप करता है। फ़ंक्शन जो किसी सेट की [[प्रमुखता]] लौटाता है वह इस टाइप का मान होगा।


परिमाण केवल शीर्ष स्तर के दिखाई दे सकते हैं। उदाहरण के लिए, प्रकार <math>\forall\alpha.\alpha\rightarrow\forall\alpha.\alpha</math> टाइप के सिंटैक्स द्वारा बाहर रखा गया है। इसके अलावा बहुप्रकारों में मोनोटाइप भी शामिल होते हैं, एक प्रकार का सामान्य रूप होता है <math>\forall\alpha_1\dots\forall\alpha_n.\tau, n\geq0</math>, जहाँ <math>\tau</math> मोनोटाइप है.
परिमाण केवल शीर्ष स्तर के दिखाई दे सकते हैं। उदाहरण के लिए, टाइप <math>\forall\alpha.\alpha\rightarrow\forall\alpha.\alpha</math> टाइप के सिंटैक्स द्वारा बाहर रखा गया है। इसके अलावा पॉलीटाइप्स में मोनोटाइप भी शामिल होते हैं, एक टाइप का सामान्य रूप होता है <math>\forall\alpha_1\dots\forall\alpha_n.\tau, n\geq0</math>, जहाँ <math>\tau</math> मोनोटाइप है।


बहुप्रकारों की समानता परिमाणीकरण को पुन: व्यवस्थित करने और परिमाणित चरों (<math>\alpha</math>-रूपांतरण) का नाम बदलने तक है इसके अलावा, मोनोटाइप में नहीं आने वाले परिमाणित चर को हटाया जा सकता है।
पॉलीटाइप्स की समानता परिमाणीकरण को पुन: व्यवस्थित करने और परिमाणित चरों (<math>\alpha</math>-रूपांतरण) का नाम बदलने तक है इसके अलावा, मोनोटाइप में नहीं आने वाले परिमाणित चर को हटाया जा सकता है।


==== प्रसंग और टाइपिंग ====
==== प्रसंग और टाइपिंग ====


अभी भी असंबद्ध भागों (सिंटेक्स अभिव्यक्ति और प्रकार) को सार्थक रूप से एक साथ लाने के लिए तीसरे भाग की आवश्यकता है: संदर्भ वाक्यात्मक रूप से, संदर्भ युग्म की सूची है <math>x:\sigma</math>, जिसे [[असाइनमेंट (गणितीय तर्क)]], धारणा या [[नाम बंधन|सीमित]] कहा जाता है, प्रत्येक युग्म उस मान चर <math>x_i</math>को बताती है प्रकार है <math>\sigma_i.</math> तीनों भाग मिलकर फॉर्म का ''टाइपिंग निर्णय'' देते हैं <math>\Gamma\ \vdash\ e:\sigma</math>, यह बताते हुए कि धारणाओं के तहत <math>\Gamma</math>, अभिव्यक्ति <math>e</math>, <math>\sigma</math> प्रकार है।
अभी भी असंबद्ध भागों (सिंटेक्स अभिव्यक्ति और टाइप) को सार्थक रूप से एक साथ लाने के लिए तीसरे भाग की आवश्यकता है: संदर्भ वाक्यात्मक रूप से, संदर्भ युग्म की सूची है <math>x:\sigma</math>, जिसे [[असाइनमेंट (गणितीय तर्क)]], धारणा या [[नाम बंधन|सीमित]] कहा जाता है, प्रत्येक युग्म उस मान चर <math>x_i</math>को बताती है टाइप है <math>\sigma_i.</math> तीनों भाग मिलकर फॉर्म का ''टाइपिंग निर्णय'' देते हैं <math>\Gamma\ \vdash\ e:\sigma</math>, यह बताते हुए कि धारणाओं के तहत <math>\Gamma</math>, अभिव्यक्ति <math>e</math>, <math>\sigma</math> टाइप है।


==== मुक्त प्रकार के चर ====
==== मुक्त टाइप के चर ====


प्रकार में <math>\forall\alpha_1\dots\forall\alpha_n.\tau</math>, मोनोटाइप में <math>\tau</math> प्रतीक <math>\forall</math> प्रकार चर <math>\alpha_i</math> सीमित वाला परिमाण है। चर <math>\alpha_i</math> परिमाणित कहलाते हैं और परिमाणित प्रकार के चर <math>\tau</math> की कोई भी घटना को सीमित कहा जाता है और सभी अनबाउंड प्रकार के चर <math>\tau</math> मुक्त कहलाते हैं। परिमाणीकरण के अतिरिक्त <math>\forall</math> बहुप्रकारों में, प्रकार चर को संदर्भ में घटित होने से भी बाध्य किया जा सकता है, लेकिन दाईं ओर विपरीत प्रभाव के साथ <math>\vdash</math> किया जा सकता है। ऐसे चर तब वहां प्रकार स्थिरांक की तरह व्यवहार करते हैं। अंत में, एक प्रकार का चर वैध रूप से टाइपिंग में अनबाउंड हो सकता है, जिस स्थिति में वे अंतर्निहित रूप से सभी-मात्राबद्ध होते हैं।
टाइप में <math>\forall\alpha_1\dots\forall\alpha_n.\tau</math>, मोनोटाइप में <math>\tau</math> प्रतीक <math>\forall</math> टाइप चर <math>\alpha_i</math> सीमित वाला परिमाण है। चर <math>\alpha_i</math> परिमाणित कहलाते हैं और परिमाणित टाइप के चर <math>\tau</math> की कोई भी घटना को सीमित कहा जाता है और सभी अनबाउंड टाइप के चर <math>\tau</math> मुक्त कहलाते हैं। परिमाणीकरण के अतिरिक्त <math>\forall</math> पॉलीटाइप्स में, टाइप चर को संदर्भ में घटित होने से भी बाध्य किया जा सकता है, लेकिन दाईं ओर विपरीत प्रभाव के साथ <math>\vdash</math> किया जा सकता है। ऐसे चर तब वहां टाइप स्थिरांक की तरह व्यवहार करते हैं। अंत में, एक टाइप का चर वैध रूप से टाइपिंग में अनबाउंड हो सकता है, जिस स्थिति में वे अंतर्निहित रूप से सभी-मात्राबद्ध होते हैं।


प्रोग्रामिंग भाषाओं में सीमित और अनबाउंड दोनों प्रकार के चर की उपस्थिति थोड़ी असामान्य है। अक्सर, सभी प्रकार के चरों को अंतर्निहित रूप से सर्व-मात्राबद्ध माना जाता है। उदाहरण के लिए, [[प्रोलॉग]] में मुक्त चर वाले खंड नहीं हैं। इसी तरह हास्केल में, <ref group="note">Haskell provides the ScopedTypeVariables language extension allowing to bring all-quantified type variables into scope.</ref> जहां सभी प्रकार के चर अंतर्निहित रूप से मात्राबद्ध होते हैं, यानी हास्केल प्रकार <code>a -> a</code> यहाँ <math>\forall\alpha.\alpha\rightarrow\alpha</math> हैं। दाहिने हाथ की ओर <math>\sigma</math> असाइनमेंट का बंधनकारी प्रभाव संबंधित और बहुत ही असामान्य भी है।
प्रोग्रामिंग लैंग्वेज में सीमित और अनबाउंड दोनों टाइप के चर की उपस्थिति थोड़ी असामान्य है। अक्सर, सभी टाइप के चरों को अंतर्निहित रूप से सर्व-मात्राबद्ध माना जाता है। उदाहरण के लिए, [[प्रोलॉग]] में मुक्त चर वाले खंड नहीं हैं। इसी तरह हास्केल में, <ref group="note">Haskell provides the ScopedTypeVariables language extension allowing to bring all-quantified type variables into scope.</ref> जहां सभी टाइप के चर अंतर्निहित रूप से मात्राबद्ध होते हैं, यानी हास्केल टाइप <code>a -> a</code> यहाँ <math>\forall\alpha.\alpha\rightarrow\alpha</math> हैं। दाहिने हाथ की ओर <math>\sigma</math> असाइनमेंट का बंधनकारी प्रभाव संबंधित और बहुत ही असामान्य भी है।


आमतौर पर, बाध्य और अनबाउंड दोनों प्रकार के चर का मिश्रण एक अभिव्यक्ति में मुक्त चर के उपयोग से उत्पन्न होता है। स्थिरांक फंक्शन K = <math>\lambda x.\lambda y. x</math> उदाहरण प्रदान करता है, इसका मोनोटाइप <math>\alpha\rightarrow\beta\rightarrow\alpha</math> है कोई व्यक्ति बहुरूपता को बलपूर्वक लागू कर सकता है <math>\mathbf{let}\ k = \lambda x. (\mathbf{let}\ f = \lambda y.x\ \mathbf{in}\ f)\ \mathbf{in}\ k</math>, यहाँ, <math>f</math>, <math>\forall \gamma.\gamma\rightarrow\alpha</math> प्रकार है मुक्त मोनोटाइप चर <math>\alpha</math> चर <math>x</math> के प्रकार से उत्पन्न होता है आसपास के दायरे में बंधा हुआ <math>k</math> <math>\forall\alpha\forall\beta.\alpha\rightarrow\beta\rightarrow\alpha</math> प्रकार है, कोई मुक्त प्रकार चर <math>\alpha</math>, <math>f</math> से सीमित रहें <math>\forall\alpha</math> के प्रकार में <math>k</math> की कल्पना कर सकत है। लेकिन ऐसी गुंजाइश एचएम में व्यक्त नहीं की जा सकती। बल्कि संदर्भ से सीमित का एहसास होता है।
आमतौर पर, बाध्य और अनबाउंड दोनों टाइप के चर का मिश्रण एक अभिव्यक्ति में मुक्त चर के उपयोग से उत्पन्न होता है। स्थिरांक फंक्शन K = <math>\lambda x.\lambda y. x</math> उदाहरण प्रदान करता है, इसका मोनोटाइप <math>\alpha\rightarrow\beta\rightarrow\alpha</math> है कोई व्यक्ति बहुरूपता को बलपूर्वक लागू कर सकता है <math>\mathbf{let}\ k = \lambda x. (\mathbf{let}\ f = \lambda y.x\ \mathbf{in}\ f)\ \mathbf{in}\ k</math>, यहाँ, <math>f</math>, <math>\forall \gamma.\gamma\rightarrow\alpha</math> टाइप है मुक्त मोनोटाइप चर <math>\alpha</math> चर <math>x</math> के टाइप से उत्पन्न होता है आसपास के दायरे में बंधा हुआ <math>k</math> <math>\forall\alpha\forall\beta.\alpha\rightarrow\beta\rightarrow\alpha</math> टाइप है, कोई मुक्त टाइप चर <math>\alpha</math>, <math>f</math> से सीमित रहें <math>\forall\alpha</math> के टाइप में <math>k</math> की कल्पना कर सकत है। लेकिन ऐसी गुंजाइश एचएम में व्यक्त नहीं की जा सकती। बल्कि संदर्भ से सीमित का एहसास होता है।


=== टाइप ऑर्डर ===
=== टाइप ऑर्डर ===
{{main|एकीकरण (कंप्यूटर विज्ञान)#प्रतिस्थापन}}
{{main|एकीकरण (कंप्यूटर विज्ञान)#प्रतिस्थापन}}


बहुरूपता का अर्थ है कि एक ही अभिव्यक्ति के (संभवतः अनंत रूप से) कई प्रकार हो सकते हैं। लेकिन इस प्रकार की प्रणाली में, ये प्रकार पूरी तरह से असंबंधित नहीं हैं, बल्कि प्राचलिक बहुरूपता द्वारा व्यवस्थित हैं।
बहुरूपता का अर्थ है कि एक ही अभिव्यक्ति के (संभवतः अनंत रूप से) कई टाइप हो सकते हैं। लेकिन इस टाइप की प्रणाली में, ये टाइप पूरी तरह से असंबंधित नहीं हैं, बल्कि प्राचलिक बहुरूपता द्वारा व्यवस्थित हैं।


उदाहरण के तौर पर, तत्समक <math>\lambda x . x</math> हो सकता है <math>\forall
उदाहरण के तौर पर, तत्समक <math>\lambda x . x</math><math>\forall
\alpha . \alpha \rightarrow \alpha</math> इसके प्रकार के रूप में भी
\alpha . \alpha \rightarrow \alpha</math> इसके टाइप के रूप में भी<math>\texttt{string} \rightarrow \texttt{string}</math> या <math>\texttt{int}
<math>\texttt{string} \rightarrow \texttt{string}</math> या <math>\texttt{int}
\rightarrow \texttt{int}</math> और कई अन्य हो सकता है, लेकिन नहीं <math>\texttt{int}
\rightarrow \texttt{int}</math> और कई अन्य, लेकिन नहीं <math>\texttt{int}
\rightarrow \texttt{string}</math> हो सकता है, इस फ़ंक्शन के लिए सबसे सामान्य टाइप है <math>\forall \alpha . \alpha\rightarrow \alpha</math>, जब अन्य अधिक विशिष्ट हैं और उन्हें सामान्य से लगातार प्राप्त किया जा सकता है टाइप मापदण्ड के लिए किसी अन्य टाइप को प्रतिस्थापित करना, यानी परिमाणितचर <math>\alpha</math> है। प्रति-उदाहरण विफल हो जाता है क्योंकि प्रतिस्थापन सुसंगत नहीं है।
\rightarrow \texttt{string}</math>. इस फ़ंक्शन के लिए सबसे सामान्य प्रकार है
<math>\forall \alpha . \alpha\rightarrow \alpha</math>, जब
अन्य अधिक विशिष्ट हैं और उन्हें सामान्य से लगातार प्राप्त किया जा सकता है
प्रकार पैरामीटर के लिए किसी अन्य प्रकार को प्रतिस्थापित करना, यानी परिमाणित
चर <math>\alpha</math>. प्रति-उदाहरण विफल हो जाता है क्योंकि
प्रतिस्थापन सुसंगत नहीं है.


एकीकरण (कंप्यूटर विज्ञान)#प्रतिस्थापन लागू करके लगातार प्रतिस्थापन को औपचारिक बनाया जा सकता है <math>S = \left\{\ a_i \mapsto \tau_i,\ \dots\ \right\}</math> एक प्रकार की अवधि के लिए <math>\tau</math>, लिखा हुआ <math>S\tau</math>. जैसा कि उदाहरण से पता चलता है, प्रतिस्थापन न केवल एक आदेश से दृढ़ता से संबंधित है, जो व्यक्त करता है कि एक प्रकार अल्प या ज्यादा विशेष है, बल्कि सभी-परिमाणीकरण के साथ भी है जो प्रतिस्थापन को लागू करने की अनुमति देता है।
एकीकरण (कंप्यूटर विज्ञान) प्रतिस्थापन लागू करके लगातार प्रतिस्थापन<math>S = \left\{\ a_i \mapsto \tau_i,\ \dots\ \right\}</math> को औपचारिक बनाया जा सकता है, टाइप की अवधि के लिए <math>\tau</math>, <math>S\tau</math> लिखा हुआ। जैसा कि उदाहरण से पता चलता है, प्रतिस्थापन न केवल ऑर्डर से दृढ़ता से संबंधित है, जो व्यक्त करता है कि टाइप अल्प या ज्यादा विशेष है, बल्कि सभी-परिमाणीकरण के साथ भी है जो प्रतिस्थापन को लागू करने की अनुमति देता है।


{| class=infobox
{| class=infobox
Line 195: Line 189:
| <math>\displaystyle\frac{\tau' = \left\{\alpha_i \mapsto \tau_i\right\} \tau \quad \beta_i \not\in \textrm{free}(\forall \alpha_1...\forall\alpha_n . \tau)}{\forall \alpha_1...\forall\alpha_n . \tau \sqsubseteq \forall \beta_1...\forall\beta_m . \tau'}</math>
| <math>\displaystyle\frac{\tau' = \left\{\alpha_i \mapsto \tau_i\right\} \tau \quad \beta_i \not\in \textrm{free}(\forall \alpha_1...\forall\alpha_n . \tau)}{\forall \alpha_1...\forall\alpha_n . \tau \sqsubseteq \forall \beta_1...\forall\beta_m . \tau'}</math>
|}
|}
औपचारिक रूप से, एचएम में, एक प्रकार <math>\sigma'</math> से अधिक सामान्य है <math>\sigma</math>, औपचारिक रूप से <math>\sigma' \sqsubseteq
औपचारिक रूप से, एचएम में, टाइप <math>\sigma'</math>, <math>\sigma</math> से अधिक सामान्य है, औपचारिक रूप से <math>\sigma' \sqsubseteq
\sigma</math>, यदि कुछ परिमाणित चर में <math>\sigma'</math> लगातार इस प्रकार प्रतिस्थापित किया जाता है कि व्यक्ति को लाभ हो <math>\sigma</math> जैसा कि साइड बार में दिखाया गया है। यह ऑर्डर टाइप प्रणाली की टाइप परिभाषा का हिस्सा है।
\sigma</math>, यदि कुछ परिमाणित चर में <math>\sigma'</math> लगातार इस टाइप प्रतिस्थापित किया जाता है कि लाभ <math>\sigma</math> हो जैसा कि साइड बार में दिखाया गया है। यह ऑर्डर टाइप प्रणाली की टाइप परिभाषा का हिस्सा है।


हमारे पिछले उदाहरण में, प्रतिस्थापन लागू करना <math>S = \left\{\alpha \mapsto \texttt{string} \right\}</math> परिणाम होगा <math> \forall \alpha . \alpha \rightarrow \alpha \sqsubseteq \texttt{string} \rightarrow \texttt{string}</math>.
हमारे पिछले उदाहरण में, प्रतिस्थापन <math>S = \left\{\alpha \mapsto \texttt{string} \right\}</math> लागू करना<math> \forall \alpha . \alpha \rightarrow \alpha \sqsubseteq \texttt{string} \rightarrow \texttt{string}</math> परिणाम होगा।


एक परिमाणित चर के लिए एक एकरूप (जमीन) प्रकार को प्रतिस्थापित करते समय
परिमाणित चर के लिए एकरूप (जमीन) टाइप को प्रतिस्थापित करते समय, सीधे तौर पर, पॉलीटाइप को प्रतिस्थापित करने से मुक्त चर की उपस्थिति के कारण कुछ नुकसान होते हैं। विशेष रूप से, अनबाउंड चर को प्रतिस्थापित नहीं किया जाना चाहिए। उन्हें यहां स्थिरांक के रूप में माना जाता है। इसके अतिरिक्त, परिमाणीकरण केवल शीर्ष स्तर पर ही हो सकता है। प्राचलिक टाइप को प्रतिस्थापित करते हुए, किसी को इसके परिमाण को ऊपर उठाना होगा। दाईं ओर की तालिका नियम को सटीक बनाती है।
सीधे तौर पर, एक पॉलीटाइप को प्रतिस्थापित करने से कुछ नुकसान होते हैं
मुक्त चर की उपस्थिति. विशेष रूप से, अनबाउंड वैरिएबल नहीं होना चाहिए
जगह ले ली। उन्हें यहां स्थिरांक के रूप में माना जाता है। इसके अतिरिक्त, परिमाणीकरण केवल शीर्ष स्तर पर ही हो सकता है। एक प्राचलिक प्रकार को प्रतिस्थापित करते हुए,
किसी को इसके परिमाण को ऊपर उठाना होगा। दाईं ओर की तालिका नियम को सटीक बनाती है।


वैकल्पिक रूप से, बिना बहुप्रकारों के लिए समतुल्य अंकन पर विचार करें
वैकल्पिक रूप से, परिमाण बिना पॉलीटाइप्स के लिए समतुल्य अंकन पर विचार करें जिसमें परिमाण चर को प्रतीकों के अलग सेट द्वारा दर्शाया जाता है। ऐसे संकेतन में, विशेषज्ञता ऐसे चरों का सादे संगत प्रतिस्थापन में अल्प हो जाती है।
परिमाण जिसमें क्वांटिफाइड वेरिएबल्स को एक अलग सेट द्वारा दर्शाया जाता है
प्रतीक. ऐसे संकेतन में, विशेषज्ञता सादे संगत में अल्प हो जाती है
ऐसे चरों का प्रतिस्थापन.


रिश्ता <math>\sqsubseteq</math> [[आंशिक आदेश]] है
संबंध <math>\sqsubseteq</math> [[आंशिक आदेश|आंशिक ऑर्डर]] है और  <math>\forall \alpha . \alpha</math> इसका सबसे छोटा तत्व है।
और  <math>\forall \alpha . \alpha</math> इसका सबसे छोटा तत्व है.


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


==== टाइपिंग में प्रतिस्थापन ====
==== टाइपिंग में प्रतिस्थापन ====


ऊपर परिभाषित प्रकार क्रम को टाइपिंग तक बढ़ाया जा सकता है क्योंकि टाइपिंग की अंतर्निहित सभी-मात्रा लगातार प्रतिस्थापन को सक्षम बनाती है:
ऊपर परिभाषित टाइप ऑर्डर को टाइपिंग तक बढ़ाया जा सकता है क्योंकि टाइपिंग की अंतर्निहित सभी-मात्रा लगातार प्रतिस्थापन को सक्षम बनाती है:
:<math>
:<math>
\Gamma \vdash e : \sigma \quad\Longrightarrow\quad S\Gamma \vdash e : S\sigma
\Gamma \vdash e : \sigma \quad\Longrightarrow\quad S\Gamma \vdash e : S\sigma
</math>
</math>
विशेषज्ञता नियम के विपरीत, यह परिभाषा का हिस्सा नहीं है, बल्कि अंतर्निहित सभी-परिमाणीकरण की तरह है, बल्कि आगे परिभाषित प्रकार के नियमों का परिणाम है।
विशेषज्ञता नियम के विपरीत, यह परिभाषा का हिस्सा नहीं है, बल्कि अंतर्निहित सभी-परिमाणीकरण की तरह है, बल्कि आगे परिभाषित टाइप के नियमों का परिणाम है। टाइपिंग में मुक्त टाइप चर संभावित शोधन के लिए प्लेसहोल्डर के रूप में काम करते हैं। दाहिनी ओर मुक्त टाइप के चर के लिए पर्यावरण का बाध्यकारी प्रभाव <math>\vdash</math> जो विशेषज्ञता नियम में उनके प्रतिस्थापन को फिर से प्रतिबंधित करता है, वह फिर से यह है कि प्रतिस्थापन को सुसंगत होना चाहिए और इसमें संपूर्ण टाइपिंग को शामिल करने की आवश्यकता होगी।
टाइपिंग में मुक्त टाइप चर संभावित शोधन के लिए प्लेसहोल्डर के रूप में काम करते हैं। मुक्त प्रकार के लिए पर्यावरण का बाध्यकारी प्रभाव
दाहिनी ओर चर <math>\vdash</math> जो विशेषज्ञता नियम में उनके प्रतिस्थापन को फिर से प्रतिबंधित करता है
कि प्रतिस्थापन सुसंगत होना चाहिए और इसमें संपूर्ण टाइपिंग को शामिल करने की आवश्यकता होगी।


यह आलेख चार अलग-अलग नियम सेटों पर चर्चा करेगा:
यह आलेख चार अलग-अलग नियम सेटों पर चर्चा करेगा:
Line 236: Line 215:
:# <math>\vdash_D</math> घोषणात्मक प्रणाली
:# <math>\vdash_D</math> घोषणात्मक प्रणाली
:# <math>\vdash_S</math> वाक्यात्मक प्रणाली
:# <math>\vdash_S</math> वाक्यात्मक प्रणाली
:# <math>\vdash_J</math> कलन विधि एक्स
:# <math>\vdash_J</math> कलन विधि J
:# <math>\vdash_W</math> कलन विधि
:# <math>\vdash_W</math> कलन विधि W


=== निगमनात्मक प्रणाली ===
=== निगमनात्मक प्रणाली ===
Line 257: Line 236:
</math>
</math>
|}
|}
जजमेंट (गणितीय तर्क) के रूप में टाइपिंग का उपयोग करके, एचएम के सिंटैक्स को अनुमान के नियम के सिंटैक्स तक आगे बढ़ाया जाता है जो [[औपचारिक प्रणाली]] का मुख्य भाग बनाता है। प्रत्येक नियम परिभाषित करता है कि किस आधार से क्या निष्कर्ष निकाला जा सकता है। निर्णयों के अतिरिक्त, ऊपर प्रस्तुत कुछ अतिरिक्त शर्तों को भी परिसर के रूप में उपयोग किया जा सकता है।
निर्णयों (गणितीय तर्क) के रूप में टाइपिंग का उपयोग करके, एचएम के सिंटैक्स को अनुमान नियमों के सिंटैक्स तक आगे बढ़ाया जाता है जो [[औपचारिक प्रणाली]] का मुख्य भाग बनाता है। प्रत्येक नियम परिभाषित करता है कि किस आधार से क्या निष्कर्ष निकाला जा सकता है। निर्णयों के अतिरिक्त, ऊपर प्रस्तुत कुछ अतिरिक्त शर्तों को भी परिसर के रूप में उपयोग किया जा सकता है।


नियमों का उपयोग करने वाला एक प्रमाण निर्णयों का एक क्रम है जैसे कि निष्कर्ष से पहले सभी परिसरों को सूचीबद्ध किया जाता है। नीचे दिए गए उदाहरण प्रमाणों का संभावित प्रारूप दिखाते हैं। बाएँ से दाएँ, प्रत्येक पंक्ति निष्कर्ष दर्शाती है <math>[\mathtt{Name}]</math> लागू नियम और परिसर के बारे में, या तो पिछली पंक्ति (संख्या) का संदर्भ देकर यदि आधार एक निर्णय है या विधेय को स्पष्ट करके।
नियमों का उपयोग करने वाला प्रमाण निर्णयों का ऑर्डर है जैसे कि निष्कर्ष से पहले सभी परिसरों को सूचीबद्ध किया जाता है। नीचे दिए गए उदाहरण प्रमाणों का संभावित प्रारूप दिखाते हैं। बाएँ से दाएँ, प्रत्येक पंक्ति निष्कर्ष दर्शाती है <math>[\mathtt{Name}]</math> या विधेय को स्पष्ट करके, या तो पहले की पंक्ति (संख्या) का संदर्भ देकर लागू नियम और परिसर का, यदि आधार निर्णय है।


==== टाइपिंग नियम ====
==== टाइपिंग नियम ====
{{see also|Typing rules}}
{{see also|टाइपिंग नियम}}
{| class=infobox
{| class=infobox
|align=center style="background:#e0e0ff"|'''Declarative Rule System'''
|align=center style="background:#e0e0ff"|'''Declarative Rule System'''
Line 278: Line 257:
साइड बॉक्स एचएम टाइप प्रणाली के निगमन नियमों को दर्शाता है। नियमों को मोटे तौर पर दो समूहों में विभाजित किया जा सकता है:
साइड बॉक्स एचएम टाइप प्रणाली के निगमन नियमों को दर्शाता है। नियमों को मोटे तौर पर दो समूहों में विभाजित किया जा सकता है:


पहले चार नियम <math>[\mathtt{Var}]</math> (चर या फ़ंक्शन एक्सेस), <math>[\mathtt{App}]</math> (अनुप्रयोग, यानी एक पैरामीटर के साथ फ़ंक्शन कॉल), <math>[\mathtt{Abs}]</math> (अमूर्त, यानी फ़ंक्शन घोषणा) और <math>[\mathtt{Let}]</math> (परिवर्तनीय घोषणा) सिंटेक्स पर केंद्रित हैं, प्रत्येक अभिव्यक्ति रूप के लिए एक नियम प्रस्तुत करते हैं। उनका अर्थ पहली नज़र में स्पष्ट है, क्योंकि वे प्रत्येक अभिव्यक्ति को विघटित करते हैं, उनकी उप-अभिव्यक्तियों को सिद्ध करते हैं और अंततः परिसर में पाए जाने वाले व्यक्तिगत टाइप को निष्कर्ष में दिए गए प्रकार से जोड़ते हैं।
पहले चार नियम <math>[\mathtt{Var}]</math> (चर या फ़ंक्शन एक्सेस), <math>[\mathtt{App}]</math> (अनुप्रयोग, यानी मापदण्ड के साथ फ़ंक्शन कॉल), <math>[\mathtt{Abs}]</math> (अमूर्त, यानी फ़ंक्शन घोषणा) और <math>[\mathtt{Let}]</math> (परिवर्तनीय घोषणा) सिंटेक्स पर केंद्रित हैं, प्रत्येक अभिव्यक्ति रूप के लिए नियम प्रस्तुत करते हैं। उनका अर्थ पहली नज़र में स्पष्ट है, क्योंकि वे प्रत्येक अभिव्यक्ति को विघटित करते हैं, उनकी उप-अभिव्यक्तियों को सिद्ध करते हैं और अंततः परिसर में पाए जाने वाले व्यक्तिगत टाइप को निष्कर्ष में दिए गए टाइप से जोड़ते हैं।


शेष दो नियमों से दूसरा समूह बनता है <math>[\mathtt{Inst}]</math> और <math>[\mathtt{Gen}]</math>.
शेष दो नियमों <math>[\mathtt{Inst}]</math> और <math>[\mathtt{Gen}]</math> से दूसरा समूह बनता है। वे टाइप की विशेषज्ञता और सामान्यीकरण को संभालते हैं। जबकि नियम <math>[\mathtt{Inst}]</math> उपरोक्त विशेषज्ञता वाले अनुभाग से स्पष्ट होना चाहिए, <math>[\mathtt{Gen}]</math> विपरीत दिशा में काम करते हुए पहले का पूरक है। यह सामान्यीकरण की अनुमति देता है, यानी संदर्भ में सीमित हुए मोनोटाइप चर की मात्रा निर्धारित करने की अनुमति नहीं देता है।
वे टाइप की विशेषज्ञता और सामान्यीकरण को संभालते हैं। जबकि नियम <math>[\mathtt{Inst}]</math> विशेषज्ञता #प्रकार क्रम पर अनुभाग से स्पष्ट होना चाहिए, <math>[\mathtt{Gen}]</math> पूर्व को पूरक करता है, विपरीत दिशा में काम करता है। यह सामान्यीकरण की अनुमति देता है, यानी संदर्भ में सीमित हुए मोनोटाइप चर की मात्रा निर्धारित करने की अनुमति नहीं देता है।
   
   
निम्नलिखित दो उदाहरण क्रियान्वित नियम प्रणाली का प्रयोग करते हैं। चूँकि अभिव्यक्ति और प्रकार दोनों दिए गए हैं, वे नियमों का एक प्रकार-जाँच उपयोग हैं।
निम्नलिखित दो उदाहरण क्रियान्वित नियम प्रणाली का प्रयोग करते हैं। चूँकि अभिव्यक्ति और टाइप दोनों दिए गए हैं, वे नियमों का टाइप-जाँच उपयोग हैं।


उदाहरण: के लिए एक प्रमाण <math>\Gamma \vdash_D id(n):int</math> जहाँ <math>\Gamma = id:\forall \alpha . \alpha\rightarrow\alpha,\ n:int</math>,
'''उदाहरण:''' के लिए प्रमाण <math>\Gamma \vdash_D id(n):int</math> जहाँ <math>\Gamma = id:\forall \alpha . \alpha\rightarrow\alpha,\ n:int</math>,लिखा जा सकता है
लिखा जा सकता है


: <math>\begin{array}{llll}
: <math>\begin{array}{llll}
Line 295: Line 272:
\end{array}
\end{array}
</math>
</math>
उदाहरण: सामान्यीकरण प्रदर्शित करने के लिए,
'''उदाहरण''': सामान्यीकरण प्रदर्शित करने के लिए,<math>\vdash_D\ \textbf{let}\, id = \lambda x . x\ \textbf{in}\ id\, :\, \forall\alpha.\alpha\rightarrow\alpha</math> नीचे दिखाया गया है:
<math>\vdash_D\ \textbf{let}\, id = \lambda x . x\ \textbf{in}\ id\, :\, \forall\alpha.\alpha\rightarrow\alpha</math>
नीचे दिखाया गया है:


: <math>
: <math>
Line 308: Line 283:
\end{array}
\end{array}
</math>
</math>
=== लेट-बहुरूपता ===


तुरंत दिखाई नहीं देता है, नियम सेट विनियमन को एन्कोड करता है जिसके तहत नियमों  <math>[\mathtt{Abs}]</math> और <math>[\mathtt{Let}]</math> में मोनो- और पॉलीटाइप के थोड़े अलग उपयोग से किसी टाइप को सामान्यीकृत किया जा सकता है या नहीं किया जा सकता है। उसे याद रखो <math>\sigma</math> और <math>\tau</math> क्रमशः पॉली- और मोनोटाइप्स को निरूपित करें।


=== मान लीजिए-बहुरूपता ===
नियम में <math>[\mathtt{Abs}]</math>, फ़ंक्शन के मापदण्ड का मान चर <math>\lambda x.e</math> आधार के माध्यम से एकरूप टाइप के साथ संदर्भ में जोड़ा जाता है <math>\Gamma,\ x:\tau \vdash_D e:\tau'</math>, जबकि नियम <math>[\mathtt{Let}]</math> में है चर पर्यावरण में बहुरूपी रूप <math>\Gamma,\ x:\sigma \vdash_D e_1:\tau</math> में प्रवेश करता है। हालाँकि दोनों ही मामलों में की उपस्थिति <math>x</math> संदर्भ में असाइनमेंट में किसी भी मुक्त चर के लिए सामान्यीकरण नियम के उपयोग को रोकता है, यह विनियमन मापदण्ड <math>x</math> के टाइप को बाध्य करता है <math>\lambda</math>-अभिव्यक्ति एकरूप बनी रहेगी, जबकि लेट-एक्सप्रेशन में, चर को बहुरूपी पेश किया जा सकता है, जिससे विशेषज्ञता संभव हो सकेगी।


तुरंत दिखाई नहीं देता है, नियम सेट एक विनियमन को एन्कोड करता है जिसके तहत नियमों में मोनो- और पॉलीटाइप के थोड़े अलग उपयोग से किसी प्रकार को सामान्यीकृत किया जा सकता है या नहीं। <math>[\mathtt{Abs}]</math> और <math>[\mathtt{Let}]</math>. उसे याद रखो <math>\sigma</math> और <math>\tau</math> क्रमशः पॉली- और मोनोटाइप्स को निरूपित करें।
इस विनियमन के परिणामस्वरूप, <math>\lambda f.(f\, \textrm{true}, f\, \textrm{0})</math> टाइप नहीं किया जा सकता, मापदण्ड के बाद से <math>f</math> एकरूप स्थिति में है, जबकि <math>\textbf{let}\ f = \lambda x . x\, \textbf{in}\, (f\, \textrm{true}, f\, \textrm{0})</math> टाइप <math>(bool, int)</math> है, क्योंकि <math>f</math> लेट-एक्सप्रेशन में पेश किया गया है और इसलिए इसे बहुरूपी माना जाता है।
 
नियम में <math>[\mathtt{Abs}]</math>, फ़ंक्शन के पैरामीटर का मान चर <math>\lambda x.e</math> आधार के माध्यम से एक एकरूप प्रकार के साथ संदर्भ में जोड़ा जाता है <math>\Gamma,\ x:\tau \vdash_D e:\tau'</math>, जबकि नियम में है  <math>[\mathtt{Let}]</math>, चर पर्यावरण में बहुरूपी रूप में प्रवेश करता है <math>\Gamma,\ x:\sigma \vdash_D e_1:\tau</math>. हालाँकि दोनों ही मामलों में की उपस्थिति <math>x</math> संदर्भ में असाइनमेंट में किसी भी मुक्त चर के लिए सामान्यीकरण नियम के उपयोग को रोकता है, यह विनियमन पैरामीटर के प्रकार को बाध्य करता है <math>x</math> में एक <math>\lambda</math>-अभिव्यक्ति एकरूप बनी रहेगी, जबकि लेट-एक्सप्रेशन में, वैरिएबल को बहुरूपी पेश किया जा सकता है, जिससे विशेषज्ञता संभव हो सकेगी।
 
इस विनियमन के परिणामस्वरूप, <math>\lambda f.(f\, \textrm{true}, f\, \textrm{0})</math> टाइप नहीं किया जा सकता,
पैरामीटर के बाद से <math>f</math> एक एकरूप स्थिति में है, जबकि <math>\textbf{let}\ f = \lambda x . x\, \textbf{in}\, (f\, \textrm{true}, f\, \textrm{0})</math> प्रकार है <math>(bool, int)</math>, क्योंकि <math>f</math> लेट-एक्सप्रेशन में पेश किया गया है और इसलिए इसे बहुरूपी माना जाता है।


=== सामान्यीकरण नियम ===
=== सामान्यीकरण नियम ===


सामान्यीकरण नियम भी करीब से देखने लायक है। यहां, आधार में निहित सभी-परिमाणीकरण <math>\Gamma \vdash e : \sigma</math> को बस दाहिनी ओर ले जाया जाता है <math>\vdash_D</math> निष्कर्ष में। यह तब से संभव है <math>\alpha</math> संदर्भ में मुक्त नहीं होता है. फिर, जबकि यह सामान्यीकरण नियम को प्रशंसनीय बनाता है, यह वास्तव में कोई परिणाम नहीं है। इसके विपरीत, सामान्यीकरण नियम एचएम की टाइप प्रणाली की परिभाषा का हिस्सा है और अंतर्निहित सभी-परिमाणीकरण एक परिणाम है।
सामान्यीकरण नियम भी करीब से देखने लायक है। यहां, आधार <math>\Gamma \vdash e : \sigma</math> में निहित सभी-परिमाणीकरण को निष्कर्ष में <math>\vdash_D</math>के दाहिनी ओर ले जाया गया है। यह तब से संभव है <math>\alpha</math> संदर्भ में मुक्त नहीं होता है। फिर, जबकि यह सामान्यीकरण नियम को प्रशंसनीय बनाता है, यह वास्तव में कोई परिणाम नहीं है। इसके विपरीत, सामान्यीकरण नियम एचएम की टाइप प्रणाली की परिभाषा का हिस्सा है और अंतर्निहित सभी-परिमाणीकरण एक परिणाम है।


== एक अनुमान एल्गोरिथ्म ==
== अनुमान कलन विधि ==


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


=== नियमों को चुनने की स्वतंत्रता की डिग्री ===
=== नियमों को चुनने की स्वतंत्रता की डिग्री ===


प्रमाण में उन बिंदुओं को अलग करना, जहां कोई निर्णय संभव ही नहीं है,
'''प्रमाण में उन बिंदुओं को अलग करना, जहां कोई निर्णय संभव ही नहीं है,
वाक्य-विन्यास पर केन्द्रित नियमों का पहला समूह तब से कोई विकल्प नहीं छोड़ता है
वाक्य-विन्यास पर केन्द्रित नियमों का पहला समूह तब से कोई विकल्प नहीं छोड़ता है
प्रत्येक वाक्यात्मक नियम के अनुरूप एक अद्वितीय टाइपिंग नियम होता है, जो निर्धारित करता है
प्रत्येक वाक्यात्मक नियम के अनुरूप एक अद्वितीय टाइपिंग नियम होता है, जो निर्धारित करता है
प्रमाण का एक भाग, जबकि निष्कर्ष और इनके परिसर के बीच
प्रमाण का एक भाग, जबकि निष्कर्ष और इनके परिसर के बीच
के निश्चित भागों की शृंखलाएँ <math>[\mathtt{Inst}]</math> और <math>[\mathtt{Gen}]</math>
के निश्चित भागों की''' शृंखलाएँ <math>[\mathtt{Inst}]</math> और <math>[\mathtt{Gen}]</math>
घटित हो सकता है. ऐसी श्रृंखला के निष्कर्ष के बीच भी मौजूद हो सकती है
घटित हो सकता है। ऐसी श्रृंखला के निष्कर्ष के बीच भी मौजूद हो सकती है
सर्वोच्च अभिव्यक्ति के लिए प्रमाण और नियम। सभी सबूत होने चाहिए
सर्वोच्च अभिव्यक्ति के लिए प्रमाण और नियम। सभी सबूत होने चाहिए
इतना रेखांकित आकार.
इतना रेखांकित आकार।


क्योंकि नियम चयन के संबंध में प्रमाण में एकमात्र विकल्प हैं
क्योंकि नियम चयन के संबंध में प्रमाण में एकमात्र विकल्प हैं
Line 344: Line 314:
प्रमाण का स्वरूप यह प्रश्न सुझाता है कि क्या इसे और अधिक सटीक बनाया जा सकता है,
प्रमाण का स्वरूप यह प्रश्न सुझाता है कि क्या इसे और अधिक सटीक बनाया जा सकता है,
जहां इन जंजीरों की आवश्यकता नहीं हो सकती है। यह वास्तव में संभव है और एक की ओर ले जाता है
जहां इन जंजीरों की आवश्यकता नहीं हो सकती है। यह वास्तव में संभव है और एक की ओर ले जाता है
नियम प्रणाली का एक प्रकार जिसमें ऐसे कोई नियम नहीं हैं।
नियम प्रणाली का एक टाइप जिसमें ऐसे कोई नियम नहीं हैं।


=== सिंटैक्स-निर्देशित नियम प्रणाली ===
=== सिंटैक्स-निर्देशित नियम प्रणाली ===
Line 367: Line 337:
एचएम का एक समकालीन उपचार विशुद्ध रूप से सिंटेक्स-निर्देशित नियम प्रणाली का उपयोग करता है
एचएम का एक समकालीन उपचार विशुद्ध रूप से सिंटेक्स-निर्देशित नियम प्रणाली का उपयोग करता है
मेहरबान<ref>{{cite conference | last = Clement | date = 1986 | title = A Simple Applicative Language: Mini-ML | conference = LFP'86 | publisher = ACM |doi=10.1145/319838.319847 |isbn=978-0-89791-200-6}}</ref>
मेहरबान<ref>{{cite conference | last = Clement | date = 1986 | title = A Simple Applicative Language: Mini-ML | conference = LFP'86 | publisher = ACM |doi=10.1145/319838.319847 |isbn=978-0-89791-200-6}}</ref>
एक मध्यवर्ती कदम के रूप में. इस प्रणाली में, विशेषज्ञता सीधे मूल के बाद स्थित होती है <math>[\mathtt{Var}]</math> नियम
एक मध्यवर्ती कदम के रूप में। इस प्रणाली में, विशेषज्ञता सीधे मूल के बाद स्थित होती है <math>[\mathtt{Var}]</math> नियम
और इसमें विलीन हो जाता है, जबकि सामान्यीकरण इसका हिस्सा बन जाता है <math>[\mathtt{Let}]</math> नियम। वहां सामान्यीकरण है
और इसमें विलीन हो जाता है, जबकि सामान्यीकरण इसका हिस्सा बन जाता है <math>[\mathtt{Let}]</math> नियम। वहां सामान्यीकरण है
फ़ंक्शन को प्रस्तुत करके हमेशा सबसे सामान्य प्रकार का उत्पादन करने के लिए भी निर्धारित किया गया है <math>\bar{\Gamma}(\tau)</math>, जो मात्रा निर्धारित करता है
फ़ंक्शन को प्रस्तुत करके हमेशा सबसे सामान्य टाइप का उत्पादन करने के लिए भी निर्धारित किया गया है <math>\bar{\Gamma}(\tau)</math>, जो मात्रा निर्धारित करता है
सभी मोनोटाइप वैरिएबल बाध्य नहीं हैं <math>\Gamma</math>.
सभी मोनोटाइप चर बाध्य नहीं हैं <math>\Gamma</math>


औपचारिक रूप से, इस नई नियम प्रणाली को मान्य करने के लिए <math>\vdash_S</math> मूल के समतुल्य है <math>\vdash_D</math>, किसी के पास
औपचारिक रूप से, इस नई नियम प्रणाली को मान्य करने के लिए <math>\vdash_S</math> मूल के समतुल्य है <math>\vdash_D</math>, किसी के पास
Line 381: Line 351:
का <math>\vdash_S</math> सबूतों में <math>\vdash_D</math>, संभावना यही दिख रही है <math>\vdash_S</math> अधूरा है, जैसे
का <math>\vdash_S</math> सबूतों में <math>\vdash_D</math>, संभावना यही दिख रही है <math>\vdash_S</math> अधूरा है, जैसे
कोई दिखा नहीं सकता <math>\lambda\ x.x:\forall\alpha.\alpha\rightarrow\alpha</math> में <math>\vdash_S</math>, उदाहरण के लिए, लेकिन केवल
कोई दिखा नहीं सकता <math>\lambda\ x.x:\forall\alpha.\alpha\rightarrow\alpha</math> में <math>\vdash_S</math>, उदाहरण के लिए, लेकिन केवल
<math>\lambda\ x.x:\alpha\rightarrow\alpha</math>. पूर्णता का केवल थोड़ा कमजोर संस्करण ही सिद्ध किया जा सकता है
<math>\lambda\ x.x:\alpha\rightarrow\alpha</math>पूर्णता का केवल थोड़ा कमजोर संस्करण ही सिद्ध किया जा सकता है
<ref name=x>{{cite journal | first = Jeff | last = Vaughan | archive-url = https://web.archive.org/web/20120324105848/http://www.cs.ucla.edu/~jeff/docs/hmproof.pdf | archive-date = 2012-03-24 | url = http://www.cs.ucla.edu/~jeff/docs/hmproof.pdf | title = A proof of correctness for the Hindley–Milner type inference algorithm | orig-year = May 5, 2005 | date = July 23, 2008 }}</ref> हालाँकि, अर्थात्
<ref name=x>{{cite journal | first = Jeff | last = Vaughan | archive-url = https://web.archive.org/web/20120324105848/http://www.cs.ucla.edu/~jeff/docs/hmproof.pdf | archive-date = 2012-03-24 | url = http://www.cs.ucla.edu/~jeff/docs/hmproof.pdf | title = A proof of correctness for the Hindley–Milner type inference algorithm | orig-year = May 5, 2005 | date = July 23, 2008 }}</ref> हालाँकि, अर्थात्


* <math>\Gamma \vdash_D\ e:\sigma \Rightarrow \Gamma \vdash_S\ e:\tau \wedge \bar{\Gamma}(\tau)\sqsubseteq\sigma</math>
* <math>\Gamma \vdash_D\ e:\sigma \Rightarrow \Gamma \vdash_S\ e:\tau \wedge \bar{\Gamma}(\tau)\sqsubseteq\sigma</math>
तात्पर्य यह है कि, कोई किसी अभिव्यक्ति के लिए मुख्य प्रकार प्राप्त कर सकता है <math>\vdash_S</math> हमें अंत में प्रमाण को सामान्यीकृत करने की अनुमति देता है।
तात्पर्य यह है कि, कोई किसी अभिव्यक्ति के लिए मुख्य टाइप प्राप्त कर सकता है <math>\vdash_S</math> हमें अंत में प्रमाण को सामान्यीकृत करने की अनुमति देता है।


की तुलना <math>\vdash_D</math> और <math>\vdash_S</math>, अब सभी नियमों के निर्णयों में केवल मोनोटाइप ही दिखाई देते हैं। इसके अतिरिक्त, निगमन प्रणाली के साथ किसी भी संभावित प्रमाण का आकार अब अभिव्यक्ति के आकार के समान है (दोनों को टर्म (तर्क)#औपचारिक परिभाषा के रूप में देखा जाता है)। इस प्रकार अभिव्यक्ति पूरी तरह से प्रमाण के आकार को निर्धारित करती है। में <math>\vdash_D</math> आकार संभवतः सभी नियमों को छोड़कर अन्य नियमों के अनुसार निर्धारित किया जाएगा <math>[\mathtt{Inst}]</math> और <math>[\mathtt{Gen}]</math>, जो अन्य नोड्स के बीच मनमाने ढंग से लंबी शाखाएं (चेन) बनाने की अनुमति देता है।
की तुलना <math>\vdash_D</math> और <math>\vdash_S</math>, अब सभी नियमों के निर्णयों में केवल मोनोटाइप ही दिखाई देते हैं। इसके अतिरिक्त, निगमन प्रणाली के साथ किसी भी संभावित प्रमाण का आकार अब अभिव्यक्ति के आकार के समान है (दोनों को टर्म (तर्क)#औपचारिक परिभाषा के रूप में देखा जाता है)। इस टाइप अभिव्यक्ति पूरी तरह से प्रमाण के आकार को निर्धारित करती है। में <math>\vdash_D</math> आकार संभवतः सभी नियमों को छोड़कर अन्य नियमों के अनुसार निर्धारित किया जाएगा <math>[\mathtt{Inst}]</math> और <math>[\mathtt{Gen}]</math>, जो अन्य नोड्स के बीच मनमाने ढंग से लंबी शाखाएं (चेन) बनाने की अनुमति देता है।


=== नियमों को लागू करने वाली स्वतंत्रता की डिग्री ===
=== नियमों को लागू करने वाली स्वतंत्रता की डिग्री ===


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


यहां, प्रतिस्थापन (विशेषज्ञता) आदेश चलन में आता है। हालाँकि पहली नज़र में कोई भी स्थानीय रूप से टाइप को निर्धारित नहीं कर सकता है, आशा है कि प्रमाण वृक्ष को पार करते समय क्रम की सहायता से उन्हें परिष्कृत करना संभव है, इसके अतिरिक्त यह मानते हुए, क्योंकि परिणामी कलन विधि एक अनुमान विधि बनना है, कि किसी भी परिसर का प्रकार सर्वोत्तम संभव के रूप में निर्धारित किया जाएगा। और वास्तव में, कोई भी, के नियमों को देखते हुए, ऐसा कर सकता है <math>\vdash_S</math> सुझाव:
यहां, प्रतिस्थापन (विशेषज्ञता) ऑर्डर चलन में आता है। हालाँकि पहली नज़र में कोई भी स्थानीय रूप से टाइप को निर्धारित नहीं कर सकता है, आशा है कि प्रमाण वृक्ष को पार करते समय ऑर्डर की सहायता से उन्हें परिष्कृत करना संभव है, इसके अतिरिक्त यह मानते हुए, क्योंकि परिणामी कलन विधि एक अनुमान विधि बनना है, कि किसी भी परिसर का टाइप सर्वोत्तम संभव के रूप में निर्धारित किया जाएगा। और वास्तव में, कोई भी, के नियमों को देखते हुए, ऐसा कर सकता है <math>\vdash_S</math> सुझाव:


* {{math|{{bracket|{{var|Abs}}}}}}: महत्वपूर्ण विकल्प है {{mvar|&tau;}}. फिलहाल इस बारे में कुछ पता नहीं चल पाया है {{mvar|&tau;}}, इसलिए कोई केवल सबसे सामान्य प्रकार ही मान सकता है, जो कि है <math>\forall \alpha . \alpha</math>. योजना यह है कि यदि आवश्यक हो तो प्रकार को विशेषज्ञ बनाया जाए। दुर्भाग्य से, इस स्थान पर पॉलीटाइप की अनुमति नहीं है, इसलिए कुछ {{mvar|&alpha;}}फिलहाल करना होगा. अवांछित कैप्चर से बचने के लिए, एक प्रकार का चर जो अभी तक प्रूफ़ में नहीं है, एक सुरक्षित विकल्प है। इसके अतिरिक्त, किसी को यह ध्यान में रखना होगा कि यह मोनोटाइप अभी तक तय नहीं हुआ है, लेकिन इसे और परिष्कृत किया जा सकता है।
* {{math|{{bracket|{{var|Abs}}}}}}: महत्वपूर्ण विकल्प है {{mvar|&tau;}}फिलहाल इस बारे में कुछ पता नहीं चल पाया है {{mvar|&tau;}}, इसलिए कोई केवल सबसे सामान्य टाइप ही मान सकता है, जो कि है <math>\forall \alpha . \alpha</math>योजना यह है कि यदि आवश्यक हो तो टाइप को विशेषज्ञ बनाया जाए। दुर्भाग्य से, इस स्थान पर पॉलीटाइप की अनुमति नहीं है, इसलिए कुछ {{mvar|&alpha;}}फिलहाल करना होगा। अवांछित कैप्चर से बचने के लिए, एक टाइप का चर जो अभी तक प्रूफ़ में नहीं है, एक सुरक्षित विकल्प है। इसके अतिरिक्त, किसी को यह ध्यान में रखना होगा कि यह मोनोटाइप अभी तक तय नहीं हुआ है, लेकिन इसे और परिष्कृत किया जा सकता है।
* {{math|{{bracket|{{var|Var}}}}}}: चुनाव यह है कि कैसे परिष्कृत किया जाए {{mvar|&sigma;}}. क्योंकि किसी भी प्रकार का कोई भी विकल्प {{mvar|&tau;}} यहां चर के उपयोग पर निर्भर करता है, जो स्थानीय रूप से ज्ञात नहीं है, सबसे सुरक्षित दांव सबसे सामान्य है। ऊपर दी गई समान विधि का उपयोग करके सभी मात्रात्मक चर को तुरंत चालू किया जा सकता है {{mvar|&sigma;}} नए वैरिएबल मोनोटाइप वैरिएबल के साथ, उन्हें फिर से आगे के शोधन के लिए विवृत रखा गया है।
* {{math|{{bracket|{{var|Var}}}}}}: चुनाव यह है कि कैसे परिष्कृत किया जाए {{mvar|&sigma;}}क्योंकि किसी भी टाइप का कोई भी विकल्प {{mvar|&tau;}} यहां चर के उपयोग पर निर्भर करता है, जो स्थानीय रूप से ज्ञात नहीं है, सबसे सुरक्षित दांव सबसे सामान्य है। ऊपर दी गई समान विधि का उपयोग करके सभी मात्रात्मक चर को तुरंत चालू किया जा सकता है {{mvar|&sigma;}} नए चर मोनोटाइप चर के साथ, उन्हें फिर से आगे के शोधन के लिए विवृत रखा गया है।
* {{math|{{bracket|{{var|Let}}}}}}: नियम कोई विकल्प नहीं छोड़ता। पूर्ण।
* {{math|{{bracket|{{var|Let}}}}}}: नियम कोई विकल्प नहीं छोड़ता। पूर्ण।
* {{math|{{bracket|{{var|App}}}}}}: केवल अनुप्रयोग नियम ही अब तक खोले गए वेरिएबल्स को परिष्कृत करने के लिए बाध्य कर सकता है, जैसा कि दोनों परिसरों द्वारा आवश्यक है।
* {{math|{{bracket|{{var|App}}}}}}: केवल अनुप्रयोग नियम ही अब तक खोले गए चर को परिष्कृत करने के लिए बाध्य कर सकता है, जैसा कि दोनों परिसरों द्वारा आवश्यक है।
*# पहला आधार अनुमान के परिणाम को प्रपत्र का होने के लिए बाध्य करता है <math>\tau \rightarrow \tau'</math>.
*# पहला आधार अनुमान के परिणाम को प्रपत्र का होने के लिए बाध्य करता है <math>\tau \rightarrow \tau'</math>
*#*अगर ऐसा है तो ठीक है. कोई भी बाद में इसे चुन सकता है {{mvar|&tau;'}}परिणाम के लिए.
*#*अगर ऐसा है तो ठीक है। कोई भी बाद में इसे चुन सकता है {{mvar|&tau;'}}परिणाम के लिए।
*#* यदि नहीं, तो यह एक विवृत चर हो सकता है। फिर इसे पहले की तरह दो नए वेरिएबल्स के साथ आवश्यक रूप में परिष्कृत किया जा सकता है।
*#* यदि नहीं, तो यह एक विवृत चर हो सकता है। फिर इसे पहले की तरह दो नए चर के साथ आवश्यक रूप में परिष्कृत किया जा सकता है।
*#* अन्यथा, प्रकार की जाँच विफल हो जाती है क्योंकि पहले आधार से एक ऐसे टाइप इन्फेरेंस लगाया गया है जो फ़ंक्शन प्रकार में नहीं है और न ही बनाया जा सकता है।
*#* अन्यथा, टाइप की जाँच विफल हो जाती है क्योंकि पहले आधार से एक ऐसे टाइप इन्फेरेंस लगाया गया है जो फ़ंक्शन टाइप में नहीं है और न ही बनाया जा सकता है।
*# दूसरे आधार के लिए आवश्यक है कि अनुमानित प्रकार बराबर हो {{mvar|&tau;}} पहले परिसर का. अब संभवतः दो अलग-अलग प्रकार हैं, शायद खुले प्रकार के चर के साथ, तुलना करने के लिए और यदि संभव हो तो बराबर करने के लिए। यदि ऐसा है, तो एक शोधन पाया जाता है, और यदि नहीं, तो एक प्रकार की त्रुटि फिर से पाई जाती है। प्रतिस्थापन द्वारा दो शब्दों को समान बनाने के लिए एक प्रभावी विधि ज्ञात है, तथाकथित [[असंयुक्त-सेट डेटा संरचना]] के साथ संयोजन में जॉन एलन रॉबिन्सन | रॉबिन्सन का [[एकीकरण (कंप्यूटिंग)]] | यूनियन-फाइंड कलन विधि।
*# दूसरे आधार के लिए आवश्यक है कि अनुमानित टाइप बराबर हो {{mvar|&tau;}} पहले परिसर का। अब संभवतः दो अलग-अलग टाइप हैं, शायद खुले टाइप के चर के साथ, तुलना करने के लिए और यदि संभव हो तो बराबर करने के लिए। यदि ऐसा है, तो एक शोधन पाया जाता है, और यदि नहीं, तो एक टाइप की त्रुटि फिर से पाई जाती है। प्रतिस्थापन द्वारा दो शब्दों को समान बनाने के लिए एक प्रभावी विधि ज्ञात है, तथाकथित [[असंयुक्त-सेट डेटा संरचना]] के साथ संयोजन में जॉन एलन रॉबिन्सन | रॉबिन्सन का [[एकीकरण (कंप्यूटिंग)]] | संयोजन-फाइंड कलन विधि।


संघ-खोज एल्गोरिथ्म को संक्षेप में संक्षेप में प्रस्तुत करने के लिए, एक प्रमाण में सभी टाइप के सेट को देखते हुए, यह किसी को एक के माध्यम से उन्हें समतुल्य वर्गों में समूहित करने की अनुमति देता है। {{mono|union}}
संघ-खोज कलन विधि को संक्षेप में संक्षेप में प्रस्तुत करने के लिए, एक प्रमाण में सभी टाइप के सेट को देखते हुए, यह किसी को एक के माध्यम से उन्हें समतुल्य वर्गों में समूहित करने की अनुमति देता है। {{mono|union}}
प्रक्रिया और ऐसे प्रत्येक वर्ग के लिए एक प्रतिनिधि चुनना {{mono|find}} प्रक्रिया। साइड इफेक्ट (कंप्यूटर विज्ञान) के अर्थ में [[प्रक्रिया (कंप्यूटर विज्ञान)]] शब्द पर जोर देते हुए, हम एक प्रभावी कलन विधि तैयार करने के लिए स्पष्ट रूप से तर्क के दायरे को छोड़ रहे हैं। ए के प्रतिनिधि <math>\mathtt{union}(a,b)</math> इस प्रकार निर्धारित किया जाता है कि, यदि दोनों {{mvar|a}} और {{mvar|b}} प्रकार के चर हैं तो प्रतिनिधि मनमाने ढंग से उनमें से एक है, लेकिन एक चर और एक अभिव्यक्ति को एकजुट करते समय, अभिव्यक्ति प्रतिनिधि बन जाता है। यूनियन-फाइंड के कार्यान्वयन को हाथ में लेते हुए, कोई दो मोनोटाइप्स के एकीकरण को निम्नानुसार तैयार कर सकता है:
प्रक्रिया और ऐसे प्रत्येक वर्ग के लिए एक प्रतिनिधि चुनना {{mono|find}} प्रक्रिया। साइड इफेक्ट (कंप्यूटर विज्ञान) के अर्थ में [[प्रक्रिया (कंप्यूटर विज्ञान)]] शब्द पर जोर देते हुए, हम एक प्रभावी कलन विधि तैयार करने के लिए स्पष्ट रूप से तर्क के दायरे को छोड़ रहे हैं। ए के प्रतिनिधि <math>\mathtt{union}(a,b)</math> इस टाइप निर्धारित किया जाता है कि, यदि दोनों {{mvar|a}} और {{mvar|b}} टाइप के चर हैं तो प्रतिनिधि मनमाने ढंग से उनमें से एक है, लेकिन एक चर और एक अभिव्यक्ति को एकजुट करते समय, अभिव्यक्ति प्रतिनिधि बन जाता है। संयोजन-फाइंड के कार्यान्वयन को हाथ में लेते हुए, कोई दो मोनोटाइप्स के एकीकरण को निम्नानुसार तैयार कर सकता है:


  <u>एकजुट(ta, tb):</u>
  <u>एकजुट(ta, tb):</u>
     टा = खोजें(टा)
     टा = खोजें(टा)
     टीबी = खोजें(टीबी)
     टीबी = खोजें(टीबी)
     यदि दोनों ta,tb समान D,n के साथ D p1..pn रूप के अभिव्यक्ति हैं
     यदि दोनों ta,tb समान D,n के साथ D p1।।pn रूप के अभिव्यक्ति हैं
         प्रत्येक संगत ''i''वें पैरामीटर के लिए unify(ta[i], tb[i])।
         प्रत्येक संगत ''i''वें मापदण्ड के लिए unify(ta[i], tb[i])।
     अन्य
     अन्य
     यदि ta,tb में से न्यूनतम एक एक प्रकार का चर है
     यदि ta,tb में से न्यूनतम एक एक टाइप का चर है
         संघ(टीए, टीबी)
         संघ(टीए, टीबी)
     अन्य
     अन्य
         त्रुटि 'प्रकार मेल नहीं खाते'
         त्रुटि 'टाइप मेल नहीं खाते'


अब अनुमान कलन विधि का एक स्केच हाथ में होने से, अगले भाग में एक अधिक औपचारिक प्रस्तुति दी गई है। इसका वर्णन मिलनर में किया गया है<ref name="Milner"/>पी. 370 एफएफ. कलन विधि जे के रूप में
अब अनुमान कलन विधि का एक स्केच हाथ में होने से, अगले भाग में एक अधिक औपचारिक प्रस्तुति दी गई है। इसका वर्णन मिलनर में किया गया है<ref name="Milner"/>पी। 370 एफएफ। कलन विधि जे के रूप में


=== कलन विधि एक्स ===
=== कलन विधि एक्स ===
Line 438: Line 408:
कलन विधि जे की प्रस्तुति तार्किक नियमों के अंकन का दुरुपयोग है, क्योंकि इसमें दुष्प्रभाव शामिल हैं लेकिन इसके साथ सीधी तुलना की अनुमति मिलती है <math>\vdash_S</math> साथ ही एक कुशल कार्यान्वयन को व्यक्त करते हुए। नियम अब मापदंडों के साथ एक प्रक्रिया निर्दिष्ट करते हैं <math>\Gamma, e</math> उपज <math>\tau</math> निष्कर्ष में जहां परिसर का निष्पादन बाएं से दाएं की ओर बढ़ता है।
कलन विधि जे की प्रस्तुति तार्किक नियमों के अंकन का दुरुपयोग है, क्योंकि इसमें दुष्प्रभाव शामिल हैं लेकिन इसके साथ सीधी तुलना की अनुमति मिलती है <math>\vdash_S</math> साथ ही एक कुशल कार्यान्वयन को व्यक्त करते हुए। नियम अब मापदंडों के साथ एक प्रक्रिया निर्दिष्ट करते हैं <math>\Gamma, e</math> उपज <math>\tau</math> निष्कर्ष में जहां परिसर का निष्पादन बाएं से दाएं की ओर बढ़ता है।


प्रक्रिया <math>inst(\sigma)</math> पॉलीटाइप में विशेषज्ञता रखता है <math>\sigma</math> शब्द की प्रतिलिपि बनाकर और बाध्य प्रकार चर को लगातार नए मोनोटाइप चर द्वारा प्रतिस्थापित करके। '<math>newvar</math>' एक नया मोनोटाइप वैरिएबल उत्पन्न करता है। संभावित, <math>\bar{\Gamma}(\tau)</math> अवांछित कैप्चर से बचने के लिए परिमाणीकरण के लिए नए चर पेश करने वाले प्रकार की प्रतिलिपि बनाना होगा। कुल मिलाकर, एल्गोरिथ्म अब विशेषज्ञता को एकीकरण पर छोड़कर हमेशा सबसे सामान्य विकल्प चुनकर आगे बढ़ता है, जो स्वयं सबसे सामान्य परिणाम उत्पन्न करता है। जैसा कि उल्लेख किया गया है #सिंटैक्स संचालित नियम प्रणाली, अंतिम परिणाम <math>\tau</math> को सामान्यीकृत करना होगा <math>\bar{\Gamma}(\tau)</math> अंत में, किसी दिए गए अभिव्यक्ति के लिए सबसे सामान्य प्रकार प्राप्त करने के लिए।
प्रक्रिया <math>inst(\sigma)</math> पॉलीटाइप में विशेषज्ञता रखता है <math>\sigma</math> शब्द की प्रतिलिपि बनाकर और बाध्य टाइप चर को लगातार नए मोनोटाइप चर द्वारा प्रतिस्थापित करके। '<math>newvar</math>' एक नया मोनोटाइप चर उत्पन्न करता है। संभावित, <math>\bar{\Gamma}(\tau)</math> अवांछित कैप्चर से बचने के लिए परिमाणीकरण के लिए नए चर पेश करने वाले टाइप की प्रतिलिपि बनाना होगा। कुल मिलाकर, कलन विधि अब विशेषज्ञता को एकीकरण पर छोड़कर हमेशा सबसे सामान्य विकल्प चुनकर आगे बढ़ता है, जो स्वयं सबसे सामान्य परिणाम उत्पन्न करता है। जैसा कि उल्लेख किया गया है #सिंटैक्स संचालित नियम प्रणाली, अंतिम परिणाम <math>\tau</math> को सामान्यीकृत करना होगा <math>\bar{\Gamma}(\tau)</math> अंत में, किसी दिए गए अभिव्यक्ति के लिए सबसे सामान्य टाइप प्राप्त करने के लिए।


चूँकि कलन विधि में उपयोग की जाने वाली प्रक्रियाओं की लागत लगभग O(1) होती है, कलन विधि की कुल लागत उस अभिव्यक्ति के आकार में रैखिक के करीब होती है जिसके लिए एक टाइप इन्फेरेंस लगाया जाना है। यह टाइप अनुमान कलन विधि प्राप्त करने के कई अन्य प्रयासों के बिल्कुल विपरीत है, जो अक्सर समाप्ति के संबंध में [[अनिर्णीत समस्या]] होने पर भी [[ एनपी कठिन ]] के रूप में सामने आता है। इस प्रकार एचएम सबसे अच्छा पूर्णतः सूचित टाइप-चेकिंग कलन विधि का प्रदर्शन कर सकता है। यहां टाइप-चेकिंग का मतलब है कि कलन विधि को कोई प्रमाण ढूंढना नहीं है, बल्कि केवल किसी दिए गए प्रमाण को मान्य करना है।
चूँकि कलन विधि में उपयोग की जाने वाली प्रक्रियाओं की लागत लगभग O(1) होती है, कलन विधि की कुल लागत उस अभिव्यक्ति के आकार में रैखिक के करीब होती है जिसके लिए एक टाइप इन्फेरेंस लगाया जाना है। यह टाइप अनुमान कलन विधि प्राप्त करने के कई अन्य प्रयासों के बिल्कुल विपरीत है, जो अक्सर समाप्ति के संबंध में [[अनिर्णीत समस्या]] होने पर भी [[ एनपी कठिन ]] के रूप में सामने आता है। इस टाइप एचएम सबसे अच्छा पूर्णतः सूचित टाइप-चेकिंग कलन विधि का प्रदर्शन कर सकता है। यहां टाइप-चेकिंग का मतलब है कि कलन विधि को कोई प्रमाण ढूंढना नहीं है, बल्कि केवल किसी दिए गए प्रमाण को मान्य करना है।


दक्षता थोड़ी अल्प हो गई है क्योंकि गणना की अनुमति देने के लिए संदर्भ में प्रकार चर के सीमित को बनाए रखना पड़ता है <math>\bar{\Gamma}(\tau)</math> और पुनरावर्ती प्रकार के निर्माण को रोकने के लिए एक घटित जाँच को सक्षम करें <math>union(\alpha,\tau)</math>.
दक्षता थोड़ी अल्प हो गई है क्योंकि गणना की अनुमति देने के लिए संदर्भ में टाइप चर के सीमित को बनाए रखना पड़ता है <math>\bar{\Gamma}(\tau)</math> और पुनरावर्ती टाइप के निर्माण को रोकने के लिए एक घटित जाँच को सक्षम करें <math>union(\alpha,\tau)</math>
ऐसे ही एक मामले का उदाहरण है <math>\lambda\ x.(x\ x)</math>, जिसके लिए एचएम का उपयोग करके कोई प्रकार प्राप्त नहीं किया जा सकता है। व्यावहारिक रूप से, प्रकार केवल छोटे शब्द हैं और विस्तारित संरचनाओं का निर्माण नहीं करते हैं। इस प्रकार, जटिलता विश्लेषण में, कोई उनकी तुलना O(1) लागत को बनाए रखते हुए एक स्थिर मान के रूप में कर सकता है।
ऐसे ही एक मामले का उदाहरण है <math>\lambda\ x.(x\ x)</math>, जिसके लिए एचएम का उपयोग करके कोई टाइप प्राप्त नहीं किया जा सकता है। व्यावहारिक रूप से, टाइप केवल छोटे शब्द हैं और विस्तारित संरचनाओं का निर्माण नहीं करते हैं। इस टाइप, जटिलता विश्लेषण में, कोई उनकी तुलना O(1) लागत को बनाए रखते हुए एक स्थिर मान के रूप में कर सकता है।


== एल्गोरिथ्म साबित करना ==
== कलन विधि साबित करना ==


पिछले अनुभाग में, कलन विधि का रेखाचित्र बनाते समय धातुवैज्ञानिक तर्क के साथ इसके प्रमाण का संकेत दिया गया था। हालांकि यह एक कुशल कलन विधि जे की ओर जाता है, लेकिन यह स्पष्ट नहीं है कि कलन विधि निगमन प्रणाली डी या एस को ठीक से प्रतिबिंबित करता है या नहीं जो सिमेंटिक बेस लाइन के रूप में काम करता है।
पिछले अनुभाग में, कलन विधि का रेखाचित्र बनाते समय धातुवैज्ञानिक तर्क के साथ इसके प्रमाण का संकेत दिया गया था। हालांकि यह एक कुशल कलन विधि जे की ओर जाता है, लेकिन यह स्पष्ट नहीं है कि कलन विधि निगमन प्रणाली डी या एस को ठीक से प्रतिबिंबित करता है या नहीं जो सिमेंटिक बेस लाइन के रूप में काम करता है।
Line 452: Line 422:
संदर्भ से सीमित चर। उदाहरण के लिए, कलन विधि साहसपूर्वक बदलता है
संदर्भ से सीमित चर। उदाहरण के लिए, कलन विधि साहसपूर्वक बदलता है
उदाहरण के लिए अनुमान लगाते समय संदर्भ <math>\lambda f . (f\ 1)</math>,
उदाहरण के लिए अनुमान लगाते समय संदर्भ <math>\lambda f . (f\ 1)</math>,
क्योंकि मोनोटाइप वैरिएबल को पैरामीटर के संदर्भ में जोड़ा गया है <math>f</math> बाद में परिष्कृत करने की आवश्यकता है
क्योंकि मोनोटाइप चर को मापदण्ड के संदर्भ में जोड़ा गया है <math>f</math> बाद में परिष्कृत करने की आवश्यकता है
को <math>int \rightarrow \beta</math> अनुप्रयोग को संभालते समय.
को <math>int \rightarrow \beta</math> अनुप्रयोग को संभालते समय।
समस्या यह है कि निगमन नियम ऐसे परिशोधन की अनुमति नहीं देते हैं।
समस्या यह है कि निगमन नियम ऐसे परिशोधन की अनुमति नहीं देते हैं।
तर्क देते हुए कहा कि इसके स्थान पर पहले भी परिष्कृत प्रकार जोड़ा जा सकता था
तर्क देते हुए कहा कि इसके स्थान पर पहले भी परिष्कृत टाइप जोड़ा जा सकता था
मोनोटाइप वैरिएबल सर्वोत्तम रूप से समीचीन है।
मोनोटाइप चर सर्वोत्तम रूप से समीचीन है।


औपचारिक रूप से संतोषजनक तर्क तक पहुंचने की कुंजी उचित रूप से शामिल करना है
औपचारिक रूप से संतोषजनक तर्क तक पहुंचने की कुंजी उचित रूप से शामिल करना है
परिशोधन के अंतर्गत संदर्भ. औपचारिक रूप से,
परिशोधन के अंतर्गत संदर्भ। औपचारिक रूप से,
टाइपिंग मुक्त टाइप वेरिएबल्स के प्रतिस्थापन के साथ संगत है।
टाइपिंग मुक्त टाइप चर के प्रतिस्थापन के साथ संगत है।


:<math>\Gamma \vdash_S e : \tau \quad\Longrightarrow\quad S \Gamma \vdash_S e : S \tau</math>
:<math>\Gamma \vdash_S e : \tau \quad\Longrightarrow\quad S \Gamma \vdash_S e : S \tau</math>
इस प्रकार मुक्त चरों को परिष्कृत करने का अर्थ है संपूर्ण टाइपिंग को परिष्कृत करना।
इस टाइप मुक्त चरों को परिष्कृत करने का अर्थ है संपूर्ण टाइपिंग को परिष्कृत करना।


=== कलन विधि Ω ===
=== कलन विधि Ω ===
Line 482: Line 452:
प्रक्रिया द्वारा लगाए गए दुष्प्रभाव <math>\textit{union}</math> द्वारा स्पष्ट
प्रक्रिया द्वारा लगाए गए दुष्प्रभाव <math>\textit{union}</math> द्वारा स्पष्ट
प्रतिस्थापनों के माध्यम से इसकी क्रमिक संरचना को व्यक्त करना
प्रतिस्थापनों के माध्यम से इसकी क्रमिक संरचना को व्यक्त करना
<math>S_i</math>. साइडबार में कलन विधि डब्ल्यू की प्रस्तुति अभी भी साइड इफेक्ट्स का उपयोग करती है
<math>S_i</math>साइडबार में कलन विधि डब्ल्यू की प्रस्तुति अभी भी साइड इफेक्ट्स का उपयोग करती है
इटैलिक में सेट किए गए ऑपरेशनों में, लेकिन ये अब जनरेटिंग तक ही सीमित हैं
इटैलिक में सेट किए गए ऑपरेशनों में, लेकिन ये अब जनरेटिंग तक ही सीमित हैं
ताजा प्रतीक. निर्णय का स्वरूप है <math>\Gamma \vdash e : \tau, S</math>,
ताजा प्रतीक। निर्णय का स्वरूप है <math>\Gamma \vdash e : \tau, S</math>,
एक फ़ंक्शन को संदर्भ और अभिव्यक्ति के साथ पैरामीटर के रूप में निरूपित करना एक साथ एक मोनोटाइप का निर्माण करता है
एक फ़ंक्शन को संदर्भ और अभिव्यक्ति के साथ मापदण्ड के रूप में निरूपित करना एक साथ एक मोनोटाइप का निर्माण करता है
एक प्रतिस्थापन. <math>\textsf{mgu}</math> एक दुष्प्रभाव मुक्त संस्करण है
एक प्रतिस्थापन। <math>\textsf{mgu}</math> एक दुष्प्रभाव मुक्त संस्करण है
का <math>\textit{union}</math> एक प्रतिस्थापन का निर्माण जो प्रथम-क्रम शब्दों का एकीकरण (कंप्यूटर विज्ञान)#वाक्यात्मक एकीकरण है।
का <math>\textit{union}</math> एक प्रतिस्थापन का निर्माण जो प्रथम-ऑर्डर शब्दों का एकीकरण (कंप्यूटर विज्ञान)#वाक्यात्मक एकीकरण है।


जबकि कलन विधि W को सामान्यतः HM कलन विधि माना जाता है और है
जबकि कलन विधि W को सामान्यतः HM कलन विधि माना जाता है और है
प्रायः साहित्य में नियम व्यवस्था के बाद सीधे प्रस्तुत किया जाता है, इसका उद्देश्य है
प्रायः साहित्य में नियम व्यवस्था के बाद सीधे प्रस्तुत किया जाता है, इसका उद्देश्य है
मिलनर द्वारा वर्णित<ref name="Milner"/>पी. 369 पर इस प्रकार है:
मिलनर द्वारा वर्णित<ref name="Milner"/>पी। 369 पर इस टाइप है:


: जैसा कि यह खड़ा है, डब्ल्यू शायद ही एक कुशल कलन विधि है; प्रतिस्थापन बहुत बार लागू होते हैं। इसे सुदृढ़ता के प्रमाण में सहायता के लिए तैयार किया गया था। अब हम एक सरल एल्गोरिथ्म J प्रस्तुत करते हैं जो सटीक अर्थों में W का अनुकरण करता है।
: जैसा कि यह खड़ा है, डब्ल्यू शायद ही एक कुशल कलन विधि है; प्रतिस्थापन बहुत बार लागू होते हैं। इसे सुदृढ़ता के प्रमाण में सहायता के लिए तैयार किया गया था। अब हम एक सरल कलन विधि J प्रस्तुत करते हैं जो सटीक अर्थों में W का अनुकरण करता है।


जबकि उन्होंने डब्ल्यू को अधिक जटिल और अल्प कुशल माना, उन्होंने इसे प्रस्तुत किया
जबकि उन्होंने डब्ल्यू को अधिक जटिल और अल्प कुशल माना, उन्होंने इसे प्रस्तुत किया
Line 503: Line 473:
प्रमाण दायित्वों को तैयार करने से पहले, नियम प्रणाली डी और एस और प्रस्तुत कलन विधि के बीच विचलन पर जोर दिया जाना चाहिए।
प्रमाण दायित्वों को तैयार करने से पहले, नियम प्रणाली डी और एस और प्रस्तुत कलन विधि के बीच विचलन पर जोर दिया जाना चाहिए।


जबकि उपरोक्त विकास ने ओपन प्रूफ वेरिएबल्स के रूप में मोनोटाइप्स का दुरुपयोग किया था, इस संभावना को कि उचित मोनोटाइप वेरिएबल्स को नुकसान पहुंचाया जा सकता था, नए वेरिएबल्स पेश करके और सर्वोत्तम की उम्मीद करके दरकिनार कर दिया गया था। लेकिन इसमें एक दिक्कत है: किए गए वादों में से एक यह था कि इन नए बदलावों को इसी तरह ध्यान में रखा जाएगा। यह वादा कलन विधि द्वारा पूरा नहीं किया गया है.
जबकि उपरोक्त विकास ने ओपन प्रूफ चर के रूप में मोनोटाइप्स का दुरुपयोग किया था, इस संभावना को कि उचित मोनोटाइप चर को नुकसान पहुंचाया जा सकता था, नए चर पेश करके और सर्वोत्तम की उम्मीद करके दरकिनार कर दिया गया था। लेकिन इसमें एक दिक्कत है: किए गए वादों में से एक यह था कि इन नए बदलावों को इसी तरह ध्यान में रखा जाएगा। यह वादा कलन विधि द्वारा पूरा नहीं किया गया है।


एक प्रसंग होना <math>1 : int,\ f : \alpha</math>, अभिव्यक्ति <math>f\ 1</math>
एक प्रसंग होना <math>1 : int,\ f : \alpha</math>, अभिव्यक्ति <math>f\ 1</math>
टाइप भी नहीं किया जा सकता <math>\vdash_D</math> या <math>\vdash_S</math>, लेकिन कलन विधि साथ आते हैं
टाइप भी नहीं किया जा सकता <math>\vdash_D</math> या <math>\vdash_S</math>, लेकिन कलन विधि साथ आते हैं
प्ररूप <math>\beta</math>, जहां W अतिरिक्त रूप से प्रतिस्थापन प्रदान करता है <math>\left\{\alpha \mapsto int \rightarrow \beta\right\}</math>,
प्ररूप <math>\beta</math>, जहां W अतिरिक्त रूप से प्रतिस्थापन प्रदान करता है <math>\left\{\alpha \mapsto int \rightarrow \beta\right\}</math>,
इसका मतलब है कि कलन विधि सभी प्रकार की त्रुटियों का पता लगाने में विफल रहता है। इस चूक को अधिक सावधानी से अलग किए गए प्रमाण द्वारा आसानी से ठीक किया जा सकता है
इसका मतलब है कि कलन विधि सभी टाइप की त्रुटियों का पता लगाने में विफल रहता है। इस चूक को अधिक सावधानी से अलग किए गए प्रमाण द्वारा आसानी से ठीक किया जा सकता है
चर और मोनोटाइप चर।
चर और मोनोटाइप चर।


Line 514: Line 484:
जबकि टाइप इन्फेरेंस  को अधिक उचित ढंग से लागू करने से कलन विधि अमूर्त मोनोटाइप से निपटने में सक्षम हो जाता,
जबकि टाइप इन्फेरेंस  को अधिक उचित ढंग से लागू करने से कलन विधि अमूर्त मोनोटाइप से निपटने में सक्षम हो जाता,
इच्छित अनुप्रयोग के लिए उनकी आवश्यकता नहीं थी, जहां पहले से मौजूद संदर्भ में कोई भी आइटम मुफ़्त नहीं है
इच्छित अनुप्रयोग के लिए उनकी आवश्यकता नहीं थी, जहां पहले से मौजूद संदर्भ में कोई भी आइटम मुफ़्त नहीं है
चर। इस प्रकाश में, एक सरल एल्गोरिथ्म के पक्ष में अनावश्यक जटिलता को हटा दिया गया।
चर। इस प्रकाश में, एक सरल कलन विधि के पक्ष में अनावश्यक जटिलता को हटा दिया गया।
शेष नकारात्मक पक्ष यह है कि नियम प्रणाली के संबंध में कलन विधि का प्रमाण अल्प सामान्य है और इसे केवल बनाया जा सकता है
शेष नकारात्मक पक्ष यह है कि नियम प्रणाली के संबंध में कलन विधि का प्रमाण अल्प सामान्य है और इसे केवल बनाया जा सकता है
के साथ संदर्भों के लिए <math>free(\Gamma) = \emptyset</math> एक पार्श्व शर्त के रूप में.
के साथ संदर्भों के लिए <math>free(\Gamma) = \emptyset</math> एक पार्श्व शर्त के रूप में।


<math>
<math>
Line 524: Line 494:
\end{array}
\end{array}
</math>
</math>
पूर्णता दायित्व में साइड कंडीशन यह बताती है कि कैसे निगमन कई प्रकार दे सकती है, जबकि कलन विधि हमेशा एक उत्पन्न करता है। साथ ही, साइड कंडीशन की मांग है कि अनुमानित प्रकार वास्तव में सबसे सामान्य है।
पूर्णता दायित्व में साइड कंडीशन यह बताती है कि कैसे निगमन कई टाइप दे सकती है, जबकि कलन विधि हमेशा एक उत्पन्न करता है। साथ ही, साइड कंडीशन की मांग है कि अनुमानित टाइप वास्तव में सबसे सामान्य है।


दायित्वों को ठीक से साबित करने के लिए पहले उन्हें मजबूत करने की आवश्यकता है ताकि प्रतिस्थापन लेम्मा को सक्रिय करने की अनुमति मिल सके जो प्रतिस्थापन को फैलाता है <math>S</math> द्वारा <math>\vdash_S</math> और <math>\vdash_W</math>. वहां से, प्रमाण अभिव्यक्ति पर प्रेरण द्वारा होते हैं।
दायित्वों को ठीक से साबित करने के लिए पहले उन्हें मजबूत करने की आवश्यकता है ताकि प्रतिस्थापन लेम्मा को सक्रिय करने की अनुमति मिल सके जो प्रतिस्थापन को फैलाता है <math>S</math> द्वारा <math>\vdash_S</math> और <math>\vdash_W</math>वहां से, प्रमाण अभिव्यक्ति पर प्रेरण द्वारा होते हैं।


एक अन्य प्रमाण दायित्व स्वयं प्रतिस्थापन लेम्मा है, यानी टाइपिंग का प्रतिस्थापन, जो अंततः सभी-मात्राकरण स्थापित करता है। बाद को औपचारिक रूप से सिद्ध नहीं किया जा सकता, क्योंकि ऐसा कोई सिंटेक्स उपलब्ध नहीं है।
एक अन्य प्रमाण दायित्व स्वयं प्रतिस्थापन लेम्मा है, यानी टाइपिंग का प्रतिस्थापन, जो अंततः सभी-मात्राकरण स्थापित करता है। बाद को औपचारिक रूप से सिद्ध नहीं किया जा सकता, क्योंकि ऐसा कोई सिंटेक्स उपलब्ध नहीं है।
Line 544: Line 514:


मूल कागज<ref name="Damas"/>दिखाता है कि रिकर्सन को कॉम्बिनेटर द्वारा महसूस किया जा सकता है
मूल कागज<ref name="Damas"/>दिखाता है कि रिकर्सन को कॉम्बिनेटर द्वारा महसूस किया जा सकता है
<math>\mathit{fix}:\forall\alpha.(\alpha\rightarrow\alpha)\rightarrow\alpha</math>. इस प्रकार एक संभावित पुनरावर्ती परिभाषा इस प्रकार तैयार की जा सकती है
<math>\mathit{fix}:\forall\alpha.(\alpha\rightarrow\alpha)\rightarrow\alpha</math>इस टाइप एक संभावित पुनरावर्ती परिभाषा इस टाइप तैयार की जा सकती है
<math>\mathtt{rec}\ v = e_1\ \mathtt{in}\ e_2\ ::=\mathtt{let}\ v = \mathit{fix}(\lambda v.e_1)\ \mathtt{in}\ e_2</math>.
<math>\mathtt{rec}\ v = e_1\ \mathtt{in}\ e_2\ ::=\mathtt{let}\ v = \mathit{fix}(\lambda v.e_1)\ \mathtt{in}\ e_2</math>


वैकल्पिक रूप से अभिव्यक्ति सिंटैक्स का विस्तार और एक अतिरिक्त टाइपिंग नियम संभव है:
वैकल्पिक रूप से अभिव्यक्ति सिंटैक्स का विस्तार और एक अतिरिक्त टाइपिंग नियम संभव है:
Line 564: Line 534:
हालाँकि उपरोक्त सीधा है, इसकी कीमत चुकानी पड़ती है।
हालाँकि उपरोक्त सीधा है, इसकी कीमत चुकानी पड़ती है।


[[ प्रकार सिद्धांत ]] लैम्ब्डा कलन को गणना और तर्क से जोड़ती है।
[[ प्रकार सिद्धांत | टाइप सिद्धांत]] लैम्ब्डा कलन को गणना और तर्क से जोड़ती है।
उपरोक्त आसान संशोधन का दोनों पर प्रभाव पड़ता है:
उपरोक्त आसान संशोधन का दोनों पर प्रभाव पड़ता है:


* [[सामान्यीकरण संपत्ति (सार पुनर्लेखन)]] अमान्य है, क्योंकि गैर-समाप्ति शर्तों को तैयार किया जा सकता है।
* [[सामान्यीकरण संपत्ति (सार पुनर्लेखन)]] अमान्य है, क्योंकि गैर-समाप्ति शर्तों को तैयार किया जा सकता है।
* तर्क संगति क्योंकि प्रकार <math>\forall a. a</math> [[निवास प्रकार]] बन जाता है।
* तर्क संगति क्योंकि टाइप <math>\forall a. a</math> [[निवास प्रकार|निवास टाइप]] बन जाता है।


=== ओवरलोडिंग ===
=== ओवरलोडिंग ===
{{main|Type class}}
{{main|क्लास टाइप}}


ओवरलोडिंग का अर्थ है कि विभिन्न फंक्शन को एक ही नाम से परिभाषित और उपयोग किया जा सकता है। अधिकांश प्रोग्रामिंग भाषाएं न्यूनतम अंतर्निहित अंकगणितीय संचालन (+,<,आदि) के साथ ओवरलोडिंग प्रदान करती हैं, जिससे प्रोग्रामर को अंकगणितीय अभिव्यक्तियों को एक ही रूप में लिखने की अनुमति मिलती है, यहां तक ​​कि विभिन्न संख्यात्मक टाइप के लिए भी <code>int</code> या <code>real</code>. क्योंकि एक ही अभिव्यक्ति के भीतर इन विभिन्न टाइप का मिश्रण भी अंतर्निहित रूपांतरण की मांग करता है, विशेष रूप से इन परिचालनों के लिए ओवरलोडिंग अक्सर प्रोग्रामिंग भाषा में ही निर्मित होती है। कुछ भाषाओं में, इस सुविधा को सामान्यीकृत किया गया है और उपयोगकर्ता के लिए उपलब्ध कराया गया है, उदाहरण के लिए सी++ में.
ओवरलोडिंग का अर्थ है कि विभिन्न फंक्शन को एक ही नाम से परिभाषित और उपयोग किया जा सकता है। अधिकांश प्रोग्रामिंग लैंग्वेज न्यूनतम अंतर्निहित अंकगणितीय संचालन (+,<,आदि) के साथ ओवरलोडिंग प्रदान करती हैं, जिससे प्रोग्रामर को अंकगणितीय अभिव्यक्तियों को एक ही रूप में लिखने की अनुमति मिलती है, यहां तक ​​कि विभिन्न संख्यात्मक टाइप के लिए भी <code>int</code> या <code>real लिखने की अनुमति मिलती है,</code>क्योंकि एक ही अभिव्यक्ति के भीतर इन विभिन्न टाइप का मिश्रण भी अंतर्निहित रूपांतरण की मांग करता है, विशेष रूप से इन परिचालनों के लिए ओवरलोडिंग अक्सर प्रोग्रामिंग लैंग्वेज में ही निर्मित होती है। कुछ लैंग्वेज में, इस सुविधा को सामान्यीकृत किया गया है और उपयोगकर्ता के लिए उपलब्ध कराया गया है, उदाहरण के लिए C++ में है।


जबकि टाइप चेकिंग और अनुमान दोनों में गणना लागत के लिए अभिलक्षकी प्रोग्रामिंग में [[तदर्थ बहुरूपता]] से बचा गया है{{Citation needed|reason=I remember Huet wrote an article on this topic|date=June 2018}}, ओवरलोडिंग को व्यवस्थित करने का एक साधन पेश किया गया है जो फॉर्म और नामकरण दोनों में ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग के समान है, लेकिन एक स्तर ऊपर की ओर काम करता है। इस व्यवस्थित में उदाहरण वस्तु नहीं हैं (अर्थात मान स्तर पर), बल्कि प्रकार हैं।
जबकि टाइप चेकिंग और अनुमान दोनों में गणना लागत के लिए अभिलक्षकी प्रोग्रामिंग में [[तदर्थ बहुरूपता]] से बचा गया है, ओवरलोडिंग को व्यवस्थित करने का साधन पेश किया गया है जो फॉर्म और नामकरण दोनों में ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग के समान है, लेकिन एक स्तर ऊपर की ओर काम करता है। इस व्यवस्थित में उदाहरण वस्तु नहीं हैं (अर्थात मान स्तर पर), बल्कि टाइप हैं। परिचय में उल्लिखित क्विकॉर्ट उदाहरण ऑर्डर में ओवरलोडिंग का उपयोग करता है, जिसमें हास्केल में निम्न टाइप का टिप्पणी होता है:
परिचय में उल्लिखित क्विकॉर्ट उदाहरण ऑर्डर में ओवरलोडिंग का उपयोग करता है, जिसमें हास्केल में निम्न प्रकार का टिप्पणी होता है:
<syntaxhighlight lang="haskell">
<syntaxhighlight lang="haskell">
quickSort :: Ord a => [a] -> [a]
quickSort :: Ord a => [a] -> [a]
</syntaxhighlight>
</syntaxhighlight>
यहाँ, प्रकार <code>a</code> न केवल बहुरूपी है, बल्कि कुछ प्रकार के वर्ग का उदाहरण होने तक भी सीमित है <code>Ord</code>, जो आदेश विधेय प्रदान करता है <code><</code> और <code>>=</code> फ़ंक्शंस बॉडी में उपयोग किया जाता है। इन विधेयों के उचित कार्यान्वयन को अतिरिक्त मापदंडों के रूप में क्विकॉर्ट्स को पास कर दिया जाता है, जैसे ही क्विकॉर्ट का उपयोग अधिक ठोस टाइप पर किया जाता है जो ओवरलोडेड फ़ंक्शन क्विकसॉर्ट का एकल कार्यान्वयन प्रदान करता है।
यहाँ, टाइप <code>a</code> न केवल बहुरूपी है, बल्कि कुछ टाइप के वर्ग <code>Ord का उदाहरण होने तक भी सीमित है</code>ऑर्डर विधेय प्रदान <code><</code> और <code>>=</code> करता है  फ़ंक्शंस बॉडी में उपयोग किया जाता है। इन विधेयों के उचित कार्यान्वयन को अतिरिक्त मापदंडों के रूप में क्विकॉर्ट्स को पास कर दिया जाता है, जैसे ही क्विकॉर्ट का उपयोग अधिक ठोस टाइप पर किया जाता है जो ओवरलोडेड फ़ंक्शन क्विकसॉर्ट का एकल कार्यान्वयन प्रदान करता है।


क्योंकि कक्षाएं केवल एक ही प्रकार को अपने तर्क के रूप में अनुमति देती हैं, परिणामी टाइप प्रणाली अभी भी अनुमान प्रदान कर सकती है। इसके अतिरिक्त, प्रकार की कक्षाओं को किसी प्रकार के ओवरलोडिंग ऑर्डर से सुसज्जित किया जा सकता है, जिससे कक्षाओं को [[ जाली (आदेश) ]] के रूप में व्यवस्थित किया जा सकता है।
क्योंकि "वर्ग" केवल एक ही टाइप को अपने तर्क के रूप में अनुमति देती हैं, परिणामी टाइप प्रणाली अभी भी अनुमान प्रदान कर सकती है। इसके अतिरिक्त, टाइप की वर्ग को किसी टाइप के ओवरलोडिंग ऑर्डर से सुसज्जित किया जा सकता है, जिससे वर्ग को[[ जाली (आदेश) | जाली (ऑर्डर)]] के रूप में व्यवस्थित किया जा सकता है।


=== उच्च-क्रम प्रकार ===
=== उच्च-ऑर्डर टाइप ===
{{Main|Kind (type theory)}}
{{Main|प्रकार (प्रकार सिद्धांत)}}
{{See also|Type class#Higher-kinded polymorphism}}
{{See also|प्रकार वर्ग#उच्च प्रकार का बहुरूपता}}


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


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


एक अतिरिक्त स्तर के हिस्सों को [[ प्रकार (प्रकार सिद्धांत) ]] नामक हास्केल में पेश किया गया है, जहां इसका उपयोग [[मोनाड (कार्यात्मक प्रोग्रामिंग)|मोनाड (अभिलक्षकी प्रोग्रामिंग)]] टाइप करने में मदद के लिए किया जाता है। विस्तारित टाइप प्रणाली के आंतरिक यांत्रिकी में पर्दे के पीछे काम करते हुए, टाइप को अंतर्निहित छोड़ दिया जाता है।
अतिरिक्त स्तर के हिस्सों को को हास्केल नाम के[[ प्रकार (प्रकार सिद्धांत) | टाइप (टाइप सिद्धांत)]] में पेश किया गया है, जहां इसका उपयोग [[मोनाड (कार्यात्मक प्रोग्रामिंग)|मोनाड (अभिलक्षकी प्रोग्रामिंग)]] टाइप करने में मदद के लिए किया जाता है। विस्तारित टाइप प्रणाली के आंतरिक यांत्रिकी में पर्दे के पीछे काम करते हुए, टाइप को अंतर्निहित छोड़ दिया जाता है।


=== उपप्रकार ===
=== उपटाइपिंग ===
{{main|Subtyping}}
{{main|उपटाइपिंग}}


उपप्रकार और टाइप इन्फेरेंस को संयोजित करने के प्रयासों से काफी निराशा हुई है।
उपटाइपिंग और टाइप इन्फेरेंस को संयोजित करने के प्रयासों से काफी निराशा हुई है।उपटाइपिंग व्यवरोध को जमा करना और प्रचारित करना (टाइप समानता व्यवरोध के विपरीत) सरल है, जिससे परिणामी व्यवरोध को अनुमानित टाइपिंग योजनाओं का हिस्सा बना दिया जाता है, उदाहरण के लिए <math>\forall \alpha.\ (\alpha \leq T) \Rightarrow \alpha \rightarrow \alpha</math>, जहाँ <math>\alpha \leq T</math> टाइप चर <math>\alpha</math> पर व्यवरोध है। हालाँकि, क्योंकि टाइप चर अब इस दृष्टिकोण में उत्सुकता से एकीकृत नहीं हैं, यह कई सामान्य टाइप चर और व्यवरोध से युक्त बड़ी और बोझिल टाइपिंग योजनाएं उत्पन्न करता है, जिससे उन्हें पढ़ना और समझना कठिन हो जाता है। इसलिए, ऐसी टाइपिंग योजनाओं और उनकी व्यवरोध को सरल बनाने में काफी प्रयास किए गए, गैर-नियतात्मक परिमित स्वचल प्ररूप (एनएफए) सरलीकरण के समान तकनीकों का उपयोग करना है (अनुमानित पुनरावर्ती टाइप की उपस्थिति में उपयोगी)।<ref>{{cite thesis |last=Pottier |first=François |date=1998 |title=Type Inference in the Presence of Subtyping: from Theory to Practice |url=https://hal.inria.fr/inria-00073205 |access-date=2021-08-10}}</ref> अभी हाल ही में, डोलन और माइक्रॉफ्ट<ref>{{cite conference
उपटाइपिंग बाधाओं को जमा करना और प्रचारित करना (प्रकार समानता बाधाओं के विपरीत) सरल है, जिससे परिणामी बाधाओं को अनुमानित टाइपिंग योजनाओं का हिस्सा बना दिया जाता है,
उदाहरण के लिए <math>\forall \alpha.\ (\alpha \leq T) \Rightarrow \alpha \rightarrow \alpha</math>, जहाँ <math>\alpha \leq T</math> प्रकार चर पर एक बाधा है <math>\alpha</math>.
हालाँकि, क्योंकि प्रकार चर अब इस दृष्टिकोण में उत्सुकता से एकीकृत नहीं हैं, यह कई बेकार प्रकार के चर और बाधाओं से युक्त बड़ी और बोझिल टाइपिंग योजनाएं उत्पन्न करता है, जिससे उन्हें पढ़ना और समझना कठिन हो जाता है।
इसलिए, ऐसी टाइपिंग योजनाओं और उनकी बाधाओं को सरल बनाने में काफी प्रयास किए गए,
गैर-नियतात्मक परिमित ऑटोमेटन (एनएफए) सरलीकरण के समान तकनीकों का उपयोग करना (अनुमानित पुनरावर्ती टाइप की उपस्थिति में उपयोगी)।<ref>{{cite thesis |last=Pottier |first=François |date=1998 |title=Type Inference in the Presence of Subtyping: from Theory to Practice |url=https://hal.inria.fr/inria-00073205 |access-date=2021-08-10}}</ref>
अभी हाल ही में, डोलन और माइक्रॉफ्ट<ref>{{cite conference
   | first = Stephen
   | first = Stephen
   | last = Dolan
   | last = Dolan
Line 612: Line 574:
   | year = 2017
   | year = 2017
   | doi = 10.1145/3009837.3009882
   | doi = 10.1145/3009837.3009882
}}</ref>
}}</ref>टाइपिंग योजना सरलीकरण और एनएफए सरलीकरण के बीच संबंध को औपचारिक रूप दिया गया और दिखाया कि उपटाइपिंग की औपचारिकता पर बीजगणितीय टेक ने एमएल जैसी लैंग्वेज (जिसे एमएलसब कहा जाता है) के लिए कॉम्पैक्ट प्रिंसिपल टाइपिंग योजनाएं तैयार करने की अनुमति दी। विशेष रूप से, उनकी प्रस्तावित टाइपिंग योजना में स्पष्ट व्यवरोध के बजाय संघ और प्रतिच्छेदन टाइप के प्रतिबंधित रूप का उपयोग किया गया था। पार्रेक्स ने बाद में दावा किया<ref>{{cite conference
टाइपिंग योजना सरलीकरण और एनएफए सरलीकरण के बीच संबंध को औपचारिक रूप दिया गया
और दिखाया कि उपटाइपिंग की औपचारिकता पर एक बीजगणितीय टेक ने एमएल जैसी भाषा (जिसे एमएलसब कहा जाता है) के लिए कॉम्पैक्ट प्रिंसिपल टाइपिंग योजनाएं तैयार करने की अनुमति दी।
विशेष रूप से, उनकी प्रस्तावित टाइपिंग योजना में स्पष्ट बाधाओं के बजाय संघ और प्रतिच्छेदन टाइप के प्रतिबंधित रूप का उपयोग किया गया था।
पार्रेक्स ने बाद में दावा किया<ref>{{cite conference
   | first = Lionel
   | first = Lionel
   | last = Parreaux
   | last = Parreaux
Line 624: Line 582:
   | doi = 10.1145/3409006
   | doi = 10.1145/3409006
| doi-access = free
| doi-access = free
   }}</ref>
   }}</ref> यह बीजगणितीय सूत्रीकरण कलन विधि डब्ल्यू से मिलते-जुलते अपेक्षाकृत सरल कलन विधि के बराबर था, और यह कि संयोजन और प्रतिच्छेदन टाइप का उपयोग आवश्यक नहीं था।
यह बीजगणितीय सूत्रीकरण कलन विधि डब्ल्यू से मिलते-जुलते अपेक्षाकृत सरल कलन विधि के बराबर था,
और यह कि यूनियन और इंटरसेक्शन टाइप का उपयोग आवश्यक नहीं था।


दूसरी ओर, ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग भाषाओं के संदर्भ में टाइप इन्फेरेंस अधिक कठिन साबित हुआ है,
दूसरी ओर, ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग लैंग्वेज के संदर्भ में टाइप इन्फेरेंस अधिक कठिन साबित हुआ है, क्योंकि ऑब्जेक्ट विधियों को प्रणाली एफ की शैली में प्रथम श्रेणी बहुरूपता की आवश्यकता होती है (जहां टाइप इन्फेरेंस अनिर्दिष्ट है) और एफ-बद्ध बहुरूपता सुविधाओं के कारण होती है, नतीजतन, ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग को सक्षम करने वाले सबटाइपिंग वाले टाइप प्रणाली, जैसे [[लुका कार्डेली]] का [[ सिस्टम एफ-उप | प्रणाली एफ-उप]] <math>F_{<:}</math>,<ref>{{cite conference
क्योंकि ऑब्जेक्ट विधियों को प्रणाली एफ की शैली में प्रथम श्रेणी बहुरूपता की आवश्यकता होती है (जहां टाइप इन्फेरेंस अनिर्दिष्ट है)
और एफ-बाध्य बहुरूपता जैसी विशेषताओं के कारण।
नतीजतन, ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग को सक्षम करने वाले सबटाइपिंग वाले टाइप प्रणाली, जैसे [[लुका कार्डेली]] का [[ सिस्टम एफ-उप | प्रणाली एफ-उप]] <math>F_{<:}</math>,<ref>{{cite conference
   | first = Luca
   | first = Luca
   | last = Cardelli |author2=Martini, Simone |author3=Mitchell, John C. |author4=Scedrov, Andre
   | last = Cardelli |author2=Martini, Simone |author3=Mitchell, John C. |author4=Scedrov, Andre
Line 642: Line 595:
| doi-access = free
| doi-access = free
   }}
   }}
</ref> एचएम-शैली प्रकार के अनुमान का समर्थन न करें।
</ref> एचएम-शैली टाइप के अनुमान का समर्थन न करें।


[[पंक्ति बहुरूपता]] का उपयोग संरचनात्मक रिकॉर्ड जैसी भाषा सुविधाओं का समर्थन करने के लिए उपटाइपिंग के विकल्प के रूप में किया जा सकता है।<ref> Daan Leijen, ''[https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/scopedlabels.pdf Extensible records with scoped labels]'', Institute of Information and Computing Sciences, Utrecht University, Draft, Revision: 76, July 23, 2005</ref>
[[पंक्ति बहुरूपता]] का उपयोग संरचनात्मक रिकॉर्ड जैसी लैंग्वेज सुविधाओं का समर्थन करने के लिए उपटाइपिंग के विकल्प के रूप में किया जा सकता है।<ref> Daan Leijen, ''[https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/scopedlabels.pdf Extensible records with scoped labels]'', Institute of Information and Computing Sciences, Utrecht University, Draft, Revision: 76, July 23, 2005</ref>हालाँकि बहुरूपता की यह शैली कुछ मायनों में उपटाइपिंग की तुलना में अल्प नम्य है, विशेष रूप से टाइप की व्यवरोध में दिशात्मकता की कमी से निपटने के लिए कड़ाई से आवश्यकता से अधिक बहुरूपता की आवश्यकता होती है, इसका लाभ यह है कि इसे मानक एचएम कलन विधि के साथ काफी आसानी से एकीकृत किया जा सकता है।
हालाँकि बहुरूपता की यह शैली कुछ मायनों में उपप्रकार की तुलना में अल्प लचीली है, विशेष रूप से प्रकार की बाधाओं में दिशात्मकता की कमी से निपटने के लिए कड़ाई से आवश्यकता से अधिक बहुरूपता की आवश्यकता होती है,
इसका लाभ यह है कि इसे मानक एचएम कलन विधि के साथ काफी आसानी से एकीकृत किया जा सकता है।


== टिप्पणियाँ ==
== टिप्पणियाँ ==
Line 661: Line 612:


== बाहरी संबंध ==
== बाहरी संबंध ==
* [https://github.com/wh5a/Algorithm-W-Step-By-Step/blob/master/AlgorithmW.pdf A literate Haskell implementation of Algorithm W] along with its [https://github.com/wh5a/Algorithm-W-Step-By-Step source code on GitHub].
* [https://github.com/wh5a/Algorithm-W-Step-By-Step/blob/master/AlgorithmW.pdf A literate Haskell implementation of Algorithm W] along with its [https://github.com/wh5a/Algorithm-W-Step-By-Step source code on GitHub]
* [https://eli.thegreenplace.net/2018/type-inference/ A simple implementation of Hindley-Milner algorithm in Python].
* [https://eli.thegreenplace.net/2018/type-inference/ A simple implementation of Hindley-Milner algorithm in Python]


{{DEFAULTSORT:Hindley-Milner type system}}[[Category: सिस्टम टाइप करें]] [[Category: प्रकार सिद्धांत]] [[Category: अनुमान प्रकार]] [[Category: लैम्ब्डा कैलकुलस]] [[Category: सैद्धांतिक कंप्यूटर विज्ञान]] [[Category: औपचारिक तरीके]] [[Category: 1969 कंप्यूटिंग में]] [[Category: 1978 कंप्यूटिंग में]] [[Category: 1985 कंप्यूटिंग में]] [[Category: एल्गोरिदम]]  
{{DEFAULTSORT:Hindley-Milner type system}}[[Category: सिस्टम टाइप करें]] [[Category: प्रकार सिद्धांत]] [[Category: अनुमान प्रकार]] [[Category: लैम्ब्डा कैलकुलस]] [[Category: सैद्धांतिक कंप्यूटर विज्ञान]] [[Category: औपचारिक तरीके]] [[Category: 1969 कंप्यूटिंग में]] [[Category: 1978 कंप्यूटिंग में]] [[Category: 1985 कंप्यूटिंग में]] [[Category: एल्गोरिदम]]  

Revision as of 14:09, 18 July 2023

हिंडले-मिलनर (एचएम) टाइप प्रणाली प्राचलिक बहुरूपता के साथ लैम्ब्डा कलन के लिए चिरसम्मत टाइप की प्रणाली है। इसे दमास-मिलनर या दमास-हिंडले-मिलनर के नाम से भी जाना जाता है। इसका वर्णन सबसे पहले जे। रोजर हिंडले ने किया था[1] और बाद में रॉबिन मिलनर द्वारा पुनः खोजा गया था।[2] लुइस दामास ने अपनी पीएचडी थीसिस में विधि का सीमित औपचारिक विश्लेषण और प्रमाण दिया था।[3][4]

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

परिचय

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

मूल सरल रूप से टाइप लैम्ब्डा कलन के लिए टाइप इन्फेरेंस कलन विधि है जिसे 1958 में हास्केल करी और रॉबर्ट फेयस द्वारा तैयार किया गया था। 1969 में, जे। रोजर हिंडले ने इस काम को आगे बढ़ाया और साबित किया कि उनका कलन विधि हमेशा सबसे सामान्य टाइप इन्फेरेंस लगाता है। 1978 में, रॉबिन मिलनर,[5] हिंडले के काम से स्वतंत्र, समतुल्य कलन विधि डब्ल्यू प्रदान किया गया। 1982 में, लुई दामास[4]अंततः साबित हुआ कि मिलनर का कलन विधि पूर्ण है और इसे बहुरूपी संदर्भों वाले प्रणाली का समर्थन करने के लिए विस्तारित किया गया है।

एकरूपता बनाम बहुरूपता

सरलता से टाइप किए गए लैम्ब्डा कलन में, टाइप T या तो परमाणु टाइप के स्थिरांक हैं या फंक्शन टाइप के रूप हैं , ऐसे टाइप एकरूप होते हैं। विशिष्ट उदाहरण अंकगणितीय मानों में प्रयुक्त टाइप हैं:

 3       : Number
 add 3 4 : Number
 add     : Number -> Number -> Number

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

id ≡ λ x ।x

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

जबकि सामान्य तौर पर बहुरूपता का अर्थ है कि ऑपरेशन एक से अधिक टाइप के मानnको स्वीकार करते हैं, यहां प्रयुक्त बहुरूपता प्राचलिक है। साहित्य में टाइप की योजनाओं का उल्लेख भी मिलता है, जो बहुरूपता की प्राचलिक प्रकृति पर जोर देता है। इसके अतिरिक्त, स्थिरांक को (मात्राबद्ध) टाइप के चर के साथ टाइप किया जा सकता है। जैसे:

 cons : forall a । a -> List a -> List a
 nil  : forall a । List a
 id   : forall a । a -> a

बहुरूपी टाइप अपने चरों के लगातार प्रतिस्थापन से एकरूप बन सकते हैं। एकरूप उदाहरणों के उदाहरण हैं:

id'  : String -> String
nil' : List Number

अधिक आम तौर पर, टाइप बहुरूपी होते हैं जब उनमें टाइप चर होते हैं, जबकि उनके बिना टाइप एकरूप होते हैं।

उदाहरण के लिए पास्कल (प्रोग्रामिंग लैंग्वेज) (1970) या सी (प्रोग्रामिंग लैंग्वेज) (1972) में प्रयुक्त टाइप प्रणालियों के विपरीत, जो केवल एकरूप टाइप का समर्थन करते हैं, एचएम को प्राचलिक बहुरूपता पर जोर देने के साथ डिजाइन किया गया है। उल्लिखित लैंग्वेज के उत्तराधिकारी, जैसे C++ (1985), विभिन्न टाइप के बहुरूपता पर ध्यान केंद्रित करते हैं, अर्थात् बहुरूपता (कंप्यूटर विज्ञान) ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग और ओवरलोडिंग के संबंध में उपटाइपिंग हैं। जबकि उपटाइपिंग एचएम के साथ असंगत है, हास्केल के एचएम-आधारित टाइप प्रणाली में व्यवस्थित ओवरलोडिंग का एक टाइप उपलब्ध है।

लेट-पॉलीमोर्फिज्म

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

  (λ id ।  ।।। (id 3) ।।। (id "text") ।।। ) (λ x । x)

दुर्भाग्य से, बहुरूपी लैम्ब्डा कैलकुलस में टाइप इन्फेरेंस निर्णय योग्य नहीं है।[6] इसके बजाय, एचएम फॉर्म का लेट-पॉलीमोर्फिज्म प्रदान करता है

 let id = λ x । x
  in ।।। (id 3) ।।। (id "text") ।।।

अभिव्यक्ति सिंटैक्स के विस्तार में सीमित तंत्र को प्रतिबंधित करना है। केवल लेट निर्माण में सीमित मान तात्कालिकता के अधीन हैं, यानी बहुरूपी हैं, जबकि लैम्ब्डा-अमूर्त में मापदंडों को एकरूप माना जाता है।

सिंहावलोकन

इस लेख का शेष भाग इस टाइप है:

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

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

हिंडले-मिलनर टाइप प्रणाली

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

सिंटेक्स

Expressions
Types
Context and Typing
Free Type Variables

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

टाइप को वाक्यात्मक रूप से दो समूहों, मोनोटाइप्स और पॉलीटाइप्स में विभाजित किया गया है।[note 2]

मोनोटाइप्स

मोनोटाइप हमेशा एक विशेष टाइप को निर्दिष्ट करते हैं। मोनोटाइप्स वाक्यात्मक रूप से टर्म (तर्क) के रूप में दर्शाया जाता है।

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

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

दो मोनोटाइप समान हैं यदि उनके अभिव्यक्ति समान हैं।

पॉलीटाइप्स (बहुप्रकार)

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

पॉलीटाइप वाला फ़ंक्शन एक ही टाइप के किसी भी मान को स्वयं में मैप कर सकता है, और तत्समक फ़ंक्शन इस टाइप के लिए मान है।

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

परिमाण केवल शीर्ष स्तर के दिखाई दे सकते हैं। उदाहरण के लिए, टाइप टाइप के सिंटैक्स द्वारा बाहर रखा गया है। इसके अलावा पॉलीटाइप्स में मोनोटाइप भी शामिल होते हैं, एक टाइप का सामान्य रूप होता है , जहाँ मोनोटाइप है।

पॉलीटाइप्स की समानता परिमाणीकरण को पुन: व्यवस्थित करने और परिमाणित चरों (-रूपांतरण) का नाम बदलने तक है इसके अलावा, मोनोटाइप में नहीं आने वाले परिमाणित चर को हटाया जा सकता है।

प्रसंग और टाइपिंग

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

मुक्त टाइप के चर

टाइप में , मोनोटाइप में प्रतीक टाइप चर सीमित वाला परिमाण है। चर परिमाणित कहलाते हैं और परिमाणित टाइप के चर की कोई भी घटना को सीमित कहा जाता है और सभी अनबाउंड टाइप के चर मुक्त कहलाते हैं। परिमाणीकरण के अतिरिक्त पॉलीटाइप्स में, टाइप चर को संदर्भ में घटित होने से भी बाध्य किया जा सकता है, लेकिन दाईं ओर विपरीत प्रभाव के साथ किया जा सकता है। ऐसे चर तब वहां टाइप स्थिरांक की तरह व्यवहार करते हैं। अंत में, एक टाइप का चर वैध रूप से टाइपिंग में अनबाउंड हो सकता है, जिस स्थिति में वे अंतर्निहित रूप से सभी-मात्राबद्ध होते हैं।

प्रोग्रामिंग लैंग्वेज में सीमित और अनबाउंड दोनों टाइप के चर की उपस्थिति थोड़ी असामान्य है। अक्सर, सभी टाइप के चरों को अंतर्निहित रूप से सर्व-मात्राबद्ध माना जाता है। उदाहरण के लिए, प्रोलॉग में मुक्त चर वाले खंड नहीं हैं। इसी तरह हास्केल में, [note 4] जहां सभी टाइप के चर अंतर्निहित रूप से मात्राबद्ध होते हैं, यानी हास्केल टाइप a -> a यहाँ हैं। दाहिने हाथ की ओर असाइनमेंट का बंधनकारी प्रभाव संबंधित और बहुत ही असामान्य भी है।

आमतौर पर, बाध्य और अनबाउंड दोनों टाइप के चर का मिश्रण एक अभिव्यक्ति में मुक्त चर के उपयोग से उत्पन्न होता है। स्थिरांक फंक्शन K = उदाहरण प्रदान करता है, इसका मोनोटाइप है कोई व्यक्ति बहुरूपता को बलपूर्वक लागू कर सकता है , यहाँ, , टाइप है मुक्त मोनोटाइप चर चर के टाइप से उत्पन्न होता है आसपास के दायरे में बंधा हुआ टाइप है, कोई मुक्त टाइप चर , से सीमित रहें के टाइप में की कल्पना कर सकत है। लेकिन ऐसी गुंजाइश एचएम में व्यक्त नहीं की जा सकती। बल्कि संदर्भ से सीमित का एहसास होता है।

टाइप ऑर्डर

बहुरूपता का अर्थ है कि एक ही अभिव्यक्ति के (संभवतः अनंत रूप से) कई टाइप हो सकते हैं। लेकिन इस टाइप की प्रणाली में, ये टाइप पूरी तरह से असंबंधित नहीं हैं, बल्कि प्राचलिक बहुरूपता द्वारा व्यवस्थित हैं।

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

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

Specialization Rule

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

हमारे पिछले उदाहरण में, प्रतिस्थापन लागू करना परिणाम होगा।

परिमाणित चर के लिए एकरूप (जमीन) टाइप को प्रतिस्थापित करते समय, सीधे तौर पर, पॉलीटाइप को प्रतिस्थापित करने से मुक्त चर की उपस्थिति के कारण कुछ नुकसान होते हैं। विशेष रूप से, अनबाउंड चर को प्रतिस्थापित नहीं किया जाना चाहिए। उन्हें यहां स्थिरांक के रूप में माना जाता है। इसके अतिरिक्त, परिमाणीकरण केवल शीर्ष स्तर पर ही हो सकता है। प्राचलिक टाइप को प्रतिस्थापित करते हुए, किसी को इसके परिमाण को ऊपर उठाना होगा। दाईं ओर की तालिका नियम को सटीक बनाती है।

वैकल्पिक रूप से, परिमाण बिना पॉलीटाइप्स के लिए समतुल्य अंकन पर विचार करें जिसमें परिमाण चर को प्रतीकों के अलग सेट द्वारा दर्शाया जाता है। ऐसे संकेतन में, विशेषज्ञता ऐसे चरों का सादे संगत प्रतिस्थापन में अल्प हो जाती है।

संबंध आंशिक ऑर्डर है और इसका सबसे छोटा तत्व है।

मूल टाइप

जबकि टाइप की योजना का विशेषज्ञता ऑर्डर का उपयोग है, यह टाइप प्रणाली में महत्वपूर्ण दूसरी भूमिका निभाता है। बहुरूपता के साथ टाइप इन्फेरेंस अभिव्यक्ति के सभी संभावित प्रकारों को सारांशित करने की चुनौती का सामना करता है। ऑर्डर गारंटी देता है कि ऐसा सारांश अभिव्यक्ति के सबसे सामान्य टाइप के रूप में मौजूद है।

टाइपिंग में प्रतिस्थापन

ऊपर परिभाषित टाइप ऑर्डर को टाइपिंग तक बढ़ाया जा सकता है क्योंकि टाइपिंग की अंतर्निहित सभी-मात्रा लगातार प्रतिस्थापन को सक्षम बनाती है:

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

यह आलेख चार अलग-अलग नियम सेटों पर चर्चा करेगा:

  1. घोषणात्मक प्रणाली
  2. वाक्यात्मक प्रणाली
  3. कलन विधि J
  4. कलन विधि W

निगमनात्मक प्रणाली

The Syntax of Rules

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

नियमों का उपयोग करने वाला प्रमाण निर्णयों का ऑर्डर है जैसे कि निष्कर्ष से पहले सभी परिसरों को सूचीबद्ध किया जाता है। नीचे दिए गए उदाहरण प्रमाणों का संभावित प्रारूप दिखाते हैं। बाएँ से दाएँ, प्रत्येक पंक्ति निष्कर्ष दर्शाती है या विधेय को स्पष्ट करके, या तो पहले की पंक्ति (संख्या) का संदर्भ देकर लागू नियम और परिसर का, यदि आधार निर्णय है।

टाइपिंग नियम

Declarative Rule System

साइड बॉक्स एचएम टाइप प्रणाली के निगमन नियमों को दर्शाता है। नियमों को मोटे तौर पर दो समूहों में विभाजित किया जा सकता है:

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

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

निम्नलिखित दो उदाहरण क्रियान्वित नियम प्रणाली का प्रयोग करते हैं। चूँकि अभिव्यक्ति और टाइप दोनों दिए गए हैं, वे नियमों का टाइप-जाँच उपयोग हैं।

उदाहरण: के लिए प्रमाण जहाँ ,लिखा जा सकता है

उदाहरण: सामान्यीकरण प्रदर्शित करने के लिए, नीचे दिखाया गया है:

लेट-बहुरूपता

तुरंत दिखाई नहीं देता है, नियम सेट विनियमन को एन्कोड करता है जिसके तहत नियमों और में मोनो- और पॉलीटाइप के थोड़े अलग उपयोग से किसी टाइप को सामान्यीकृत किया जा सकता है या नहीं किया जा सकता है। उसे याद रखो और क्रमशः पॉली- और मोनोटाइप्स को निरूपित करें।

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

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

सामान्यीकरण नियम

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

अनुमान कलन विधि

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

नियमों को चुनने की स्वतंत्रता की डिग्री

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

क्योंकि नियम चयन के संबंध में प्रमाण में एकमात्र विकल्प हैं और जंजीरें, प्रमाण का स्वरूप यह प्रश्न सुझाता है कि क्या इसे और अधिक सटीक बनाया जा सकता है, जहां इन जंजीरों की आवश्यकता नहीं हो सकती है। यह वास्तव में संभव है और एक की ओर ले जाता है नियम प्रणाली का एक टाइप जिसमें ऐसे कोई नियम नहीं हैं।

सिंटैक्स-निर्देशित नियम प्रणाली

Syntactical Rule System
Generalization

एचएम का एक समकालीन उपचार विशुद्ध रूप से सिंटेक्स-निर्देशित नियम प्रणाली का उपयोग करता है मेहरबान[7] एक मध्यवर्ती कदम के रूप में। इस प्रणाली में, विशेषज्ञता सीधे मूल के बाद स्थित होती है नियम और इसमें विलीन हो जाता है, जबकि सामान्यीकरण इसका हिस्सा बन जाता है नियम। वहां सामान्यीकरण है फ़ंक्शन को प्रस्तुत करके हमेशा सबसे सामान्य टाइप का उत्पादन करने के लिए भी निर्धारित किया गया है , जो मात्रा निर्धारित करता है सभी मोनोटाइप चर बाध्य नहीं हैं

औपचारिक रूप से, इस नई नियम प्रणाली को मान्य करने के लिए मूल के समतुल्य है , किसी के पास उसे दिखाने के लिए , जो दो उप-प्रमाणों में विघटित हो जाता है:

  • (गाढ़ापन)
  • (पूर्णता (तर्क))

जबकि नियमों को विघटित करके एकरूपता देखी जा सकती है और का सबूतों में , संभावना यही दिख रही है अधूरा है, जैसे कोई दिखा नहीं सकता में , उदाहरण के लिए, लेकिन केवल । पूर्णता का केवल थोड़ा कमजोर संस्करण ही सिद्ध किया जा सकता है [8] हालाँकि, अर्थात्

तात्पर्य यह है कि, कोई किसी अभिव्यक्ति के लिए मुख्य टाइप प्राप्त कर सकता है हमें अंत में प्रमाण को सामान्यीकृत करने की अनुमति देता है।

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

नियमों को लागू करने वाली स्वतंत्रता की डिग्री

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

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

  • [Abs]: महत्वपूर्ण विकल्प है τ। फिलहाल इस बारे में कुछ पता नहीं चल पाया है τ, इसलिए कोई केवल सबसे सामान्य टाइप ही मान सकता है, जो कि है । योजना यह है कि यदि आवश्यक हो तो टाइप को विशेषज्ञ बनाया जाए। दुर्भाग्य से, इस स्थान पर पॉलीटाइप की अनुमति नहीं है, इसलिए कुछ αफिलहाल करना होगा। अवांछित कैप्चर से बचने के लिए, एक टाइप का चर जो अभी तक प्रूफ़ में नहीं है, एक सुरक्षित विकल्प है। इसके अतिरिक्त, किसी को यह ध्यान में रखना होगा कि यह मोनोटाइप अभी तक तय नहीं हुआ है, लेकिन इसे और परिष्कृत किया जा सकता है।
  • [Var]: चुनाव यह है कि कैसे परिष्कृत किया जाए σ। क्योंकि किसी भी टाइप का कोई भी विकल्प τ यहां चर के उपयोग पर निर्भर करता है, जो स्थानीय रूप से ज्ञात नहीं है, सबसे सुरक्षित दांव सबसे सामान्य है। ऊपर दी गई समान विधि का उपयोग करके सभी मात्रात्मक चर को तुरंत चालू किया जा सकता है σ नए चर मोनोटाइप चर के साथ, उन्हें फिर से आगे के शोधन के लिए विवृत रखा गया है।
  • [Let]: नियम कोई विकल्प नहीं छोड़ता। पूर्ण।
  • [App]: केवल अनुप्रयोग नियम ही अब तक खोले गए चर को परिष्कृत करने के लिए बाध्य कर सकता है, जैसा कि दोनों परिसरों द्वारा आवश्यक है।
    1. पहला आधार अनुमान के परिणाम को प्रपत्र का होने के लिए बाध्य करता है
      • अगर ऐसा है तो ठीक है। कोई भी बाद में इसे चुन सकता है τ'परिणाम के लिए।
      • यदि नहीं, तो यह एक विवृत चर हो सकता है। फिर इसे पहले की तरह दो नए चर के साथ आवश्यक रूप में परिष्कृत किया जा सकता है।
      • अन्यथा, टाइप की जाँच विफल हो जाती है क्योंकि पहले आधार से एक ऐसे टाइप इन्फेरेंस लगाया गया है जो फ़ंक्शन टाइप में नहीं है और न ही बनाया जा सकता है।
    2. दूसरे आधार के लिए आवश्यक है कि अनुमानित टाइप बराबर हो τ पहले परिसर का। अब संभवतः दो अलग-अलग टाइप हैं, शायद खुले टाइप के चर के साथ, तुलना करने के लिए और यदि संभव हो तो बराबर करने के लिए। यदि ऐसा है, तो एक शोधन पाया जाता है, और यदि नहीं, तो एक टाइप की त्रुटि फिर से पाई जाती है। प्रतिस्थापन द्वारा दो शब्दों को समान बनाने के लिए एक प्रभावी विधि ज्ञात है, तथाकथित असंयुक्त-सेट डेटा संरचना के साथ संयोजन में जॉन एलन रॉबिन्सन | रॉबिन्सन का एकीकरण (कंप्यूटिंग) | संयोजन-फाइंड कलन विधि।

संघ-खोज कलन विधि को संक्षेप में संक्षेप में प्रस्तुत करने के लिए, एक प्रमाण में सभी टाइप के सेट को देखते हुए, यह किसी को एक के माध्यम से उन्हें समतुल्य वर्गों में समूहित करने की अनुमति देता है। union प्रक्रिया और ऐसे प्रत्येक वर्ग के लिए एक प्रतिनिधि चुनना find प्रक्रिया। साइड इफेक्ट (कंप्यूटर विज्ञान) के अर्थ में प्रक्रिया (कंप्यूटर विज्ञान) शब्द पर जोर देते हुए, हम एक प्रभावी कलन विधि तैयार करने के लिए स्पष्ट रूप से तर्क के दायरे को छोड़ रहे हैं। ए के प्रतिनिधि इस टाइप निर्धारित किया जाता है कि, यदि दोनों a और b टाइप के चर हैं तो प्रतिनिधि मनमाने ढंग से उनमें से एक है, लेकिन एक चर और एक अभिव्यक्ति को एकजुट करते समय, अभिव्यक्ति प्रतिनिधि बन जाता है। संयोजन-फाइंड के कार्यान्वयन को हाथ में लेते हुए, कोई दो मोनोटाइप्स के एकीकरण को निम्नानुसार तैयार कर सकता है:

एकजुट(ta, tb):
    टा = खोजें(टा)
    टीबी = खोजें(टीबी)
    यदि दोनों ta,tb समान D,n के साथ D p1।।pn रूप के अभिव्यक्ति हैं
        प्रत्येक संगत iवें मापदण्ड के लिए unify(ta[i], tb[i])।
    अन्य
    यदि ta,tb में से न्यूनतम एक एक टाइप का चर है
        संघ(टीए, टीबी)
    अन्य
        त्रुटि 'टाइप मेल नहीं खाते'

अब अनुमान कलन विधि का एक स्केच हाथ में होने से, अगले भाग में एक अधिक औपचारिक प्रस्तुति दी गई है। इसका वर्णन मिलनर में किया गया है[2]पी। 370 एफएफ। कलन विधि जे के रूप में

कलन विधि एक्स

Algorithm J

कलन विधि जे की प्रस्तुति तार्किक नियमों के अंकन का दुरुपयोग है, क्योंकि इसमें दुष्प्रभाव शामिल हैं लेकिन इसके साथ सीधी तुलना की अनुमति मिलती है साथ ही एक कुशल कार्यान्वयन को व्यक्त करते हुए। नियम अब मापदंडों के साथ एक प्रक्रिया निर्दिष्ट करते हैं उपज निष्कर्ष में जहां परिसर का निष्पादन बाएं से दाएं की ओर बढ़ता है।

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

चूँकि कलन विधि में उपयोग की जाने वाली प्रक्रियाओं की लागत लगभग O(1) होती है, कलन विधि की कुल लागत उस अभिव्यक्ति के आकार में रैखिक के करीब होती है जिसके लिए एक टाइप इन्फेरेंस लगाया जाना है। यह टाइप अनुमान कलन विधि प्राप्त करने के कई अन्य प्रयासों के बिल्कुल विपरीत है, जो अक्सर समाप्ति के संबंध में अनिर्णीत समस्या होने पर भी एनपी कठिन के रूप में सामने आता है। इस टाइप एचएम सबसे अच्छा पूर्णतः सूचित टाइप-चेकिंग कलन विधि का प्रदर्शन कर सकता है। यहां टाइप-चेकिंग का मतलब है कि कलन विधि को कोई प्रमाण ढूंढना नहीं है, बल्कि केवल किसी दिए गए प्रमाण को मान्य करना है।

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

कलन विधि साबित करना

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

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

औपचारिक रूप से संतोषजनक तर्क तक पहुंचने की कुंजी उचित रूप से शामिल करना है परिशोधन के अंतर्गत संदर्भ। औपचारिक रूप से, टाइपिंग मुक्त टाइप चर के प्रतिस्थापन के साथ संगत है।

इस टाइप मुक्त चरों को परिष्कृत करने का अर्थ है संपूर्ण टाइपिंग को परिष्कृत करना।

कलन विधि Ω

Algorithm W

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

जबकि कलन विधि W को सामान्यतः HM कलन विधि माना जाता है और है प्रायः साहित्य में नियम व्यवस्था के बाद सीधे प्रस्तुत किया जाता है, इसका उद्देश्य है मिलनर द्वारा वर्णित[2]पी। 369 पर इस टाइप है:

जैसा कि यह खड़ा है, डब्ल्यू शायद ही एक कुशल कलन विधि है; प्रतिस्थापन बहुत बार लागू होते हैं। इसे सुदृढ़ता के प्रमाण में सहायता के लिए तैयार किया गया था। अब हम एक सरल कलन विधि J प्रस्तुत करते हैं जो सटीक अर्थों में W का अनुकरण करता है।

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

प्रमाण दायित्व

प्रमाण दायित्वों को तैयार करने से पहले, नियम प्रणाली डी और एस और प्रस्तुत कलन विधि के बीच विचलन पर जोर दिया जाना चाहिए।

जबकि उपरोक्त विकास ने ओपन प्रूफ चर के रूप में मोनोटाइप्स का दुरुपयोग किया था, इस संभावना को कि उचित मोनोटाइप चर को नुकसान पहुंचाया जा सकता था, नए चर पेश करके और सर्वोत्तम की उम्मीद करके दरकिनार कर दिया गया था। लेकिन इसमें एक दिक्कत है: किए गए वादों में से एक यह था कि इन नए बदलावों को इसी तरह ध्यान में रखा जाएगा। यह वादा कलन विधि द्वारा पूरा नहीं किया गया है।

एक प्रसंग होना , अभिव्यक्ति टाइप भी नहीं किया जा सकता या , लेकिन कलन विधि साथ आते हैं प्ररूप , जहां W अतिरिक्त रूप से प्रतिस्थापन प्रदान करता है , इसका मतलब है कि कलन विधि सभी टाइप की त्रुटियों का पता लगाने में विफल रहता है। इस चूक को अधिक सावधानी से अलग किए गए प्रमाण द्वारा आसानी से ठीक किया जा सकता है चर और मोनोटाइप चर।

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

पूर्णता दायित्व में साइड कंडीशन यह बताती है कि कैसे निगमन कई टाइप दे सकती है, जबकि कलन विधि हमेशा एक उत्पन्न करता है। साथ ही, साइड कंडीशन की मांग है कि अनुमानित टाइप वास्तव में सबसे सामान्य है।

दायित्वों को ठीक से साबित करने के लिए पहले उन्हें मजबूत करने की आवश्यकता है ताकि प्रतिस्थापन लेम्मा को सक्रिय करने की अनुमति मिल सके जो प्रतिस्थापन को फैलाता है द्वारा और । वहां से, प्रमाण अभिव्यक्ति पर प्रेरण द्वारा होते हैं।

एक अन्य प्रमाण दायित्व स्वयं प्रतिस्थापन लेम्मा है, यानी टाइपिंग का प्रतिस्थापन, जो अंततः सभी-मात्राकरण स्थापित करता है। बाद को औपचारिक रूप से सिद्ध नहीं किया जा सकता, क्योंकि ऐसा कोई सिंटेक्स उपलब्ध नहीं है।

एक्सटेंशन

पुनरावर्ती परिभाषाएँ

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

टाइपिंग नियम

मूल कागज[4]दिखाता है कि रिकर्सन को कॉम्बिनेटर द्वारा महसूस किया जा सकता है । इस टाइप एक संभावित पुनरावर्ती परिभाषा इस टाइप तैयार की जा सकती है

वैकल्पिक रूप से अभिव्यक्ति सिंटैक्स का विस्तार और एक अतिरिक्त टाइपिंग नियम संभव है:

जहाँ

मूलतः विलय और जबकि पुनरावर्ती रूप से परिभाषित शामिल है मोनोटाइप स्थितियों में चर जहां वे बाईं ओर होते हैं लेकिन इसके दाईं ओर बहुप्रकार के रूप में।

परिणाम

हालाँकि उपरोक्त सीधा है, इसकी कीमत चुकानी पड़ती है।

टाइप सिद्धांत लैम्ब्डा कलन को गणना और तर्क से जोड़ती है। उपरोक्त आसान संशोधन का दोनों पर प्रभाव पड़ता है:

ओवरलोडिंग

ओवरलोडिंग का अर्थ है कि विभिन्न फंक्शन को एक ही नाम से परिभाषित और उपयोग किया जा सकता है। अधिकांश प्रोग्रामिंग लैंग्वेज न्यूनतम अंतर्निहित अंकगणितीय संचालन (+,<,आदि) के साथ ओवरलोडिंग प्रदान करती हैं, जिससे प्रोग्रामर को अंकगणितीय अभिव्यक्तियों को एक ही रूप में लिखने की अनुमति मिलती है, यहां तक ​​कि विभिन्न संख्यात्मक टाइप के लिए भी int या real लिखने की अनुमति मिलती है,क्योंकि एक ही अभिव्यक्ति के भीतर इन विभिन्न टाइप का मिश्रण भी अंतर्निहित रूपांतरण की मांग करता है, विशेष रूप से इन परिचालनों के लिए ओवरलोडिंग अक्सर प्रोग्रामिंग लैंग्वेज में ही निर्मित होती है। कुछ लैंग्वेज में, इस सुविधा को सामान्यीकृत किया गया है और उपयोगकर्ता के लिए उपलब्ध कराया गया है, उदाहरण के लिए C++ में है।

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

quickSort :: Ord a => [a] -> [a]

यहाँ, टाइप a न केवल बहुरूपी है, बल्कि कुछ टाइप के वर्ग Ord का उदाहरण होने तक भी सीमित हैऑर्डर विधेय प्रदान < और >= करता है फ़ंक्शंस बॉडी में उपयोग किया जाता है। इन विधेयों के उचित कार्यान्वयन को अतिरिक्त मापदंडों के रूप में क्विकॉर्ट्स को पास कर दिया जाता है, जैसे ही क्विकॉर्ट का उपयोग अधिक ठोस टाइप पर किया जाता है जो ओवरलोडेड फ़ंक्शन क्विकसॉर्ट का एकल कार्यान्वयन प्रदान करता है।

क्योंकि "वर्ग" केवल एक ही टाइप को अपने तर्क के रूप में अनुमति देती हैं, परिणामी टाइप प्रणाली अभी भी अनुमान प्रदान कर सकती है। इसके अतिरिक्त, टाइप की वर्ग को किसी टाइप के ओवरलोडिंग ऑर्डर से सुसज्जित किया जा सकता है, जिससे वर्ग को जाली (ऑर्डर) के रूप में व्यवस्थित किया जा सकता है।

उच्च-ऑर्डर टाइप

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

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

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

उपटाइपिंग

उपटाइपिंग और टाइप इन्फेरेंस को संयोजित करने के प्रयासों से काफी निराशा हुई है।उपटाइपिंग व्यवरोध को जमा करना और प्रचारित करना (टाइप समानता व्यवरोध के विपरीत) सरल है, जिससे परिणामी व्यवरोध को अनुमानित टाइपिंग योजनाओं का हिस्सा बना दिया जाता है, उदाहरण के लिए , जहाँ टाइप चर पर व्यवरोध है। हालाँकि, क्योंकि टाइप चर अब इस दृष्टिकोण में उत्सुकता से एकीकृत नहीं हैं, यह कई सामान्य टाइप चर और व्यवरोध से युक्त बड़ी और बोझिल टाइपिंग योजनाएं उत्पन्न करता है, जिससे उन्हें पढ़ना और समझना कठिन हो जाता है। इसलिए, ऐसी टाइपिंग योजनाओं और उनकी व्यवरोध को सरल बनाने में काफी प्रयास किए गए, गैर-नियतात्मक परिमित स्वचल प्ररूप (एनएफए) सरलीकरण के समान तकनीकों का उपयोग करना है (अनुमानित पुनरावर्ती टाइप की उपस्थिति में उपयोगी)।[9] अभी हाल ही में, डोलन और माइक्रॉफ्ट[10]टाइपिंग योजना सरलीकरण और एनएफए सरलीकरण के बीच संबंध को औपचारिक रूप दिया गया और दिखाया कि उपटाइपिंग की औपचारिकता पर बीजगणितीय टेक ने एमएल जैसी लैंग्वेज (जिसे एमएलसब कहा जाता है) के लिए कॉम्पैक्ट प्रिंसिपल टाइपिंग योजनाएं तैयार करने की अनुमति दी। विशेष रूप से, उनकी प्रस्तावित टाइपिंग योजना में स्पष्ट व्यवरोध के बजाय संघ और प्रतिच्छेदन टाइप के प्रतिबंधित रूप का उपयोग किया गया था। पार्रेक्स ने बाद में दावा किया[11] यह बीजगणितीय सूत्रीकरण कलन विधि डब्ल्यू से मिलते-जुलते अपेक्षाकृत सरल कलन विधि के बराबर था, और यह कि संयोजन और प्रतिच्छेदन टाइप का उपयोग आवश्यक नहीं था।

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

पंक्ति बहुरूपता का उपयोग संरचनात्मक रिकॉर्ड जैसी लैंग्वेज सुविधाओं का समर्थन करने के लिए उपटाइपिंग के विकल्प के रूप में किया जा सकता है।[13]हालाँकि बहुरूपता की यह शैली कुछ मायनों में उपटाइपिंग की तुलना में अल्प नम्य है, विशेष रूप से टाइप की व्यवरोध में दिशात्मकता की कमी से निपटने के लिए कड़ाई से आवश्यकता से अधिक बहुरूपता की आवश्यकता होती है, इसका लाभ यह है कि इसे मानक एचएम कलन विधि के साथ काफी आसानी से एकीकृत किया जा सकता है।

टिप्पणियाँ

  1. Hindley–Milner type inference is DEXPTIME-complete. In fact, merely deciding whether an ML program is typeable (without having to infer a type) is itself DEXPTIME-complete. Non-linear behaviour does manifest itself, yet mostly on pathological inputs. Thus the complexity theoretic proofs by Mairson (1990) and Kfoury, Tiuryn & Urzyczyn (1990) came as a surprise to the research community.
  2. Polytypes are called "type schemes" in the original article.
  3. The parametric types were not present in the original paper on HM and are not needed to present the method. None of the inference rules below will take care or even note them. The same holds for the non-parametric "primitive types" in said paper. All the machinery for polymorphic type inference can be defined without them. They have been included here for sake of examples but also because the nature of HM is all about parametric types. This comes from the function type , hard-wired in the inference rules, below, which already has two parameters and has been presented here as only a special case.
  4. Haskell provides the ScopedTypeVariables language extension allowing to bring all-quantified type variables into scope.


संदर्भ

  1. Hindley, J. Roger (1969). "संयोजन तर्क में किसी वस्तु की प्रमुख प्रकार-योजना". Transactions of the American Mathematical Society. 146: 29–60. doi:10.2307/1995158. JSTOR 1995158.
  2. 2.0 2.1 2.2 Milner, Robin (1978). "प्रोग्रामिंग में टाइप पालीमॉर्फिज़्म का एक सिद्धांत". Journal of Computer and System Sciences. 17 (3): 348–374. CiteSeerX 10.1.1.67.5276. doi:10.1016/0022-0000(78)90014-4. S2CID 388583.
  3. Damas, Luis (1985). प्रोग्रामिंग भाषाओं में असाइनमेंट टाइप करें (PhD thesis). University of Edinburgh. hdl:1842/13555. CST-33-85.
  4. 4.0 4.1 4.2 Damas, Luis; Milner, Robin (1982). कार्यात्मक कार्यक्रमों के लिए प्रमुख प्रकार-योजनाएँ (PDF). 9th Symposium on Principles of programming languages (POPL'82). ACM. pp. 207–212. doi:10.1145/582153.582176. ISBN 978-0-89791-065-1.
  5. Milner, Robin (1978), "A Theory of Type Polymorphism in Programming", Journal of Computer and System Sciences, 17 (3): 348–375, doi:10.1016/0022-0000(78)90014-4
  6. Wells, J.B. (1994). "Typability and type checking in the second-order lambda-calculus are equivalent and undecidable". Proceedings of the 9th Annual IEEE Symposium on Logic in Computer Science (LICS). pp. 176–185. doi:10.1109/LICS.1994.316068. ISBN 0-8186-6310-3. S2CID 15078292.
  7. Clement (1986). A Simple Applicative Language: Mini-ML. LFP'86. ACM. doi:10.1145/319838.319847. ISBN 978-0-89791-200-6.
  8. Vaughan, Jeff (July 23, 2008) [May 5, 2005]. "A proof of correctness for the Hindley–Milner type inference algorithm" (PDF). Archived from the original (PDF) on 2012-03-24. {{cite journal}}: Cite journal requires |journal= (help)
  9. Pottier, François (1998). Type Inference in the Presence of Subtyping: from Theory to Practice (Thesis). Retrieved 2021-08-10.
  10. Dolan, Stephen; Mycroft, Alan (2017). "Polymorphism, subtyping, and type inference in MLsub". POPL 2017: Proceedings of the 44th ACM SIGPLAN Symposium on Principles of Programming Languages. doi:10.1145/3009837.3009882.
  11. Parreaux, Lionel (2020). "The Simple Essence of Algebraic Subtyping: Principal Type Inference with Subtyping Made Easy". 25th ACM SIGPLAN International Conference on Functional Programming - ICFP 2020, [Online event], August 24-26, 2020. doi:10.1145/3409006.
  12. Cardelli, Luca; Martini, Simone; Mitchell, John C.; Scedrov, Andre (1994). "An extension of system F with subtyping". Information and Computation, vol. 9. North Holland, Amsterdam. pp. 4–56. doi:10.1006/inco.1994.1013.
  13. Daan Leijen, Extensible records with scoped labels, Institute of Information and Computing Sciences, Utrecht University, Draft, Revision: 76, July 23, 2005


बाहरी संबंध