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

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

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

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

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

एकरूपता बनाम बहुरूपता
सरलता से टाइप किए गए लैम्ब्डा कलन में, प्रकार $T$ या तो परमाणु प्रकार के स्थिरांक हैं या फंक्शन प्रकार के रूप हैं $$T \rightarrow 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)

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

'चलो' आईडी = λ एक्स। एक्स 'इन'... (आईडी 3) ... (आईडी टेक्स्ट) ...

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

सिंहावलोकन
इस लेख का शेष भाग इस प्रकार है:


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

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

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

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

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

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

मोनोटाइप के उदाहरणों में प्रकार स्थिरांक शामिल हैं $$\mathtt{int}$$ या $$\mathtt{string}$$, और प्राचलिक प्रकार जैसे $$\mathtt{Map\ (Set\ string)\ int}$$. बाद वाले प्रकार प्रकार के फंक्शन के अनुप्रयोगों के उदाहरण हैं, उदाहरण के लिए, सेट से $$ \{ \mathtt{Map^2,\ Set^1,\ string^0,\ int^0},\ \rightarrow^2 \} $$, जहां सुपरस्क्रिप्ट प्रकार के मापदंडों की संख्या को इंगित करता है। प्रकार के फंक्शन का पूरा सेट $$C$$ एचएम में मनमाना है, सिवाय इसके कि इसमें कम से कम शामिल होना चाहिए $$\rightarrow^2$$, फंक्शन का प्रकार। सुविधा के लिए इसे अक्सर इन्फ़िक्स नोटेशन में लिखा जाता है। उदाहरण के लिए, पूर्णांकों को स्ट्रिंग्स से मैप करने वाले फ़ंक्शन का प्रकार होता है $$\mathtt{int}\rightarrow \mathtt{string}$$. फिर से, कोष्ठक का उपयोग किसी प्रकार की अभिव्यक्ति को स्पष्ट करने के लिए किया जा सकता है। एप्लिकेशन इन्फ़िक्स एरो की तुलना में अधिक मजबूती से बाइंड होता है, जो राइट-बाइंडिंग है।

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

दो मोनोटाइप समान हैं यदि उनके पद समान हैं।

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

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

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

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

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

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

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

प्रोग्रामिंग भाषाओं में बाउंड और अनबाउंड दोनों प्रकार के वेरिएबल की उपस्थिति थोड़ी असामान्य है। अक्सर, सभी प्रकार के चरों को अंतर्निहित रूप से सर्व-मात्राबद्ध माना जाता है। उदाहरण के लिए, प्रोलॉग में फ्री वेरिएबल वाले क्लॉज नहीं हैं। इसी तरह हास्केल में, जहां सभी प्रकार के चर अंतर्निहित रूप से मात्राबद्ध होते हैं, यानी एक हास्केल प्रकार  साधन $$\forall\alpha.\alpha\rightarrow\alpha$$ यहाँ। दाहिने हाथ की ओर का बंधनकारी प्रभाव संबंधित और बहुत ही असामान्य भी है $$\sigma$$ असाइनमेंट का.

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

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

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

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

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

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

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

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

रिश्ता $$\sqsubseteq$$ आंशिक आदेश है और $$\forall \alpha. \alpha$$ इसका सबसे छोटा तत्व है.

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

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

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

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


 * $$\vdash_D$$ घोषणात्मक प्रणाली
 * $$\vdash_S$$ वाक्यात्मक प्रणाली
 * $$\vdash_J$$ कलन विधि एक्स
 * $$\vdash_W$$ कलन विधि ओ

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

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

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

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

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

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


 * $$\begin{array}{llll}

1:&\Gamma \vdash_D id : \forall\alpha.\alpha \rightarrow \alpha &[\mathtt{Var}]& (id : \forall\alpha.\alpha \rightarrow \alpha \in \Gamma) \\ 2:&\Gamma \vdash_D id : int \rightarrow int & [\mathtt{Inst}]&(1),\ (\forall\alpha.\alpha \rightarrow \alpha \sqsubseteq int\rightarrow int)\\ 3:&\Gamma \vdash_D n : int&[\mathtt{Var}]&(n : int \in \Gamma)\\ 4:&\Gamma \vdash_D id(n) : int&[\mathtt{App}]& (2),\ (3)\\ \end{array} $$ उदाहरण: सामान्यीकरण प्रदर्शित करने के लिए, $$\vdash_D\ \textbf{let}\, id = \lambda x. x\ \textbf{in}\ id\, :\, \forall\alpha.\alpha\rightarrow\alpha$$ नीचे दिखाया गया है:



