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

From Vigyanwiki
(text)
No edit summary
 
(15 intermediate revisions by 4 users not shown)
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 19: Line 19:
  |doi=10.1016/0022-0000(78)90014-4
  |doi=10.1016/0022-0000(78)90014-4
  |doi-access= free
  |doi-access= free
  }}</ref> हिंडले के काम से स्वतंत्र, समतुल्य कलन विधि डब्ल्यू प्रदान किया गया। 1982 में, [[लुई दामास]]<ref name="Damas"/>अंततः साबित हुआ कि मिलनर का कलन विधि पूर्ण है और इसे बहुरूपी संदर्भों वाले प्रणाली का समर्थन करने के लिए विस्तारित किया गया है।
  }}</ref> हिंडले के काम से स्वतंत्र, समतुल्य कलन विधि डब्ल्यू प्रदान किया गया। 1982 में, [[लुई दामास]]<ref name="Damas"/>अंततः साबित हुआ कि मिलनर का कलन विधि पूर्ण है और इसे बहुरूपी संदर्भों वाले सिस्टम का समर्थन करने के लिए विस्तारित किया गया है।


=== एकरूपता बनाम बहुरूपता ===
=== एकरूपता बनाम बहुरूपता (पॉलीमॉरफिस्म बनाम मोनोमोर्फिसम) ===
{{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
   'इन'... (आईडी 3) ... (आईडी टेक्स्ट) ...
   '''in''' ।।। (id 3) ।।। (id "text") ।।।


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


== सिंहावलोकन ==
== सिंहावलोकन ==


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


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


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


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


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


=== सिंटेक्स ===
=== सिंटेक्स ===
Line 136: Line 136:
</math>
</math>
|}
|}
टाइप किए जाने वाले भाव बिल्कुल लैम्ब्डा कलन के समान हैं जिन्हें लेट-एक्सप्रेशन के साथ विस्तारित किया गया है जैसा कि आसन्न तालिका में दिखाया गया है। किसी अभिव्यक्ति को स्पष्ट करने के लिए कोष्ठक का उपयोग किया जा सकता है। एप्लिकेशन लेफ्ट-बाइंडिंग है और एब्स्ट्रैक्शन या लेट-इन कंस्ट्रक्शन की तुलना में अधिक मजबूती से बांधता है।
टाइप किए जाने वाले अभिव्यक्ति बिल्कुल लैम्ब्डा कलन के समान हैं जिन्हें लेट-एक्सप्रेशन के साथ विस्तारित किया गया है जैसा कि आसन्न तालिका में दिखाया गया है। किसी अभिव्यक्ति को स्पष्ट करने के लिए कोष्ठक का उपयोग किया जा सकता है। अनुप्रयोग लेफ्ट-सीमित है और एब्स्ट्रैक्शन या लेट-इन कंस्ट्रक्शन की तुलना में अधिक मजबूती से बांधता है।
 
