हिंडले-मिलनर टाइप सिस्टम: Difference between revisions
(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 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 में, जे. रोजर हिंडले ने इस काम को आगे बढ़ाया और साबित किया कि उनका कलन विधि हमेशा सबसे सामान्य | मूल सरल रूप से टाइप लैम्ब्डा कलन के लिए टाइप इन्फेरेंस कलन विधि है जिसे 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>, ऐसे टाइप एकरूप होते हैं। विशिष्ट उदाहरण अंकगणितीय मानों में प्रयुक्त टाइप हैं: | ||
3 : Number | 3 : Number | ||
Line 30: | Line 30: | ||
add : Number -> Number -> Number | add : Number -> Number -> Number | ||
इसके विपरीत, अनटाइप्ड लैम्ब्डा कलन टाइपिंग के लिए बिल्कुल भी तटस्थ है, और इसके कई फंक्शन को सभी | इसके विपरीत, अनटाइप्ड लैम्ब्डा कलन टाइपिंग के लिए बिल्कुल भी तटस्थ है, और इसके कई फंक्शन को सभी टाइप के तर्कों पर सार्थक रूप से लागू किया जा सकता है। तुच्छ उदाहरण तत्समक फ़ंक्शन है | ||
:id ≡ λ x | :id ≡ λ x ।x | ||
जो जिस भी मान पर लागू होता है, उसे वापस लौटा देता है। | जो जिस भी मान पर लागू होता है, उसे वापस लौटा देता है। अल्प तुच्छ उदाहरणों में [[सूची (कंप्यूटर विज्ञान)]] जैसे प्राचलिक टाइप सम्मिलित हैं। | ||
जबकि सामान्य तौर पर बहुरूपता का अर्थ है कि ऑपरेशन एक से अधिक | जबकि सामान्य तौर पर बहुरूपता का अर्थ है कि ऑपरेशन एक से अधिक टाइप के मान n को स्वीकार करते हैं, यहां प्रयुक्त बहुरूपता प्राचलिक है। साहित्य में टाइप की योजनाओं का उल्लेख भी मिलता है, जो बहुरूपता की प्राचलिक प्रकृति पर जोर देता है। इसके अतिरिक्त, स्थिरांक को (मात्राबद्ध) टाइप के चर के साथ टाइप किया जा सकता है। जैसे: | ||
cons : forall a | cons : forall a । a -> List a -> List a | ||
nil : forall a | nil : forall a । List a | ||
id : forall a | id : forall a । a -> a | ||
बहुरूपी | बहुरूपी टाइप अपने चरों के लगातार प्रतिस्थापन से एकरूप बन सकते हैं। एकरूप उदाहरणों के उदाहरण हैं: | ||
id' : String -> String | id' : String -> String | ||
nil' : List Number | nil' : List Number | ||
अधिक | अधिक सामान्यतः, टाइप बहुरूपी होते हैं जब उनमें टाइप चर होते हैं, जबकि उनके बिना टाइप एकरूप होते हैं। | ||
उदाहरण के लिए [[पास्कल (प्रोग्रामिंग भाषा)]] (1970) या [[सी (प्रोग्रामिंग भाषा)]] (1972) में प्रयुक्त | उदाहरण के लिए [[पास्कल (प्रोग्रामिंग भाषा)|पास्कल (प्रोग्रामिंग लैंग्वेज)]] (1970) या [[सी (प्रोग्रामिंग भाषा)|सी (प्रोग्रामिंग लैंग्वेज)]] (1972) में प्रयुक्त टाइप प्रणालियों के विपरीत, जो केवल एकरूप टाइप का समर्थन करते हैं, एचएम को प्राचलिक बहुरूपता पर जोर देने के साथ डिजाइन किया गया है। उल्लिखित लैंग्वेज के उत्तराधिकारी, जैसे [[C++]] (1985), विभिन्न टाइप के बहुरूपता पर ध्यान केंद्रित करते हैं, अर्थात् बहुरूपता (कंप्यूटर विज्ञान) [[ ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग |ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] और ओवरलोडिंग के संबंध में उपटाइपिंग हैं। जबकि उपटाइपिंग एचएम के साथ असंगत है, हास्केल के एचएम-आधारित टाइप सिस्टम में व्यवस्थित ओवरलोडिंग का एक टाइप उपलब्ध है। | ||
=== लेट- | === लेट-पॉलीमोर्फिज्म === | ||
सरल रूप से टाइप किए गए लैम्ब्डा कलन के | सरल रूप से टाइप किए गए लैम्ब्डा कलन के टाइप इन्फेरेंस को बहुरूपता की ओर विस्तारित करते समय, किसी को यह परिभाषित करना होगा कि किसी मान का उदाहरण प्राप्त करना कब स्वीकार्य है। आदर्श रूप से, किसी बाध्य चर के किसी भी उपयोग के साथ इसकी अनुमति दी जाएगी, जैसे: | ||
(λ id | (λ 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> इसके | </ref> इसके अतिरिक्त, एचएम फॉर्म का लेट-पॉलीमोर्फिज्म प्रदान करता है | ||
' | '''let''' id = λ x । x | ||
' | '''in''' ।।। (id 3) ।।। (id "text") ।।। | ||
अभिव्यक्ति सिंटैक्स के विस्तार में | अभिव्यक्ति सिंटैक्स के विस्तार में सीमित तंत्र को प्रतिबंधित करना है। केवल लेट निर्माण में सीमित मान तात्कालिकता के अधीन हैं, अर्थात बहुरूपी हैं, जबकि लैम्ब्डा-अमूर्त में मापदंडों को एकरूप माना जाता है। | ||
== सिंहावलोकन == | == सिंहावलोकन == | ||
इस लेख का शेष भाग इस | इस लेख का शेष भाग इस टाइप है: | ||
* एचएम टाइप | * एचएम टाइप सिस्टम परिभाषित की गई है। यह निगमन सिस्टम का वर्णन करके किया जाता है जो सटीक बनाता है कि कौन से अभिव्यक्ति किस टाइप के हैं, यदि कोई हो। | ||
* वहां से, यह टाइप इन्फेरेंस | * वहां से, यह टाइप इन्फेरेंस विधि के कार्यान्वयन की दिशा में काम करता है। उपरोक्त निगमनात्मक सिस्टम का सिंटैक्स-संचालित संस्करण पेश करने के बाद, यह एक कुशल कार्यान्वयन (कलन विधि जे) का रेखाचित्र बनाता है, जो पाठक के धातु संबंधी अंतर्ज्ञान को आकर्षित करता है। | ||
* क्योंकि यह | * क्योंकि यह विवृत रहता है कलन विधि जे वास्तव में प्रारंभिक निगमन सिस्टम का एहसास करता है, अल्प कुशल कार्यान्वयन (कलन विधि डब्ल्यू) पेश किया जाता है और प्रमाण में इसके उपयोग का संकेत दिया जाता है। | ||
* अंत में, | * अंत में, कलन विधि से संबंधित अन्य विषयों पर चर्चा की गई है। | ||
निगमन सिस्टम का एक ही विवरण, यहां तक कि दो कलन विधि के लिए भी उपयोग किया जाता है, जिससे कि एचएम पद्धति को प्रस्तुत किए जाने वाले विभिन्न रूपों को सीधे तुलनीय बनाया जा सके। | |||
== हिंडले-मिलनर टाइप | == हिंडले-मिलनर टाइप सिस्टम == | ||
टाइप | टाइप सिस्टम को [[औपचारिक व्याकरण|सिंटेक्स नियमों]] द्वारा औपचारिक रूप से वर्णित किया जा सकता है जो अभिव्यक्तियों, टाइप आदि के लिए लैंग्वेज तय करता है। इस तरह के सिंटेक्स की यहां प्रस्तुति बहुत औपचारिक नहीं है, इसमें इसे बहिस्तलीय व्याकरण का अध्ययन करने के लिए नहीं लिखा गया है, बल्कि [[सार वाक्यविन्यास|सिंटेक्स सार]], और कुछ वाक्यात्मक विवरण विवृत छोड़ देता है। प्रस्तुति का यह रूप सामान्य है। इसके आधार पर, [[टाइपिंग नियम]] का उपयोग यह परिभाषित करने के लिए किया जाता है कि अभिव्यक्ति और टाइप कैसे संबंधित हैं। पहले की तरह, उपयोग किया गया फॉर्म थोड़ा उदार है। | ||
=== सिंटेक्स === | === सिंटेक्स === | ||
Line 136: | Line 136: | ||
</math> | </math> | ||
|} | |} | ||
टाइप किए जाने वाले | टाइप किए जाने वाले अभिव्यक्ति बिल्कुल लैम्ब्डा कलन के समान हैं जिन्हें लेट-एक्सप्रेशन के साथ विस्तारित किया गया है जैसा कि आसन्न तालिका में दिखाया गया है। किसी अभिव्यक्ति को स्पष्ट करने के लिए कोष्ठक का उपयोग किया जा सकता है। अनुप्रयोग लेफ्ट-सीमित है और एब्स्ट्रैक्शन या लेट-इन कंस्ट्रक्शन की तुलना में अधिक मजबूती से बांधता है। | ||
टाइप को वाक्यात्मक रूप से दो समूहों, मोनोटाइप्स और पॉलीटाइप्स में विभाजित किया गया है।<ref group="note">Polytypes are called "type schemes" in the original article.</ref> | |||
==== मोनोटाइप्स ==== | ==== मोनोटाइप्स ==== | ||
मोनोटाइप हमेशा एक विशेष | मोनोटाइप हमेशा एक विशेष टाइप को निर्दिष्ट करते हैं। मोनोटाइप्स <math>\tau</math> वाक्यात्मक रूप से टर्म (तर्क) के रूप में दर्शाया जाता है। | ||
मोनोटाइप के उदाहरणों में | मोनोटाइप के उदाहरणों में टाइप स्थिरांक सम्मिलित हैं <math>\mathtt{int}</math> या <math>\mathtt{string}</math>, और प्राचलिक टाइप जैसे <math>\mathtt{Map\ (Set\ string)\ int}</math>। बाद वाले टाइप टाइप के फंक्शन के ''अनुप्रयोगों'' के उदाहरण हैं, उदाहरण के लिए, सेट से <math> \{ \mathtt{Map^2,\ Set^1,\ string^0,\ int^0},\ \rightarrow^2 \} </math>, जहां सुपरस्क्रिप्ट टाइप के मापदंडों की संख्या को इंगित करता है। टाइप के फंक्शन का पूरा सेट <math>C</math> एचएम में यादृच्छिक है,<ref group="note">The parametric types <math>C\ \tau\dots\tau</math> were not present in the original paper on HM and are not needed to present the method. None of the inference rules below will take care or even note them. The same holds for the non-parametric "primitive types" in said paper. All the machinery for polymorphic type inference can be defined without them. They have been included here for sake of examples but also because the nature of HM is all about parametric types. This comes from the function type <math>\tau\rightarrow\tau</math>, hard-wired in the inference rules, below, which already has two parameters and has been presented here as only a special case.</ref> सिवाय इसके कि इसमें न्यूनतम <math>\rightarrow^2</math>, फंक्शन का टाइप सम्मिलित होना चाहिए। सुविधा के लिए इसे अधिकांशतः मध्यप्रत्यय संकेतन में लिखा जाता है। उदाहरण के लिए, पूर्णांकों को स्ट्रिंग्स से मैप करने वाले फ़ंक्शन का टाइप <math>\mathtt{int}\rightarrow \mathtt{string}</math> होता है, फिर से, कोष्ठक का उपयोग किसी टाइप की अभिव्यक्ति को स्पष्ट करने के लिए किया जा सकता है। अनुप्रयोग मध्यप्रत्यय एरो की तुलना में अधिक मजबूती से सीमित होता है, जो राइट-सीमित है। | ||
<math> \{ \mathtt{Map^2,\ Set^1,\ string^0,\ int^0},\ \rightarrow^2 \} </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>\alpha</math>-रूपांतरण) का नाम बदलने तक है इसके अलावा, मोनोटाइप में नहीं आने वाले परिमाणित चर को हटाया जा सकता है। | |||
==== प्रसंग और टाइपिंग ==== | ==== प्रसंग और टाइपिंग ==== | ||
अभी भी असंबद्ध भागों ( | अभी भी असंबद्ध भागों (सिंटेक्स अभिव्यक्ति और टाइप) को सार्थक रूप से एक साथ लाने के लिए तीसरे भाग की आवश्यकता है: संदर्भ वाक्यात्मक रूप से, संदर्भ युग्म की सूची है <math>x:\sigma</math>, जिसे [[असाइनमेंट (गणितीय तर्क)]], धारणा या [[नाम बंधन|सीमित]] कहा जाता है, प्रत्येक युग्म उस मान चर <math>x_i</math>को बताती है टाइप है <math>\sigma_i.</math> तीनों भाग मिलकर फॉर्म का ''टाइपिंग निर्णय'' देते हैं <math>\Gamma\ \vdash\ e:\sigma</math>, यह बताते हुए कि धारणाओं के अनुसार <math>\Gamma</math>, अभिव्यक्ति <math>e</math>, <math>\sigma</math> टाइप है। | ||
==== मुक्त | ==== मुक्त टाइप के चर ==== | ||
टाइप में <math>\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> असाइनमेंट का बंधनकारी प्रभाव संबंधित और बहुत ही असामान्य भी है। | ||
सामान्यतः, बाध्य और अनबाउंड दोनों टाइप के चर का मिश्रण एक अभिव्यक्ति में मुक्त चर के उपयोग से उत्पन्न होता है। स्थिरांक फंक्शन K = <math>\lambda x.\lambda y. x</math> उदाहरण प्रदान करता है, इसका मोनोटाइप <math>\alpha\rightarrow\beta\rightarrow\alpha</math> है कोई व्यक्ति बहुरूपता को बलपूर्वक लागू कर सकता है <math>\mathbf{let}\ k = \lambda x. (\mathbf{let}\ f = \lambda y.x\ \mathbf{in}\ f)\ \mathbf{in}\ k</math>, यहाँ, <math>f</math>, <math>\forall \gamma.\gamma\rightarrow\alpha</math> टाइप है मुक्त मोनोटाइप चर <math>\alpha</math> चर <math>x</math> के टाइप से उत्पन्न होता है आसपास के दायरे में बंधा हुआ <math>k</math> <math>\forall\alpha\forall\beta.\alpha\rightarrow\beta\rightarrow\alpha</math> टाइप है, कोई मुक्त टाइप चर <math>\alpha</math>, <math>f</math> से सीमित रहें <math>\forall\alpha</math> के टाइप में <math>k</math> की कल्पना कर सकत है। लेकिन ऐसी गुंजाइश एचएम में व्यक्त नहीं की जा सकती। बल्कि संदर्भ से सीमित का एहसास होता है। | |||
=== ऑर्डर | === टाइप ऑर्डर === | ||
{{main| | {{main|एकीकरण (कंप्यूटर विज्ञान)#प्रतिस्थापन}} | ||
बहुरूपता का अर्थ है कि एक ही अभिव्यक्ति के (संभवतः अनंत रूप से) कई | बहुरूपता का अर्थ है कि एक ही अभिव्यक्ति के (संभवतः अनंत रूप से) कई टाइप हो सकते हैं। लेकिन इस टाइप की सिस्टम में, ये टाइप पूरी तरह से असंबंधित नहीं हैं, बल्कि प्राचलिक बहुरूपता द्वारा व्यवस्थित हैं। | ||
उदाहरण के तौर पर, | उदाहरण के तौर पर, तत्समक <math>\lambda x . x</math>, <math>\forall | ||
\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>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 | ||
\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>\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_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> या विधेय को स्पष्ट करके, या तो पहले की पंक्ति (संख्या) का संदर्भ देकर लागू नियम और परिसर का, यदि आधार निर्णय है। | ||
==== टाइपिंग नियम ==== | ==== टाइपिंग नियम ==== | ||
{{see also| | {{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{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>\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>\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>\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> | |||
प्रमाण का | |||
जहां इन | |||
=== सिंटैक्स-निर्देशित नियम | === सिंटैक्स-निर्देशित नियम सिस्टम === | ||
{| 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> में बंधे नहीं सभी मोनोटाइप चर की मात्रा निर्धारित करता है। | ||
और | |||
फ़ंक्शन | |||
औपचारिक रूप से, इस नई नियम | औपचारिक रूप से, इस नई नियम सिस्टम को मान्य करने के लिए <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>\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>\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_D</math> और <math>\vdash_S</math>, की तुलना अब सभी नियमों के निर्णयों में केवल मोनोटाइप ही दिखाई देते हैं। इसके अतिरिक्त, निगमन सिस्टम के साथ किसी भी संभावित प्रमाण का आकार अब अभिव्यक्ति के आकार के समान है। इस टाइप अभिव्यक्ति पूरी तरह से प्रमाण के आकार को निर्धारित करती है। <math>\vdash_D</math> में आकार संभवतः सभी नियमों को छोड़कर अन्य नियमों के अनुसार निर्धारित किया जाएगा <math>[\mathtt{Inst}]</math> और <math>[\mathtt{Gen}]</math>, जो अन्य नोड्स के बीच मनमाने ढंग से लंबी शाखाएं (चेन) बनाने की अनुमति देता है। | |||
=== नियमों को लागू करने वाली स्वतंत्रता की डिग्री === | === नियमों को लागू करने वाली स्वतंत्रता की डिग्री === | ||
अब जब प्रमाण का आकार ज्ञात हो गया है, तो | अब जब प्रमाण का आकार ज्ञात हो गया है, तो पहले से ही टाइप इन्फेरेंस कलन विधि को तैयार करने के करीब है। क्योंकि किसी दिए गए अभिव्यक्ति के लिए किसी भी प्रमाण का आकार समान होना चाहिए, कोई यह मान सकता है कि प्रमाण के निर्णयों में मोनोटाइप्स अनिर्धारित हैं और विचार कर सकते हैं कि उन्हें कैसे निर्धारित किया जाए। | ||
क्योंकि किसी दिए गए अभिव्यक्ति के लिए किसी भी प्रमाण का आकार समान होना चाहिए, कोई | |||
यहां, प्रतिस्थापन (विशेषज्ञता) | यहां, प्रतिस्थापन (विशेषज्ञता) ऑर्डर चलन में आता है। हालाँकि पहली नज़र में कोई भी स्थानीय रूप से टाइप को निर्धारित नहीं कर सकता है, आशा है कि प्रमाण ट्री को पार करते समय ऑर्डर की सहायता से उन्हें परिष्कृत करना संभव है, इसके अतिरिक्त यह मानते हुए, क्योंकि परिणामी कलन विधि अनुमान विधि बनना है, कि किसी भी परिसर का टाइप सर्वोत्तम संभव के रूप में निर्धारित किया जाएगा। और वास्तव में, कोई ऐसा कर सकता है, जैसा कि <math>\vdash_S</math> के नियमों को देखने से पता चलता है: | ||
* {{math|{{bracket|{{var|Abs}}}}}}: महत्वपूर्ण विकल्प | * {{math|{{bracket|{{var|Abs}}}}}}: महत्वपूर्ण विकल्प {{mvar|τ}} है। इस बिंदु पर, {{mvar|τ}} के बारे में कुछ भी ज्ञात नहीं है, इसलिए कोई केवल सबसे सामान्य प्रकार मान सकता है, जो कि <math>\forall \alpha . \alpha</math> है। योजना यह है कि यदि आवश्यक हो तो टाइप को विशेषज्ञ बनाया जाए। दुर्भाग्य से, इस स्थान पर पॉलीटाइप की अनुमति नहीं है, इसलिए कुछ {{mvar|α}} फिलहाल करना होगा। अवांछित कैप्चर से बचने के लिए, टाइप का चर जो अभी तक प्रूफ़ में नहीं है, एक सुरक्षित विकल्प है। इसके अतिरिक्त, किसी को यह ध्यान में रखना होगा कि यह मोनोटाइप अभी तक तय नहीं हुआ है, लेकिन इसे और परिष्कृत किया जा सकता है। | ||
* {{math|{{bracket|{{var|Var}}}}}}: चुनाव यह है कि | * {{math|{{bracket|{{var|Var}}}}}}: चुनाव यह है कि {{mvar|σ}} को कैसे परिष्कृत किया जाए। क्योंकि यहां टाइप {{mvar|τ}} का कोई भी विकल्प चर के उपयोग पर निर्भर करता है, जो स्थानीय रूप से ज्ञात नहीं है, सबसे सुरक्षित दांव सबसे सामान्य है। ऊपर दी गई समान विधि का उपयोग करके {{mvar|σ}} सभी मात्रात्मक चर को नए मोनोटाइप चर के साथ तुरंत चालू किया जा सकता है, फिर से उन्हें आगे के शोधन के लिए खुला रखा जा सकता है। | ||
* {{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|τ'}} चुन सकता है। | ||
*#* यदि नहीं, तो यह | *#* यदि नहीं, तो यह विवृत चर हो सकता है। फिर इसे पहले की तरह दो नए चर के साथ आवश्यक रूप में परिष्कृत किया जा सकता है। | ||
*#* अन्यथा, | *#* अन्यथा, टाइप की जाँच विफल हो जाती है क्योंकि पहले आधार से एक ऐसे टाइप इन्फेरेंस लगाया गया है जो फ़ंक्शन टाइप में नहीं है और न ही बनाया जा सकता है। | ||
*# दूसरे आधार के लिए आवश्यक है कि अनुमानित प्रकार | *# दूसरे आधार के लिए आवश्यक है कि अनुमानित प्रकार पहले आधार के {{mvar|τ}} के बराबर हो। अब संभवतः दो अलग-अलग प्रकार हैं, शायद खुले टाइप के चर के साथ, तुलना करने के लिए और यदि संभव हो तो बराबर करने के लिए। यदि ऐसा है, तो शोधन पाया जाता है, और यदि नहीं, तो टाइप की त्रुटि फिर से पाई जाती है। प्रतिस्थापन द्वारा दो शब्दों को समान बनाने के लिए एक प्रभावी विधि ज्ञात है, तथाकथित [[असंयुक्त-सेट डेटा संरचना]] के साथ संयोजन में रॉबिन्सन के [[एकीकरण (कंप्यूटिंग)]] को प्रतिस्थापन द्वारा "दो शब्दों को बराबर बनाने" के लिए एक प्रभावी विधि के रूप में जाना जाता है। | ||
संघ-खोज | संघ-खोज कलन विधि को संक्षेप में प्रस्तुत करने के लिए, प्रमाण में सभी टाइप के सेट को देखते हुए, यह {{mono|union}} प्रक्रिया और ऐसे प्रत्येक वर्ग के लिए एक प्रतिनिधि चुनना {{mono|find}} प्रक्रिया को एक के माध्यम से उन्हें समतुल्य वर्गों में समूहित करने की अनुमति देता है। साइड इफेक्ट (कंप्यूटर विज्ञान) के अर्थ में [[प्रक्रिया (कंप्यूटर विज्ञान)]] शब्द पर जोर देते हुए, हम एक प्रभावी कलन विधि तैयार करने के लिए स्पष्ट रूप से तर्क के दायरे को छोड़ रहे हैं। <math>\mathtt{union}(a,b)</math> का प्रतिनिधि इस प्रकार निर्धारित किया जाता है कि, यदि {{mvar|a}} और {{mvar|b}} दोनों टाइप के चर हैं तो प्रतिनिधि मनमाने ढंग से उनमें से एक है, लेकिन एक चर और एक पद को एकजुट करते समय, पद प्रतिनिधि बन जाता है। यूनियन-फाइंड के कार्यान्वयन को हाथ में लेते हुए, कोई दो मोनोटाइप्स के एकीकरण को निम्नानुसार तैयार कर सकता है: | ||
प्रक्रिया और ऐसे प्रत्येक वर्ग के लिए एक प्रतिनिधि चुनना {{mono|find}} | |||
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' | |||
अब अनुमान कलन विधि का | अब अनुमान कलन विधि का स्केच हाथ में होने से, अगले भाग में अधिक औपचारिक प्रस्तुति दी गई है। इसका वर्णन मिलनर<ref name="Milner"/>पी. 370 एफएफ. कलन विधि जे के रूप में में किया गया है। | ||
=== कलन विधि | === कलन विधि जे === | ||
{| class=infobox | {| class=infobox | ||
|align=center style="background:#e0e0ff"|'''Algorithm | |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>inst(\sigma)</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) होती है, कलन विधि की कुल लागत उस अभिव्यक्ति के आकार में रैखिक के करीब होती है जिसके लिए एक टाइप इन्फेरेंस लगाया जाना है। यह टाइप इन्फेरेंस कलन विधि प्राप्त करने के कई अन्य प्रयासों के बिल्कुल विपरीत है, जो अधिकांशतः समाप्ति के संबंध में [[अनिर्णीत समस्या]] होने पर भी [[ एनपी कठिन | एनपी-हार्ड]] साबित होते हैं। इस प्रकार एचएम सबसे अच्छा पूर्णतः सूचित टाइप-चेकिंग कलन विधि का प्रदर्शन कर सकता है। यहां टाइप-चेकिंग का मतलब है कि कलन विधि को कोई प्रमाण ढूंढना नहीं है, बल्कि केवल किसी दिए गए प्रमाण को मान्य करना है। | ||
दक्षता थोड़ी | दक्षता थोड़ी अल्प हो गई है क्योंकि गणना की अनुमति देने के लिए संदर्भ में टाइप चर के सीमित को बनाए रखना पड़ता है <math>\bar{\Gamma}(\tau)</math> और <math>union(\alpha,\tau)</math> के दौरान पुनरावर्ती टाइप के निर्माण को रोकने के लिए घटित जांच को सक्षम करें। ऐसे ही एक स्थितियों का उदाहरण<math>\lambda\ x.(x\ x)</math> है , जिसके लिए एचएम का उपयोग करके कोई टाइप प्राप्त नहीं किया जा सकता है। व्यावहारिक रूप से, टाइप केवल छोटे शब्द हैं और विस्तारित संरचनाओं का निर्माण नहीं करते हैं। इस टाइप, जटिलता विश्लेषण में, कोई उनकी तुलना O(1) लागत को बनाए रखते हुए एक स्थिर मान के रूप में कर सकता है। | ||
ऐसे ही एक | |||
== | == कलन विधि सिद्ध करना == | ||
पिछले अनुभाग में, | पिछले अनुभाग में, कलन विधि का रेखाचित्र बनाते समय धातुवैज्ञानिक तर्क के साथ इसके प्रमाण का संकेत दिया गया था। चूंकि यह कुशल कलन विधि जे की ओर जाता है, लेकिन यह स्पष्ट नहीं है कि कलन विधि निगमन सिस्टम डी या एस को ठीक से प्रतिबिंबित करता है या नहीं जो सिमेंटिक बेस लाइन के रूप में काम करता है। | ||
उपरोक्त तर्क में सबसे महत्वपूर्ण बिंदु मोनोटाइप का परिशोधन | उपरोक्त तर्क में सबसे महत्वपूर्ण बिंदु मोनोटाइप का परिशोधन है। उदाहरण के लिए, कलन विधि स्पष्टपूर्वक संदर्भ बदलते समय उदाहरण बदलता है। <math>\lambda f . (f\ 1)</math>, क्योंकि मापदण्ड <math>f</math> के संदर्भ में जोड़ा गया है मोनोटाइप चर को बाद में अनुप्रयोग को संभालते समय <math>int \rightarrow \beta</math>में परिष्कृत करने की आवश्यकता होती है। समस्या यह है कि निगमन नियम ऐसे परिशोधन की अनुमति नहीं देते हैं। यह तर्क देना कि मोनोटाइप चर के अतिरिक्त परिष्कृत प्रकार को पहले जोड़ा जा सकता था, सर्वोत्तम रूप से समीचीन है। | ||
क्योंकि | |||
को <math>int \rightarrow \beta</math> | |||
समस्या यह है कि | |||
तर्क | |||
औपचारिक रूप से संतोषजनक तर्क तक पहुंचने की कुंजी उचित रूप से | औपचारिक रूप से संतोषजनक तर्क तक पहुंचने की कुंजी परिशोधन के भीतर संदर्भ को उचित रूप से सम्मिलित करना है। औपचारिक रूप से, टाइपिंग मुक्त प्रकार के चर के प्रतिस्थापन के साथ संगत है। | ||
टाइपिंग | |||
:<math>\Gamma \vdash_S e : \tau \quad\Longrightarrow\quad S \Gamma \vdash_S e : S \tau</math> | :<math>\Gamma \vdash_S e : \tau \quad\Longrightarrow\quad S \Gamma \vdash_S e : S \tau</math> | ||
इस | इस टाइप मुक्त चरों को परिष्कृत करने का अर्थ संपूर्ण टाइपिंग को परिष्कृत करना है। | ||
=== | === कलन विधि Ω === | ||
{| class=infobox | {| class=infobox | ||
|align=center style="background:#e0e0ff"|'''Algorithm | |align=center style="background:#e0e0ff"|'''Algorithm डब्ल्यू''' | ||
|- | |- | ||
| <math> | | <math> | ||
Line 484: | Line 415: | ||
</math> | </math> | ||
|} | |} | ||
वहां से, | वहां से, कलन विधि जे का प्रमाण कलन विधि डब्ल्यू की ओर ले जाता है, जो केवल <math>S_i</math> के माध्यम से अपनी क्रमिक संरचना को व्यक्त करके प्रक्रिया <math>\textit{union}</math> द्वारा लगाए गए दुष्प्रभावों को स्पष्ट करता है। साइडबार में एल्गोरिदम डब्ल्यू की प्रस्तुति अभी भी इटैलिक में सेट किए गए संचालन में साइड इफेक्ट्स का उपयोग करती है, लेकिन ये अब नए प्रतीकों को उत्पन्न करने तक ही सीमित हैं। निर्णय का स्वरूप <math>\Gamma \vdash e : \tau, S</math> है ,जो संदर्भ और अभिव्यक्ति के साथ फ़ंक्शन को प्रतिस्थापन के साथ मोनोटाइप उत्पन्न करने वाले मापदण्ड के रूप में दर्शाता है। <math>\textsf{mgu}</math> प्रतिस्थापन उत्पन्न करने वाले <math>\textit{union}</math> का दुष्प्रभाव मुक्त संस्करण है जो सबसे सामान्य एकीकरणकर्ता है। | ||
<math> | |||
जबकि | जबकि कलन विधि डब्ल्यू को सामान्यतः एचएम कलन विधि माना जाता है और प्रायः साहित्य में नियम सिस्टम के बाद सीधे प्रस्तुत किया जाता है, इसका उद्देश्य मिल्नर<ref name="Milner"/>द्वारा पी. 369 पर इस प्रकार वर्णित है: | ||
प्रायः साहित्य में नियम | |||
: जैसा कि यह खड़ा है, डब्ल्यू शायद ही | : ''जैसा कि यह खड़ा है, डब्ल्यू शायद ही कुशल कलन विधि है; प्रतिस्थापन बहुत बार लागू होते हैं। इसे सुदृढ़ता के प्रमाण में सहायता के लिए तैयार किया गया था। अब हम एक सरल कलन विधि जे प्रस्तुत करते हैं जो सटीक अर्थों में डब्ल्यू का अनुकरण करता है।'' | ||
जबकि उन्होंने डब्ल्यू को अधिक जटिल और | जबकि उन्होंने डब्ल्यू को अधिक जटिल और अल्प कुशल माना, उन्होंने इसे जे से पहले अपने प्रकाशन में प्रस्तुत किया। जब दुष्प्रभाव अनुपलब्ध या अवांछित होते हैं तो इसकी अपनी खूबियाँ होती हैं। पूर्णता साबित करने के लिए डब्ल्यू की भी आवश्यकता होती है, जिसे उसके द्वारा सुदृढ़ता प्रमाण में सम्मिलित किया जाता है। | ||
जे से पहले अपने प्रकाशन | |||
पूर्णता साबित करने के लिए डब्ल्यू की भी आवश्यकता होती है, जिसे उसके द्वारा सुदृढ़ता प्रमाण में | |||
=== प्रमाण दायित्व === | === प्रमाण दायित्व === | ||
प्रमाण दायित्वों को तैयार करने से पहले, नियम | प्रमाण दायित्वों को तैयार करने से पहले, नियम सिस्टम डी और एस और प्रस्तुत कलन विधि के बीच विचलन पर जोर दिया जाना चाहिए। | ||
जबकि उपरोक्त विकास ने ओपन | जबकि उपरोक्त विकास ने "ओपन" प्रमाण चर के रूप में मोनोटाइप्स का दुरुपयोग किया था, इस संभावना को कि उचित मोनोटाइप चर को नुकसान पहुंचाया जा सकता था, नए चर पेश करके और सर्वोत्तम की उम्मीद करके दरकिनार कर दिया गया था। लेकिन इसमें परेशानी है: किए गए वादों में से एक यह था कि इन नए बदलावों को इसी तरह ध्यान में रखा जाएगा। यह वादा कलन विधि द्वारा पूरा नहीं किया गया है। | ||
एक प्रसंग होना <math>1 : int,\ f : \alpha</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>\beta</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>। वहां से, प्रमाण अभिव्यक्ति पर प्रेरण द्वारा होते हैं। | ||
एक अन्य प्रमाण दायित्व स्वयं प्रतिस्थापन लेम्मा है, | एक अन्य प्रमाण दायित्व स्वयं प्रतिस्थापन लेम्मा है, अर्थात टाइपिंग का प्रतिस्थापन, जो अंततः सभी-मात्राकरण स्थापित करता है। बाद को औपचारिक रूप से सिद्ध नहीं किया जा सकता, क्योंकि ऐसा कोई सिंटेक्स उपलब्ध नहीं है। | ||
== एक्सटेंशन == | == एक्सटेंशन == | ||
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> के बाईं ओर होते हैं लेकिन इसके दाईं ओर पॉलीटाइप के रूप में होते हैं। | ||
==== परिणाम ==== | ==== परिणाम ==== | ||
Line 569: | Line 476: | ||
हालाँकि उपरोक्त सीधा है, इसकी कीमत चुकानी पड़ती है। | हालाँकि उपरोक्त सीधा है, इसकी कीमत चुकानी पड़ती है। | ||
[[ प्रकार सिद्धांत ]] लैम्ब्डा कलन को गणना और तर्क से जोड़ती है। | [[ प्रकार सिद्धांत | टाइप सिद्धांत]] लैम्ब्डा कलन को गणना और तर्क से जोड़ती है। उपरोक्त आसान संशोधन का दोनों पर प्रभाव पड़ता है: | ||
उपरोक्त आसान संशोधन का दोनों पर प्रभाव पड़ता है: | |||
* [[सामान्यीकरण संपत्ति (सार पुनर्लेखन)]] अमान्य है, क्योंकि गैर-समाप्ति शर्तों को तैयार किया जा सकता है। | * [[सामान्यीकरण संपत्ति (सार पुनर्लेखन)|सामान्यीकरण गुण (सार पुनर्लेखन)]] अमान्य है, क्योंकि गैर-समाप्ति शर्तों को तैयार किया जा सकता है। | ||
* तर्क संगति क्योंकि | * तर्क संगति हो जाता है क्योंकि टाइप <math>\forall a. a</math> सयात्रिक बन जाता है। | ||
=== ओवरलोडिंग === | === ओवरलोडिंग === | ||
{{main| | {{main|क्लास टाइप}} | ||
ओवरलोडिंग का अर्थ है कि विभिन्न फंक्शन को एक ही नाम से परिभाषित और उपयोग किया जा सकता है। अधिकांश प्रोग्रामिंग | ओवरलोडिंग का अर्थ है कि विभिन्न फंक्शन को एक ही नाम से परिभाषित और उपयोग किया जा सकता है। अधिकांश प्रोग्रामिंग लैंग्वेज न्यूनतम अंतर्निहित अंकगणितीय संचालन (+,<,आदि) के साथ ओवरलोडिंग प्रदान करती हैं, जिससे प्रोग्रामर को अंकगणितीय अभिव्यक्तियों को एक ही रूप में लिखने की अनुमति मिलती है, यहां तक कि विभिन्न संख्यात्मक टाइप के लिए भी <code>int</code> या <code>real लिखने की अनुमति मिलती है,</code>क्योंकि एक ही अभिव्यक्ति के भीतर इन विभिन्न टाइप का मिश्रण भी अंतर्निहित रूपांतरण की मांग करता है, विशेष रूप से इन परिचालनों के लिए ओवरलोडिंग अधिकांशतः प्रोग्रामिंग लैंग्वेज में ही निर्मित होती है। कुछ लैंग्वेज में, इस सुविधा को सामान्यीकृत किया गया है और उपयोगकर्ता के लिए उपलब्ध कराया गया है, उदाहरण के लिए C++ में है। | ||
जबकि टाइप चेकिंग और अनुमान दोनों में गणना लागत के लिए अभिलक्षकी प्रोग्रामिंग में [[तदर्थ बहुरूपता]] से बचा गया है | जबकि टाइप चेकिंग और अनुमान दोनों में गणना लागत के लिए अभिलक्षकी प्रोग्रामिंग में [[तदर्थ बहुरूपता]] से बचा गया है, ओवरलोडिंग को व्यवस्थित करने का साधन पेश किया गया है जो फॉर्म और नामकरण दोनों में ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग के समान है, लेकिन एक स्तर ऊपर की ओर काम करता है। इस व्यवस्थित में उदाहरण वस्तु नहीं हैं (अर्थात मान स्तर पर), बल्कि टाइप हैं। परिचय में उल्लिखित क्विकॉर्ट उदाहरण ऑर्डर में ओवरलोडिंग का उपयोग करता है, जिसमें हास्केल में निम्न टाइप का टिप्पणी होता है: | ||
परिचय में उल्लिखित क्विकॉर्ट उदाहरण ऑर्डर में ओवरलोडिंग का उपयोग करता है, जिसमें हास्केल में निम्न | |||
<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> करता है फ़ंक्शंस बॉडी में उपयोग किया जाता है। इन विधेयों के उचित कार्यान्वयन को अतिरिक्त मापदंडों के रूप में क्विकॉर्ट्स को पास कर दिया जाता है, जैसे ही क्विकॉर्ट का उपयोग अधिक ठोस टाइप पर किया जाता है जो ओवरलोडेड फ़ंक्शन क्विकसॉर्ट का एकल कार्यान्वयन प्रदान करता है। | ||
क्योंकि | क्योंकि "वर्ग" केवल एक ही टाइप को अपने तर्क के रूप में अनुमति देती हैं, परिणामी टाइप सिस्टम अभी भी अनुमान प्रदान कर सकती है। इसके अतिरिक्त, टाइप की वर्ग को किसी टाइप के ओवरलोडिंग ऑर्डर से सुसज्जित किया जा सकता है, जिससे वर्ग को[[ जाली (आदेश) | जाली (ऑर्डर)]] के रूप में व्यवस्थित किया जा सकता है। | ||
=== उच्च- | === उच्च-ऑर्डर टाइप === | ||
{{Main| | {{Main|प्रकार (प्रकार सिद्धांत)}} | ||
{{See also| | {{See also|प्रकार वर्ग#उच्च प्रकार का बहुरूपता}} | ||
प्राचलिक बहुरूपता का अर्थ है कि | प्राचलिक बहुरूपता का अर्थ है कि टाइप स्वयं को मापदण्ड के रूप में पारित किया जाता है जैसे कि वे उचित मान थे। उचित फंक्शन के लिए तर्क के रूप में पारित किया गया, लेकिन प्राचलिक टाइप के स्थिरांक के रूप में टाइप के फंक्शन में भी, इस सवाल की ओर जाता है कि टाइप को और अधिक उचित तरीके से कैसे टाइप किया जाए। और भी अधिक अभिव्यंजक टाइप की सिस्टम बनाने के लिए उच्च-ऑर्डर टाइप का उपयोग किया जाता है। | ||
दुर्भाग्य से, | दुर्भाग्य से, मेटा टाइप की उपस्थिति में निर्णय लेने योग्य नहीं है, जिससे व्यापकता के इस विस्तार में टाइप इन्फेरेंस असंभव हो जाता है। इसके अतिरिक्त, सभी टाइप के टाइप को मान लेना जिसमें स्वयं को टाइप के रूप में सम्मिलित किया जाता है, विरोधाभास की ओर ले जाता है, जैसा कि सभी सेटों के सेट में होता है, इसलिए किसी को अमूर्तता के स्तर के चरणों में आगे बढ़ना चाहिए। दूसरे ऑर्डर के लैम्ब्डा कलन में अनुसंधान, एक कदम ऊपर, से पता चला कि इस व्यापकता में टाइप इन्फेरेंस अनिर्णीत है। | ||
दूसरे | |||
अतिरिक्त स्तर के हिस्सों को को हास्केल नाम के[[ प्रकार (प्रकार सिद्धांत) | टाइप (टाइप सिद्धांत)]] में पेश किया गया है, जहां इसका उपयोग [[मोनाड (कार्यात्मक प्रोग्रामिंग)|मोनाड (अभिलक्षकी प्रोग्रामिंग)]] टाइप करने में मदद के लिए किया जाता है। विस्तारित टाइप सिस्टम के आंतरिक यांत्रिकी में पर्दे के पीछे काम करते हुए, टाइप को अंतर्निहित छोड़ दिया जाता है। | |||
=== | === उपटाइपिंग === | ||
{{main| | {{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>, | |||
हालाँकि, क्योंकि | |||
इसलिए, ऐसी टाइपिंग योजनाओं और उनकी | |||
गैर-नियतात्मक परिमित | |||
अभी हाल ही में, डोलन और माइक्रॉफ्ट<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 | ||
क्योंकि ऑब्जेक्ट विधियों को | |||
और एफ- | |||
| 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>हालाँकि बहुरूपता की यह शैली कुछ मायनों में उपटाइपिंग की तुलना में अल्प नम्य है, विशेष रूप से टाइप की व्यवरोध में दिशात्मकता की कमी से निपटने के लिए कड़ाई से आवश्यकता से अधिक बहुरूपता की आवश्यकता होती है, इसका लाभ यह है कि इसे मानक एचएम कलन विधि के साथ काफी आसानी से एकीकृत किया जा सकता है। | ||
हालाँकि बहुरूपता की यह शैली कुछ मायनों में | |||
इसका लाभ यह है कि इसे मानक एचएम कलन विधि के साथ काफी आसानी से एकीकृत किया जा सकता है। | |||
== टिप्पणियाँ == | == टिप्पणियाँ == | ||
Line 666: | Line 553: | ||
== बाहरी संबंध == | == बाहरी संबंध == | ||
* [https://github.com/wh5a/Algorithm-W-Step-By-Step/blob/master/AlgorithmW.pdf A literate Haskell implementation of Algorithm | * [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: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 |
औपचारिक रूप से, एचएम में, टाइप , से अधिक सामान्य है, औपचारिक रूप से , यदि कुछ परिमाणित चर में लगातार इस टाइप प्रतिस्थापित किया जाता है कि लाभ हो जैसा कि साइड बार में दिखाया गया है। यह ऑर्डर टाइप सिस्टम की टाइप परिभाषा का हिस्सा है।
हमारे पिछले उदाहरण में, प्रतिस्थापन लागू करना परिणाम होगा।
परिमाणित चर के लिए एकरूप (जमीन) टाइप को प्रतिस्थापित करते समय, सीधे तौर पर, पॉलीटाइप को प्रतिस्थापित करने से मुक्त चर की उपस्थिति के कारण कुछ नुकसान होते हैं। विशेष रूप से, अनबाउंड चर को प्रतिस्थापित नहीं किया जाना चाहिए। उन्हें यहां स्थिरांक के रूप में माना जाता है। इसके अतिरिक्त, परिमाणीकरण केवल शीर्ष स्तर पर ही हो सकता है। प्राचलिक टाइप को प्रतिस्थापित करते हुए, किसी को इसके परिमाण को ऊपर उठाना होगा। दाईं ओर की तालिका नियम को सटीक बनाती है।
वैकल्पिक रूप से, परिमाण बिना पॉलीटाइप्स के लिए समतुल्य अंकन पर विचार करें जिसमें परिमाण चर को प्रतीकों के अलग सेट द्वारा दर्शाया जाता है। ऐसे संकेतन में, विशेषज्ञता ऐसे चरों का सादे संगत प्रतिस्थापन में अल्प हो जाती है।
संबंध आंशिक ऑर्डर है और इसका सबसे छोटा तत्व है।
मूल टाइप
जबकि टाइप की योजना का विशेषज्ञता ऑर्डर का उपयोग है, यह टाइप सिस्टम में महत्वपूर्ण दूसरी भूमिका निभाता है। बहुरूपता के साथ टाइप इन्फेरेंस अभिव्यक्ति के सभी संभावित प्रकारों को सारांशित करने की चुनौती का सामना करता है। ऑर्डर गारंटी देता है कि ऐसा सारांश अभिव्यक्ति के सबसे सामान्य टाइप के रूप में सम्मिलित है।
टाइपिंग में प्रतिस्थापन
ऊपर परिभाषित टाइप ऑर्डर को टाइपिंग तक बढ़ाया जा सकता है क्योंकि टाइपिंग की अंतर्निहित सभी-मात्रा लगातार प्रतिस्थापन को सक्षम बनाती है:
विशेषज्ञता नियम के विपरीत, यह परिभाषा का हिस्सा नहीं है, बल्कि अंतर्निहित सभी-परिमाणीकरण की तरह है, बल्कि आगे परिभाषित टाइप के नियमों का परिणाम है। टाइपिंग में मुक्त टाइप चर संभावित शोधन के लिए प्लेसहोल्डर के रूप में काम करते हैं। दाहिनी ओर मुक्त टाइप के चर के लिए पर्यावरण का बाध्यकारी प्रभाव जो विशेषज्ञता नियम में उनके प्रतिस्थापन को फिर से प्रतिबंधित करता है, वह फिर से यह है कि प्रतिस्थापन को सुसंगत होना चाहिए और इसमें संपूर्ण टाइपिंग को सम्मिलित करने की आवश्यकता होगी।
यह आलेख चार अलग-अलग नियम सेटों पर चर्चा करेगा:
- घोषणात्मक सिस्टम
- वाक्यात्मक सिस्टम
- कलन विधि जे
- कलन विधि डब्ल्यू
निगमनात्मक सिस्टम
The Syntax of Rules |
निर्णयों (गणितीय तर्क) के रूप में टाइपिंग का उपयोग करके, एचएम के सिंटैक्स को अनुमान नियमों के सिंटैक्स तक आगे बढ़ाया जाता है जो औपचारिक सिस्टम का मुख्य भाग बनाता है। प्रत्येक नियम परिभाषित करता है कि किस आधार से क्या निष्कर्ष निकाला जा सकता है। निर्णयों के अतिरिक्त, ऊपर प्रस्तुत कुछ अतिरिक्त शर्तों को भी परिसर के रूप में उपयोग किया जा सकता है।
नियमों का उपयोग करने वाला प्रमाण निर्णयों का ऑर्डर है जैसे कि निष्कर्ष से पहले सभी परिसरों को सूचीबद्ध किया जाता है। नीचे दिए गए उदाहरण प्रमाणों का संभावित प्रारूप दिखाते हैं। बाएँ से दाएँ, प्रत्येक पंक्ति निष्कर्ष दर्शाती है या विधेय को स्पष्ट करके, या तो पहले की पंक्ति (संख्या) का संदर्भ देकर लागू नियम और परिसर का, यदि आधार निर्णय है।
टाइपिंग नियम
Declarative Rule System |
साइड बॉक्स एचएम टाइप सिस्टम के निगमन नियमों को दर्शाता है। नियमों को मोटे तौर पर दो समूहों में विभाजित किया जा सकता है:
पहले चार नियम (चर या फ़ंक्शन एक्सेस), (अनुप्रयोग, अर्थात मापदण्ड के साथ फ़ंक्शन कॉल), (अमूर्त, अर्थात फ़ंक्शन घोषणा) और (परिवर्तनीय घोषणा) सिंटेक्स पर केंद्रित हैं, प्रत्येक अभिव्यक्ति रूप के लिए नियम प्रस्तुत करते हैं। उनका अर्थ पहली नज़र में स्पष्ट है, क्योंकि वे प्रत्येक अभिव्यक्ति को विघटित करते हैं, उनकी उप-अभिव्यक्तियों को सिद्ध करते हैं और अंततः परिसर में पाए जाने वाले व्यक्तिगत टाइप को निष्कर्ष में दिए गए टाइप से जोड़ते हैं।
शेष दो नियमों और से दूसरा समूह बनता है। वे टाइप की विशेषज्ञता और सामान्यीकरण को संभालते हैं। जबकि नियम उपरोक्त विशेषज्ञता वाले अनुभाग से स्पष्ट होना चाहिए, विपरीत दिशा में काम करते हुए पहले का पूरक है। यह सामान्यीकरण की अनुमति देता है, अर्थात संदर्भ में सीमित हुए मोनोटाइप चर की मात्रा निर्धारित करने की अनुमति नहीं देता है।
निम्नलिखित दो उदाहरण क्रियान्वित नियम सिस्टम का प्रयोग करते हैं। चूँकि अभिव्यक्ति और टाइप दोनों दिए गए हैं, वे नियमों का टाइप-जाँच उपयोग हैं।
उदाहरण: के लिए प्रमाण जहाँ ,लिखा जा सकता है
उदाहरण: सामान्यीकरण प्रदर्शित करने के लिए, नीचे दिखाया गया है:
लेट-पॉलीमॉरफिस्म
तुरंत दिखाई नहीं देता है, नियम सेट विनियमन को एन्कोड करता है जिसके अनुसार नियमों और में मोनो- और पॉलीटाइप के थोड़े अलग उपयोग से किसी टाइप को सामान्यीकृत किया जा सकता है या नहीं किया जा सकता है। उसे याद रखो और क्रमशः पॉली- और मोनोटाइप्स को निरूपित करें।
नियम में , फ़ंक्शन के मापदण्ड का मान चर आधार के माध्यम से एकरूप टाइप के साथ संदर्भ में जोड़ा जाता है , जबकि नियम में है चर पर्यावरण में बहुरूपी रूप में प्रवेश करता है। हालाँकि दोनों ही मामलों में की उपस्थिति संदर्भ में असाइनमेंट में किसी भी मुक्त चर के लिए सामान्यीकरण नियम के उपयोग को रोकता है, यह विनियमन मापदण्ड के टाइप को बाध्य करता है -अभिव्यक्ति एकरूप बनी रहेगी, जबकि लेट-एक्सप्रेशन में, चर को बहुरूपी पेश किया जा सकता है, जिससे विशेषज्ञता संभव हो सकेगी।
इस विनियमन के परिणामस्वरूप, टाइप नहीं किया जा सकता, मापदण्ड के बाद से एकरूप स्थिति में है, जबकि टाइप है, क्योंकि लेट-एक्सप्रेशन में पेश किया गया है और इसलिए इसे बहुरूपी माना जाता है।
सामान्यीकरण नियम
सामान्यीकरण नियम भी करीब से देखने लायक है। यहां, आधार में निहित सभी-परिमाणीकरण को निष्कर्ष में के दाहिनी ओर ले जाया गया है। यह तब से संभव है संदर्भ में मुक्त नहीं होता है। फिर, जबकि यह सामान्यीकरण नियम को प्रशंसनीय बनाता है, यह वास्तव में कोई परिणाम नहीं है। इसके विपरीत, सामान्यीकरण नियम एचएम की टाइप सिस्टम की परिभाषा का हिस्सा है और अंतर्निहित सभी-परिमाणीकरण एक परिणाम है।
अनुमान कलन विधि
अब जब एचएम की निगमन सिस्टम हाथ में है, तो कोई कलन विधि प्रस्तुत कर सकता है और नियमों के संबंध में इसे मान्य कर सकता है। वैकल्पिक रूप से, नियम कैसे परस्पर क्रिया करते हैं और प्रमाण कैसे हैं, इस पर करीब से नज़र डालकर इसे प्राप्त करना संभव हो सकता है। यह इस लेख के शेष भाग में उन संभावित निर्णयों पर ध्यान केंद्रित करते हुए किया गया है जो कोई टाइपिंग साबित करते समय कर सकता है।
नियमों को चुनने की स्वतंत्रता की डिग्री
प्रमाण में उन बिंदुओं को अलग करना, जहां कोई निर्णय संभव ही नहीं है, सिंटैक्स पर केन्द्रित नियमों का पहला समूह कोई विकल्प नहीं छोड़ता है क्योंकि प्रत्येक वाक्यविन्यास नियम एक अद्वितीय टाइपिंग नियम से मेल खाता है, जो प्रमाण का एक हिस्सा निर्धारित करता है, जबकि निष्कर्ष के बीच और की इन निश्चित भागों श्रृंखलाओं का परिसर हो सकता है। ऐसी श्रृंखला प्रमाण के निष्कर्ष और सर्वोच्च अभिव्यक्ति के नियम के बीच भी सम्मिलित हो सकती है। सभी प्रमाणों का आकार वैसा ही होना चाहिए।
क्योंकि नियम चयन के संबंध में प्रमाण में एकमात्र विकल्प और श्रृंखलाएं हैं, प्रमाण का रूप इस सवाल का सुझाव देता है कि क्या इसे और अधिक सटीक बनाया जा सकता है, जहां इन श्रृंखलाओं की आवश्यकता नहीं हो सकती है। यह वास्तव में संभव है और ऐसे नियमों के बिना टाइप की नियम सिस्टम की ओर ले जाता है।
सिंटैक्स-निर्देशित नियम सिस्टम
Syntactical Rule System |
Generalization |
एचएम का समकालीन उपचार मध्यवर्ती चरण के रूप में क्लेमेंट[7]के कारण विशुद्ध रूप से वाक्यविन्यास-निर्देशित नियम सिस्टम का उपयोग करता है। इस सिस्टम में, विशेषज्ञता सीधे मूल नियम के बाद स्थित होती है और उसमें विलीन हो जाती है, जबकि सामान्यीकरण नियम का हिस्सा बन जाता है। वहां सामान्यीकरण को फ़ंक्शन को पेश करके हमेशा सबसे सामान्य प्रकार का उत्पादन करने के लिए भी निर्धारित किया जाता है, जो में बंधे नहीं सभी मोनोटाइप चर की मात्रा निर्धारित करता है।
औपचारिक रूप से, इस नई नियम सिस्टम को मान्य करने के लिए मूल के समतुल्य है, किसी के पास उसे दिखाने के लिए , जो दो उप-प्रमाणों में विघटित हो जाता है:
- (संगतता)
- (पूर्णता (तर्क))
जबकि स्थिरता को नियम और को विघटित करके देखा जा सकता है में प्रमाणों में , यह संभवतः दिखाई देता है कि अधूरा है, क्योंकि उदाहरण के लिए, कोई में , नहीं दिखा सकता है, लेकिन केवल । दिखा सकता है। हालाँकि, पूर्णता का केवल थोड़ा दुर्बल संस्करण ही सिद्ध है[8]
तात्पर्य यह है कि, कोई किसी अभिव्यक्ति के लिए मुख्य टाइप प्राप्त कर सकता है हमें अंत में प्रमाण को सामान्यीकृत करने की अनुमति देता है।
और , की तुलना अब सभी नियमों के निर्णयों में केवल मोनोटाइप ही दिखाई देते हैं। इसके अतिरिक्त, निगमन सिस्टम के साथ किसी भी संभावित प्रमाण का आकार अब अभिव्यक्ति के आकार के समान है। इस टाइप अभिव्यक्ति पूरी तरह से प्रमाण के आकार को निर्धारित करती है। में आकार संभवतः सभी नियमों को छोड़कर अन्य नियमों के अनुसार निर्धारित किया जाएगा और , जो अन्य नोड्स के बीच मनमाने ढंग से लंबी शाखाएं (चेन) बनाने की अनुमति देता है।
नियमों को लागू करने वाली स्वतंत्रता की डिग्री
अब जब प्रमाण का आकार ज्ञात हो गया है, तो पहले से ही टाइप इन्फेरेंस कलन विधि को तैयार करने के करीब है। क्योंकि किसी दिए गए अभिव्यक्ति के लिए किसी भी प्रमाण का आकार समान होना चाहिए, कोई यह मान सकता है कि प्रमाण के निर्णयों में मोनोटाइप्स अनिर्धारित हैं और विचार कर सकते हैं कि उन्हें कैसे निर्धारित किया जाए।
यहां, प्रतिस्थापन (विशेषज्ञता) ऑर्डर चलन में आता है। हालाँकि पहली नज़र में कोई भी स्थानीय रूप से टाइप को निर्धारित नहीं कर सकता है, आशा है कि प्रमाण ट्री को पार करते समय ऑर्डर की सहायता से उन्हें परिष्कृत करना संभव है, इसके अतिरिक्त यह मानते हुए, क्योंकि परिणामी कलन विधि अनुमान विधि बनना है, कि किसी भी परिसर का टाइप सर्वोत्तम संभव के रूप में निर्धारित किया जाएगा। और वास्तव में, कोई ऐसा कर सकता है, जैसा कि के नियमों को देखने से पता चलता है:
- [Abs]: महत्वपूर्ण विकल्प τ है। इस बिंदु पर, τ के बारे में कुछ भी ज्ञात नहीं है, इसलिए कोई केवल सबसे सामान्य प्रकार मान सकता है, जो कि है। योजना यह है कि यदि आवश्यक हो तो टाइप को विशेषज्ञ बनाया जाए। दुर्भाग्य से, इस स्थान पर पॉलीटाइप की अनुमति नहीं है, इसलिए कुछ α फिलहाल करना होगा। अवांछित कैप्चर से बचने के लिए, टाइप का चर जो अभी तक प्रूफ़ में नहीं है, एक सुरक्षित विकल्प है। इसके अतिरिक्त, किसी को यह ध्यान में रखना होगा कि यह मोनोटाइप अभी तक तय नहीं हुआ है, लेकिन इसे और परिष्कृत किया जा सकता है।
- [Var]: चुनाव यह है कि σ को कैसे परिष्कृत किया जाए। क्योंकि यहां टाइप τ का कोई भी विकल्प चर के उपयोग पर निर्भर करता है, जो स्थानीय रूप से ज्ञात नहीं है, सबसे सुरक्षित दांव सबसे सामान्य है। ऊपर दी गई समान विधि का उपयोग करके σ सभी मात्रात्मक चर को नए मोनोटाइप चर के साथ तुरंत चालू किया जा सकता है, फिर से उन्हें आगे के शोधन के लिए खुला रखा जा सकता है।
- [Let]: नियम कोई विकल्प नहीं छोड़ता। पूर्ण।
- [App]: केवल अनुप्रयोग नियम ही अब तक "खोले गए" चर को परिष्कृत करने के लिए बाध्य कर सकता है, जैसा कि दोनों परिसरों द्वारा आवश्यक है।
- पहला आधार अनुमान के परिणाम को प्रपत्र का होने के लिए बाध्य करता है ।
- यदि ऐसा है तो ठीक है। कोई बाद में परिणाम के लिए इसका τ' चुन सकता है।
- यदि नहीं, तो यह विवृत चर हो सकता है। फिर इसे पहले की तरह दो नए चर के साथ आवश्यक रूप में परिष्कृत किया जा सकता है।
- अन्यथा, टाइप की जाँच विफल हो जाती है क्योंकि पहले आधार से एक ऐसे टाइप इन्फेरेंस लगाया गया है जो फ़ंक्शन टाइप में नहीं है और न ही बनाया जा सकता है।
- दूसरे आधार के लिए आवश्यक है कि अनुमानित प्रकार पहले आधार के τ के बराबर हो। अब संभवतः दो अलग-अलग प्रकार हैं, शायद खुले टाइप के चर के साथ, तुलना करने के लिए और यदि संभव हो तो बराबर करने के लिए। यदि ऐसा है, तो शोधन पाया जाता है, और यदि नहीं, तो टाइप की त्रुटि फिर से पाई जाती है। प्रतिस्थापन द्वारा दो शब्दों को समान बनाने के लिए एक प्रभावी विधि ज्ञात है, तथाकथित असंयुक्त-सेट डेटा संरचना के साथ संयोजन में रॉबिन्सन के एकीकरण (कंप्यूटिंग) को प्रतिस्थापन द्वारा "दो शब्दों को बराबर बनाने" के लिए एक प्रभावी विधि के रूप में जाना जाता है।
- पहला आधार अनुमान के परिणाम को प्रपत्र का होने के लिए बाध्य करता है ।
संघ-खोज कलन विधि को संक्षेप में प्रस्तुत करने के लिए, प्रमाण में सभी टाइप के सेट को देखते हुए, यह 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]हालाँकि बहुरूपता की यह शैली कुछ मायनों में उपटाइपिंग की तुलना में अल्प नम्य है, विशेष रूप से टाइप की व्यवरोध में दिशात्मकता की कमी से निपटने के लिए कड़ाई से आवश्यकता से अधिक बहुरूपता की आवश्यकता होती है, इसका लाभ यह है कि इसे मानक एचएम कलन विधि के साथ काफी आसानी से एकीकृत किया जा सकता है।
टिप्पणियाँ
- ↑ 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.
- ↑ Polytypes are called "type schemes" in the original article.
- ↑ 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.
- ↑ Haskell provides the ScopedTypeVariables language extension allowing to bring all-quantified type variables into scope.
संदर्भ
- ↑ Hindley, J. Roger (1969). "संयोजन तर्क में किसी वस्तु की प्रमुख प्रकार-योजना". Transactions of the American Mathematical Society. 146: 29–60. doi:10.2307/1995158. JSTOR 1995158.
- ↑ 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.
- ↑ Damas, Luis (1985). प्रोग्रामिंग भाषाओं में असाइनमेंट टाइप करें (PhD thesis). University of Edinburgh. hdl:1842/13555. CST-33-85.
- ↑ 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.
- ↑ 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
- ↑ 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.
- ↑ Clement (1986). A Simple Applicative Language: Mini-ML. LFP'86. ACM. doi:10.1145/319838.319847. ISBN 978-0-89791-200-6.
- ↑ 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) - ↑ Pottier, François (1998). Type Inference in the Presence of Subtyping: from Theory to Practice (Thesis). Retrieved 2021-08-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.
- ↑ 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.
- ↑ 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.
- ↑ Daan Leijen, Extensible records with scoped labels, Institute of Information and Computing Sciences, Utrecht University, Draft, Revision: 76, July 23, 2005
- Mairson, Harry G. (1990). "Deciding ML typability is complete for deterministic exponential time". Proceedings of the 17th ACM SIGPLAN-SIGACT symposium on Principles of programming languages - POPL '90. pp. 382–401. doi:10.1145/96709.96748. ISBN 978-0-89791-343-0. S2CID 75336.
{{cite book}}
:|journal=
ignored (help) - Kfoury, A. J.; Tiuryn, J.; Urzyczyn, P. (1990). ML typability is dexptime-complete. pp. 206–220. doi:10.1007/3-540-52590-4_50. ISBN 978-3-540-52590-5.
{{cite book}}
:|journal=
ignored (help)