\begin{array}{llll} 1: & x:\alpha \vdash_D x : \alpha & [\mathtt{Var}] & (x:\alpha \in \left\{x:\alpha\right\})\\ 2: & \vdash_D \lambda x.x : \alpha\rightarrow\alpha & [\mathtt{Abs}] & (1)\\ 3: & \vdash_D \lambda x.x : \forall \alpha.\alpha\rightarrow\alpha & [\mathtt{Gen}] & (2),\ (\alpha \not\in free(\epsilon))\\ 4: & id:\forall \alpha.\alpha\rightarrow\alpha \vdash_D id : \forall \alpha.\alpha\rightarrow\alpha & [\mathtt{Var}] & (id:\forall \alpha.\alpha\rightarrow\alpha \in \left\{id : \forall \alpha.\alpha\rightarrow\alpha\right\})\\ 5: & \vdash_D \textbf{let}\, id = \lambda x. x\ \textbf{in}\ id\, :\,\forall\alpha.\alpha\rightarrow\alpha  & [\mathtt{Let}] & (3),\ (4)\\ \end{array} $$

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

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

इस विनियमन के परिणामस्वरूप, $$\lambda f.(f\, \textrm{true}, f\, \textrm{0})$$ टाइप नहीं किया जा सकता, पैरामीटर के बाद से $$f$$ एक एकरूप स्थिति में है, जबकि $$\textbf{let}\ f = \lambda x. x\, \textbf{in}\, (f\, \textrm{true}, f\, \textrm{0})$$ प्रकार है $$(bool, int)$$, क्योंकि $$f$$ लेट-एक्सप्रेशन में पेश किया गया है और इसलिए इसे बहुरूपी माना जाता है।

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

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

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

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

सिंटैक्स-निर्देशित नियम प्रणाली
एचएम का एक समकालीन उपचार विशुद्ध रूप से वाक्यविन्यास-निर्देशित नियम प्रणाली का उपयोग करता है मेहरबान एक मध्यवर्ती कदम के रूप में. इस प्रणाली में, विशेषज्ञता सीधे मूल के बाद स्थित होती है $$[\mathtt{Var}]$$ नियम और इसमें विलीन हो जाता है, जबकि सामान्यीकरण इसका हिस्सा बन जाता है $$[\mathtt{Let}]$$ नियम। वहां सामान्यीकरण है फ़ंक्शन को प्रस्तुत करके हमेशा सबसे सामान्य प्रकार का उत्पादन करने के लिए भी निर्धारित किया गया है $$\bar{\Gamma}(\tau)$$, जो मात्रा निर्धारित करता है सभी मोनोटाइप वैरिएबल बाध्य नहीं हैं $$\Gamma$$.

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


 * $$\Gamma \vdash_D\ e:\sigma \Leftarrow \Gamma \vdash_S\ e:\sigma$$ (गाढ़ापन)
 * $$\Gamma \vdash_D\ e:\sigma \Rightarrow \Gamma \vdash_S\ e:\sigma$$ (पूर्णता (तर्क))

जबकि नियमों को विघटित करके एकरूपता देखी जा सकती है $$[\mathtt{Let}]$$ और $$[\mathtt{Var}]$$ का $$\vdash_S$$ सबूतों में $$\vdash_D$$, संभावना यही दिख रही है $$\vdash_S$$ अधूरा है, जैसे कोई दिखा नहीं सकता $$\lambda\ x.x:\forall\alpha.\alpha\rightarrow\alpha$$ में $$\vdash_S$$, उदाहरण के लिए, लेकिन केवल $$\lambda\ x.x:\alpha\rightarrow\alpha$$. पूर्णता का केवल थोड़ा कमजोर संस्करण ही सिद्ध किया जा सकता है हालाँकि, अर्थात्

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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


 * $$\Gamma \vdash_S e : \tau \quad\Longrightarrow\quad S \Gamma \vdash_S e : S \tau$$

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

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

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


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

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

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

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

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

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