प्रकारों को वाक्यात्मक रूप से दो समूहों, मोनोटाइप्स और पॉलीटाइप्स में विभाजित किया गया है।<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{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{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>\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>, जिसे [[असाइनमेंट (गणितीय तर्क)]], :wikt:धारणा या [[नाम बंधन]] कहा जाता है, प्रत्येक जोड़ी उस मान चर को बताती है <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>\forall</math> प्रकार चर को बांधने वाला क्वांटिफायर है <math>\alpha_i</math> मोनोटाइप में <math>\tau</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|Unification (computer science)#Substitution}}
{{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 200: 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> जो विशेषज्ञता नियम में उनके प्रतिस्थापन को फिर से प्रतिबंधित करता है
कि प्रतिस्थापन सुसंगत होना चाहिए और इसमें संपूर्ण टाइपिंग को शामिल करने की आवश्यकता होगी।


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


:# <math>\vdash_D</math> घोषणात्मक प्रणाली
:# <math>\vdash_D</math> घोषणात्मक सिस्टम
:# <math>\vdash_S</math> वाक्यात्मक प्रणाली
:# <math>\vdash_S</math> वाक्यात्मक सिस्टम
:# <math>\vdash_J</math> कलन विधि एक्स
:# <math>\vdash_J</math> कलन विधि जे
:# <math>\vdash_W</math> कलन विधि
:# <math>\vdash_W</math> कलन विधि डब्ल्यू


=== निगमनात्मक प्रणाली ===
=== निगमनात्मक सिस्टम ===
{| class=infobox
{| class=infobox
|align=center style="background:#e0e0ff"|'''The Syntax of Rules'''
|align=center style="background:#e0e0ff"|'''The Syntax of Rules'''
Line 262: 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 281: Line 255:
  \end{array}</math>
  \end{array}</math>
|}
|}
साइड बॉक्स एचएम टाइप प्रणाली के कटौती नियमों को दर्शाता है। नियमों को मोटे तौर पर दो समूहों में विभाजित किया जा सकता है:
साइड बॉक्स एचएम टाइप सिस्टम के निगमन नियमों को दर्शाता है। नियमों को मोटे तौर पर दो समूहों में विभाजित किया जा सकता है:


पहले चार नियम <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 300: 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 313: 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>[\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>\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>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>
घटित हो सकता है. ऐसी श्रृंखला के निष्कर्ष के बीच भी मौजूद हो सकती है
सर्वोच्च अभिव्यक्ति के लिए प्रमाण और नियम। सभी सबूत होने चाहिए
इतना रेखांकित आकार.


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


=== सिंटैक्स-निर्देशित नियम प्रणाली ===
=== सिंटैक्स-निर्देशित नियम सिस्टम ===
{| class=infobox
{| class=infobox
|align=center style="background:#e0e0ff"|'''Syntactical Rule System'''
|align=center style="background:#e0e0ff"|'''Syntactical Rule System'''
Line 370: Line 324:
</math>
</math>
|}
|}
एचएम का एक समकालीन उपचार विशुद्ध रूप से वाक्यविन्यास-निर्देशित नियम प्रणाली का उपयोग करता है
एचएम का समकालीन उपचार मध्यवर्ती चरण के रूप में क्लेमेंट<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{Let}]</math> नियम का हिस्सा बन जाता है। वहां सामान्यीकरण को फ़ंक्शन <math>\bar{\Gamma}(\tau)</math> को पेश करके हमेशा सबसे सामान्य प्रकार का उत्पादन करने के लिए भी निर्धारित किया जाता है, जो <math>\Gamma</math> में बंधे नहीं सभी मोनोटाइप चर की मात्रा निर्धारित करता है।
मेहरबान<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{Let}]</math> नियम। वहां सामान्यीकरण है
फ़ंक्शन को प्रस्तुत करके हमेशा सबसे सामान्य प्रकार का उत्पादन करने के लिए भी निर्धारित किया गया है <math>\bar{\Gamma}(\tau)</math>, जो मात्रा निर्धारित करता है
सभी मोनोटाइप वैरिएबल बाध्य नहीं हैं <math>\Gamma</math>.


औपचारिक रूप से, इस नई नियम प्रणाली को मान्य करने के लिए <math>\vdash_S</math> मूल के समतुल्य है <math>\vdash_D</math>, किसी के पास
औपचारिक रूप से, इस नई नियम सिस्टम को मान्य करने के लिए <math>\vdash_S</math> मूल <math>\vdash_D</math> के समतुल्य है, किसी के पास उसे दिखाने के लिए <math>\Gamma \vdash_D\ e:\sigma \Leftrightarrow \Gamma \vdash_S\ e:\sigma</math>, जो दो उप-प्रमाणों में विघटित हो जाता है:
उसे दिखाने के लिए <math>\Gamma \vdash_D\ e:\sigma \Leftrightarrow \Gamma \vdash_S\ e:\sigma</math>, जो दो उप-प्रमाणों में विघटित हो जाता है:


* <math>\Gamma \vdash_D\ e:\sigma \Leftarrow \Gamma \vdash_S\ e:\sigma</math> ([[गाढ़ापन]])
* <math>\Gamma \vdash_D\ e:\sigma \Leftarrow \Gamma \vdash_S\ e:\sigma</math> ([[गाढ़ापन|संगतता]])
* <math>\Gamma \vdash_D\ e:\sigma \Rightarrow \Gamma \vdash_S\ e:\sigma</math> (पूर्णता (तर्क))
* <math>\Gamma \vdash_D\ e:\sigma \Rightarrow \Gamma \vdash_S\ e:\sigma</math> (पूर्णता (तर्क))


जबकि नियमों को विघटित करके एकरूपता देखी जा सकती है <math>[\mathtt{Let}]</math> और <math>[\mathtt{Var}]</math>
जबकि स्थिरता को नियम <math>[\mathtt{Let}]</math> और <math>[\mathtt{Var}]</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:\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>
का <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:\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> हालाँकि, अर्थात्


* <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>
  unify(ta, tb):
     टा = खोजें(टा)
     ta = find(ta)
     टीबी = खोजें(टीबी)
     tb = find(tb)
     यदि दोनों ta,tb समान D,n के साथ D p1..pn रूप के पद हैं
     '''if''' both ta,tb are terms of the form D p1..pn with identical D,n '''then'''
        प्रत्येक संगत ''i''वें पैरामीटर के लिए unify(ta[i], tb[i])
        unify(ta[i], tb[i]) for each corresponding ith parameter
     अन्य
     '''else'''
     यदि ta,tb में से कम से कम एक एक प्रकार का चर है
     '''if''' at least one of ta,tb is a type variable '''then'''
         संघ(टीए, टीबी)
         union(ta, tb)
     अन्य
     '''else'''
         त्रुटि 'प्रकार मेल नहीं खाते'
         error 'types do not match'


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


=== कलन विधि एक्स ===
=== कलन विधि जे ===
{| class=infobox
{| class=infobox
|align=center style="background:#e0e0ff"|'''Algorithm J'''
|align=center style="background:#e0e0ff"|'''Algorithm जे'''
|-
|-
| <math>
| <math>
Line 441: Line 382:
</math>
</math>
|}
|}
एल्गोरिथम जे की प्रस्तुति तार्किक नियमों के अंकन का दुरुपयोग है, क्योंकि इसमें दुष्प्रभाव शामिल हैं लेकिन इसके साथ सीधी तुलना की अनुमति मिलती है <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) लागत को बनाए रखते हुए एक स्थिर मान के रूप में कर सकता है।


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


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


उपरोक्त तर्क में सबसे महत्वपूर्ण बिंदु मोनोटाइप का परिशोधन है
उपरोक्त तर्क में सबसे महत्वपूर्ण बिंदु मोनोटाइप का परिशोधन है। उदाहरण के लिए, कलन विधि स्पष्टपूर्वक संदर्भ बदलते समय उदाहरण बदलता है। <math>\lambda f . (f\ 1)</math>, क्योंकि मापदण्ड <math>f</math> के संदर्भ में जोड़ा गया है मोनोटाइप चर को बाद में अनुप्रयोग को संभालते समय <math>int \rightarrow \beta</math>में परिष्कृत करने की आवश्यकता होती है। समस्या यह है कि निगमन नियम ऐसे परिशोधन की अनुमति नहीं देते हैं। यह तर्क देना कि मोनोटाइप चर के अतिरिक्त परिष्कृत प्रकार को पहले जोड़ा जा सकता था, सर्वोत्तम रूप से समीचीन है।
संदर्भ से बंधे चर। उदाहरण के लिए, कलन विधि साहसपूर्वक बदलता है
उदाहरण के लिए अनुमान लगाते समय संदर्भ <math>\lambda f . (f\ 1)</math>,
क्योंकि मोनोटाइप वैरिएबल को पैरामीटर के संदर्भ में जोड़ा गया है <math>f</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>
इस प्रकार मुक्त चरों को परिष्कृत करने का अर्थ है संपूर्ण टाइपिंग को परिष्कृत करना।
इस टाइप मुक्त चरों को परिष्कृत करने का अर्थ संपूर्ण टाइपिंग को परिष्कृत करना है।


=== एल्गोरिथम Ω ===
=== कलन विधि Ω ===
{| class=infobox
{| class=infobox
|align=center style="background:#e0e0ff"|'''Algorithm W'''
|align=center style="background:#e0e0ff"|'''Algorithm डब्ल्यू'''
|-
|-
| <math>
| <math>
Line 484: Line 415:
</math>
</math>
|}
|}
वहां से, एल्गोरिथम J का प्रमाण एल्गोरिथम W की ओर ले जाता है, जो केवल बनाता है
वहां से, कलन विधि जे का प्रमाण कलन विधि डब्ल्यू की ओर ले जाता है, जो केवल <math>S_i</math> के माध्यम से अपनी क्रमिक संरचना को व्यक्त करके प्रक्रिया <math>\textit{union}</math> द्वारा लगाए गए दुष्प्रभावों को स्पष्ट करता है। साइडबार में एल्गोरिदम डब्ल्यू की प्रस्तुति अभी भी इटैलिक में सेट किए गए संचालन में साइड इफेक्ट्स का उपयोग करती है, लेकिन ये अब नए प्रतीकों को उत्पन्न करने तक ही सीमित हैं। निर्णय का स्वरूप <math>\Gamma \vdash e : \tau, S</math> है ,जो संदर्भ और अभिव्यक्ति के साथ फ़ंक्शन को प्रतिस्थापन के साथ मोनोटाइप उत्पन्न करने वाले मापदण्ड के रूप में दर्शाता है। <math>\textsf{mgu}</math> प्रतिस्थापन उत्पन्न करने वाले <math>\textit{union}</math> का दुष्प्रभाव मुक्त संस्करण है जो सबसे सामान्य एकीकरणकर्ता है।
प्रक्रिया द्वारा लगाए गए दुष्प्रभाव <math>\textit{union}</math> द्वारा स्पष्ट
प्रतिस्थापनों के माध्यम से इसकी क्रमिक संरचना को व्यक्त करना
<math>S_i</math>. साइडबार में कलन विधि डब्ल्यू की प्रस्तुति अभी भी साइड इफेक्ट्स का उपयोग करती है
इटैलिक में सेट किए गए ऑपरेशनों में, लेकिन ये अब जनरेटिंग तक ही सीमित हैं
ताजा प्रतीक. निर्णय का स्वरूप है <math>\Gamma \vdash e : \tau, S</math>,
एक फ़ंक्शन को संदर्भ और अभिव्यक्ति के साथ पैरामीटर के रूप में निरूपित करना एक साथ एक मोनोटाइप का निर्माण करता है
एक प्रतिस्थापन. <math>\textsf{mgu}</math> एक दुष्प्रभाव मुक्त संस्करण है
का <math>\textit{union}</math> एक प्रतिस्थापन का निर्माण जो प्रथम-क्रम शब्दों का एकीकरण (कंप्यूटर विज्ञान)#वाक्यात्मक एकीकरण है।


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


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


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


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


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


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


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


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


<math>
<math>
Line 529: Line 444:
\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 539: Line 454:
=== पुनरावर्ती परिभाषाएँ ===
=== पुनरावर्ती परिभाषाएँ ===


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


==== टाइपिंग नियम ====
==== टाइपिंग नियम ====


मूल कागज<ref name="Damas"/>दिखाता है कि रिकर्सन को कॉम्बिनेटर द्वारा महसूस किया जा सकता है
मूल कागज<ref name="Damas"/>दिखाता है कि रिकर्सन को कॉम्बिनेटर द्वारा सिद्ध किया जा सकता है<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>\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>\displaystyle\frac{
: <math>\displaystyle\frac{
Line 559: Line 467:
\Gamma\ \vdash\ \mathtt{rec}\ v_1 = e_1\ \mathtt{and}\ \dots\ \mathtt{and}\ v_n = e_n\ \mathtt{in}\ e:\tau
\Gamma\ \vdash\ \mathtt{rec}\ v_1 = e_1\ \mathtt{and}\ \dots\ \mathtt{and}\ v_n = e_n\ \mathtt{in}\ e:\tau
}\quad[\mathtt{Rec}]</math>
}\quad[\mathtt{Rec}]</math>
कहाँ
जहाँ
* <math>\Gamma' = v_1:\tau_1,\ \dots,\ v_n:\tau_n</math>
* <math>\Gamma' = v_1:\tau_1,\ \dots,\ v_n:\tau_n</math>
* <math>\Gamma'' = v_1:\bar\Gamma(\ \tau_1\ ),\ \dots,\ v_n:\bar\Gamma(\ \tau_n\ )</math>
* <math>\Gamma'' = v_1:\bar\Gamma(\ \tau_1\ ),\ \dots,\ v_n:\bar\Gamma(\ \tau_n\ )</math>
मूलतः विलय <math>[\mathtt{Abs}]</math> और <math>[\mathtt{Let}]</math> जबकि पुनरावर्ती रूप से परिभाषित शामिल है
मूलतः विलय मोनोटाइप स्थितियों में पुनरावर्ती रूप से परिभाषित चर को सम्मिलित करते हुए <math>[\mathtt{Abs}]</math> और <math>[\mathtt{Let}]</math> को विलय करना जहां वे <math>\mathtt{in}</math> के बाईं ओर होते हैं लेकिन इसके दाईं ओर पॉलीटाइप के रूप में होते हैं।
मोनोटाइप स्थितियों में वेरिएबल जहां वे बाईं ओर होते हैं <math>\mathtt{in}</math> लेकिन इसके दाईं ओर बहुप्रकार के रूप में।


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


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


* [[सामान्यीकरण संपत्ति (सार पुनर्लेखन)]] अमान्य है, क्योंकि गैर-समाप्ति शर्तों को तैयार किया जा सकता है।
* [[सामान्यीकरण संपत्ति (सार पुनर्लेखन)|सामान्यीकरण गुण (सार पुनर्लेखन)]] अमान्य है, क्योंकि गैर-समाप्ति शर्तों को तैयार किया जा सकता है।
* तर्क संगति क्योंकि प्रकार <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 617: Line 515:
   | 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 629: Line 523:
   | 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 647: Line 536:
| 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 666: Line 553:


== बाहरी संबंध ==
== बाहरी संबंध ==
* [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 डब्ल्यू] 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: Machine Translated Page]]
[[Category:1969 कंप्यूटिंग में|Hindley-Milner type system]]
[[Category:Created On 11/07/2023]]
[[Category:1978 कंप्यूटिंग में|Hindley-Milner type system]]
[[Category:1985 कंप्यूटिंग में|Hindley-Milner type system]]
[[Category:Articles with hatnote templates targeting a nonexistent page|Hindley-Milner type system]]
[[Category:CS1 errors]]
[[Category:Created On 11/07/2023|Hindley-Milner type system]]
[[Category:Lua-based templates|Hindley-Milner type system]]
[[Category:Machine Translated Page|Hindley-Milner type system]]
[[Category:Pages with script errors|Hindley-Milner type system]]
[[Category:Templates Vigyan Ready|Hindley-Milner type system]]
[[Category:Templates that add a tracking category|Hindley-Milner type system]]
[[Category:Templates that generate short descriptions|Hindley-Milner type system]]
[[Category:Templates using TemplateData|Hindley-Milner type system]]
[[Category:अनुमान प्रकार|Hindley-Milner type system]]
[[Category:एल्गोरिदम|Hindley-Milner type system]]
[[Category:औपचारिक तरीके|Hindley-Milner type system]]
[[Category:प्रकार सिद्धांत|Hindley-Milner type system]]
[[Category:लैम्ब्डा कैलकुलस|Hindley-Milner type system]]
[[Category:सिस्टम टाइप करें|Hindley-Milner type system]]
[[Category:सैद्धांतिक कंप्यूटर विज्ञान|Hindley-Milner type system]]

Latest revision as of 12:20, 28 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. कलन विधि जे
  4. कलन विधि डब्ल्यू

निगमनात्मक सिस्टम

The Syntax of Rules

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

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

टाइपिंग नियम

Declarative Rule System

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

सिंटैक्स-निर्देशित नियम सिस्टम

Syntactical Rule System
Generalization

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

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

  • (संगतता)
  • (पूर्णता (तर्क))

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

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

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

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

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

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

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

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

unify(ta, tb):
    ta = find(ta)
    tb = find(tb)
    if both ta,tb are terms of the form D p1..pn with identical D,n then
        unify(ta[i], tb[i]) for each corresponding ith parameter
    else
    if at least one of ta,tb is a type variable then
        union(ta, tb)
    else
        error 'types do not match'

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

कलन विधि जे

Algorithm जे

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

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

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

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

कलन विधि सिद्ध करना

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

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

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

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

कलन विधि Ω

Algorithm डब्ल्यू

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

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

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

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

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

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

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

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

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

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

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

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

एक्सटेंशन

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

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

टाइपिंग नियम

मूल कागज[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


बाहरी संबंध