$$ \begin{array}{lll} \text{(Correctness)} &\Gamma \vdash_W e : \tau, S &\quad\Longrightarrow\quad \Gamma \vdash_S e : \tau \\ \text{(Completeness)} &\Gamma \vdash_S e : \tau  &\quad\Longrightarrow\quad  \Gamma \vdash_W e : \tau', S \quad\quad \text{forall}\ \tau\ \text{where}\ \overline\emptyset(\tau') \sqsubseteq \tau \end{array} $$ पूर्णता दायित्व में साइड कंडीशन यह बताती है कि कैसे कटौती कई प्रकार दे सकती है, जबकि कलन विधि हमेशा एक उत्पन्न करता है। साथ ही, साइड कंडीशन की मांग है कि अनुमानित प्रकार वास्तव में सबसे सामान्य है।

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

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

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

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

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


 * $$\displaystyle\frac{

\Gamma, \Gamma' \vdash e_1:\tau_1\quad\dots\quad\Gamma, \Gamma' \vdash e_n:\tau_n\quad\Gamma, \Gamma'' \vdash 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}]$$ कहाँ मूलतः विलय $$[\mathtt{Abs}]$$ और $$[\mathtt{Let}]$$ जबकि पुनरावर्ती रूप से परिभाषित शामिल है मोनोटाइप स्थितियों में वेरिएबल जहां वे बाईं ओर होते हैं $$\mathtt{in}$$ लेकिन इसके दाईं ओर बहुप्रकार के रूप में।
 * $$\Gamma' = v_1:\tau_1,\ \dots,\ v_n:\tau_n$$
 * $$\Gamma'' = v_1:\bar\Gamma(\ \tau_1\ ),\ \dots,\ v_n:\bar\Gamma(\ \tau_n\ )$$

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

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


 * सामान्यीकरण संपत्ति (सार पुनर्लेखन) अमान्य है, क्योंकि गैर-समाप्ति शर्तों को तैयार किया जा सकता है।
 * तर्क संगति क्योंकि प्रकार $$\forall a. a$$ निवास प्रकार बन जाता है।

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

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

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

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

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

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

उपप्रकार
उपप्रकार और टाइप इन्फेरेंस को संयोजित करने के प्रयासों से काफी निराशा हुई है। उपटाइपिंग बाधाओं को जमा करना और प्रचारित करना (प्रकार समानता बाधाओं के विपरीत) सरल है, जिससे परिणामी बाधाओं को अनुमानित टाइपिंग योजनाओं का हिस्सा बना दिया जाता है, उदाहरण के लिए $$\forall \alpha.\ (\alpha \leq T) \Rightarrow \alpha \rightarrow \alpha$$, कहाँ $$\alpha \leq T$$ प्रकार चर पर एक बाधा है $$\alpha$$. हालाँकि, क्योंकि प्रकार चर अब इस दृष्टिकोण में उत्सुकता से एकीकृत नहीं हैं, यह कई बेकार प्रकार के चर और बाधाओं से युक्त बड़ी और बोझिल टाइपिंग योजनाएं उत्पन्न करता है, जिससे उन्हें पढ़ना और समझना कठिन हो जाता है। इसलिए, ऐसी टाइपिंग योजनाओं और उनकी बाधाओं को सरल बनाने में काफी प्रयास किए गए, गैर-नियतात्मक परिमित ऑटोमेटन (एनएफए) सरलीकरण के समान तकनीकों का उपयोग करना (अनुमानित पुनरावर्ती प्रकारों की उपस्थिति में उपयोगी)। अभी हाल ही में, डोलन और माइक्रॉफ्ट टाइपिंग योजना सरलीकरण और एनएफए सरलीकरण के बीच संबंध को औपचारिक रूप दिया गया और दिखाया कि उपटाइपिंग की औपचारिकता पर एक बीजगणितीय टेक ने एमएल जैसी भाषा (जिसे एमएलसब कहा जाता है) के लिए कॉम्पैक्ट प्रिंसिपल टाइपिंग योजनाएं तैयार करने की अनुमति दी। विशेष रूप से, उनकी प्रस्तावित टाइपिंग योजना में स्पष्ट बाधाओं के बजाय संघ और प्रतिच्छेदन प्रकारों के प्रतिबंधित रूप का उपयोग किया गया था। पार्रेक्स ने बाद में दावा किया यह बीजगणितीय सूत्रीकरण एल्गोरिथम डब्ल्यू से मिलते-जुलते अपेक्षाकृत सरल एल्गोरिथम के बराबर था, और यह कि यूनियन और इंटरसेक्शन प्रकारों का उपयोग आवश्यक नहीं था।

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

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

बाहरी संबंध

 * A literate Haskell implementation of Algorithm W along with its source code on GitHub.
 * A simple implementation of Hindley-Milner algorithm in Python.