सबटाइपिंग: Difference between revisions

From Vigyanwiki
No edit summary
m (30 revisions imported from alpha:सबटाइपिंग)
 
(28 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{short description|Form of type polymorphism}}
{{short description|Form of type polymorphism}}
{{Polymorphism}}
[[प्रोग्रामिंग भाषा सिद्धांत|प्रोग्रामिंग लैंग्वेज थ्योरी]] में, '''सबटाइपिंग''' (सबटाइपिंग पोलिमोर्फ़िज्म या इन्क्लूसिव पोलिमोर्फ़िज्म) [[बहुरूपता (कंप्यूटर विज्ञान)|पोलिमोर्फ़िज्म (कंप्यूटर विज्ञान)]] का रूप है जिसमें सबटाइप [[डेटा प्रकार|डेटा टाइप]] होता है जो [[प्रतिस्थापन|सब्स्टिट्युटबिलिटी]] के नोशन द्वारा किसी अन्य डेटाटाइप (सुपरटाइप) से संबंधित है, जिसका अर्थ है कि प्रोग्राम एलिमेंट्स, सामान्यतः [[सबरूटीन्स]] या फंक्शन, जो सुपरटाइप के एलिमेंट्स पर ऑपरेट करने के लिए लिखे गए हैं, वे सबटाइप के एलिमेंट्स पर भी ऑपरेट कर सकते हैं। यदि S, T का सबटाइप है, तो सबटाइपिंग बाइनरी रिलेशन ( {{math|1=''S'' &lt;: ''T''}},  {{math|1=''S'' ⊑ ''T''}},<ref>Copestake, Ann. Implementing typed feature structure grammars. Vol. 110. Stanford: CSLI publications, 2002.</ref> या {{math|1=''S'' ≤: ''T''}} के रूप में लिखा गया है) का तात्पर्य है कि टाइप S के किसी भी शब्द को किसी भी कॉन्टेक्स्ट में सुरक्षित रूप से प्रयोग किया जा सकता है जहां टाइप T एक्सपेक्टेड होता है। यहां सबटाइपिंग का सेमैंटिक्स विशेष रूप से इस तथ्य पर निर्भर करता है कि सुरक्षित रूप से कैसे उपयोग किया जाए और किसी भी कॉन्टेक्स्ट को किसी फॉर्मल लैंग्वेज या [[प्रोग्रामिंग भाषा|प्रोग्रामिंग लैंग्वेज]] द्वारा डिफाइन किया जाता है। प्रोग्रामिंग लैंग्वेज का [[प्रकार प्रणाली|टाइप सिस्टम]] अनिवार्य रूप से अपने सबटाइपिंग रिलेशन को डिफाइन करता है, जो [[पहचान संबंध|ट्रिविअल]] हो सकता है, लैंग्वेज को कन्वर्शन मैकेनिज्म को सपोर्ट नहीं करना चाहिए।
[[प्रोग्रामिंग भाषा सिद्धांत]] में, सबटाइपिंग (उपप्रकार बहुरूपता या समावेशी बहुरूपता भी) [[बहुरूपता (कंप्यूटर विज्ञान)]] का एक रूप है जिसमें एक उपप्रकार एक [[डेटा प्रकार]] है जो [[प्रतिस्थापन]] की कुछ धारणा द्वारा किसी अन्य डेटाटाइप (सुपरटाइप) से संबंधित है, जिसका अर्थ है कि प्रोग्राम तत्व , सामान्यतः[[सबरूटीन्स]] या फ़ंक्शंस, जो सुपरटाइप के तत्वों पर काम करने के लिए लिखे गए हैं, वे सबटाइप के तत्वों पर भी काम कर सकते हैं। यदि S, T का उपप्रकार है, तो उपप्रकार बाइनरी संबंध (के रूप में लिखा गया है {{math|1=''S'' &lt;: ''T''}},  {{math|1=''S'' ⊑ ''T''}},<ref>Copestake, Ann. Implementing typed feature structure grammars. Vol. 110. Stanford: CSLI publications, 2002.</ref> या{{math|1=''S'' ≤: ''T''}}) का मतलब है कि टाइप एस के किसी भी शब्द को किसी भी संदर्भ में सुरक्षित रूप से इस्तेमाल किया जा सकता है जहां टाइप टी की उम्मीद की जाती है। यहां सबटाइपिंग का सटीक शब्दार्थ विशेष रूप से इस बात पर निर्भर करता है कि सुरक्षित रूप से कैसे उपयोग किया जाए और किसी भी संदर्भ को किसी औपचारिक भाषा या [[प्रोग्रामिंग भाषा]] द्वारा परिभाषित किया जाए। एक प्रोग्रामिंग भाषा की [[प्रकार प्रणाली]] अनिवार्य रूप से अपने स्वयं के उपप्रकार संबंध को परिभाषित करती है, जो अच्छी तरह से [[पहचान संबंध]] हो सकती है, भाषा को रूपांतरण तंत्र का समर्थन नहीं (या बहुत कम) करना चाहिए।


सबटाइपिंग संबंध के कारण, एक शब्द एक से अधिक प्रकार का हो सकता है। उपप्रकार इसलिए बहुरूपता का एक रूप है। [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] में 'पॉलीमॉर्फिज्म' शब्द का इस्तेमाल आमतौर पर केवल इस उपप्रकार पॉलीमॉर्फिज्म को संदर्भित करने के लिए किया जाता है, जबकि [[पैरामीट्रिक बहुरूपता]] की तकनीकों को [[सामान्य प्रोग्रामिंग]] माना जाएगा।
सबटाइपिंग संबंध के कारण, शब्द कई प्रकार का हो सकता है। सबटाइपिंग इसलिए पोलिमोर्फ़िज्म का रूप है। [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] में 'पॉलीमॉर्फिज्म' शब्द का प्रयोग सामान्यतः केवल इस सबटाइपिंग पॉलीमॉर्फिज्म को संदर्भित करने के लिए किया जाता है, जबकि [[पैरामीट्रिक बहुरूपता|पैरामीट्रिक पोलिमोर्फ़िज्म]] की प्रौद्योगिकी को [[सामान्य प्रोग्रामिंग]] माना जाता है।


[[कार्यात्मक प्रोग्रामिंग भाषाएं]] अक्सर [[रिकॉर्ड (कंप्यूटर विज्ञान)]] के उपप्रकार की अनुमति देती हैं। नतीजतन, केवल टाइप किए गए लैम्ब्डा कैलकुलस को रिकॉर्ड प्रकारों के साथ विस्तारित करना शायद सबसे सरल सैद्धांतिक सेटिंग है जिसमें उपप्रकार की एक उपयोगी धारणा को परिभाषित और अध्ययन किया जा सकता है।<ref>Cardelli, Luca. A semantics of multiple inheritance. In G. Kahn, D. MacQueen, and G. Plotkin, editors, Semantics of Data Types, volume 173 of Lecture Notes in Computer Science, pages 51–67. Springer-Verlag, 1984. Full version in Information and Computation, 76(2/3):138–164, 1988.</ref> क्योंकि परिणामी कलन शब्दों को एक से अधिक प्रकार की अनुमति देता है, यह अब एक साधारण प्रकार का सिद्धांत नहीं है। कार्यात्मक प्रोग्रामिंग भाषाओं के बाद से, परिभाषा के अनुसार, फ़ंक्शन शाब्दिक का समर्थन करता है, जिसे रिकॉर्ड में भी संग्रहीत किया जा सकता है, सबटाइपिंग के साथ रिकॉर्ड प्रकार ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग की कुछ विशेषताएं प्रदान करते हैं। आमतौर पर, कार्यात्मक प्रोग्रामिंग भाषाएं कुछ, आमतौर पर प्रतिबंधित, पैरामीट्रिक बहुरूपता का रूप भी प्रदान करती हैं। एक सैद्धांतिक सेटिंग में, दो विशेषताओं की बातचीत का अध्ययन करना वांछनीय है; एक सामान्य सैद्धांतिक सेटिंग सिस्टम F-sub|system F है<sub>&lt;:</sub>. ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के सैद्धांतिक गुणों को कैप्चर करने का प्रयास करने वाली विभिन्न गणनाएं सिस्टम F से प्राप्त की जा सकती हैं<sub>&lt;:</sub>.
[[कार्यात्मक प्रोग्रामिंग भाषाएं]] प्रायः [[रिकॉर्ड (कंप्यूटर विज्ञान)]] के सबटाइपिंग की अनुमति देती हैं। परिणामतः, केवल टाइप किए गए लैम्ब्डा गणना को रिकॉर्ड प्रकारों के साथ विस्तारित करना सबसे सरल सैद्धांतिक समुच्चयिंग है जिसमें सबटाइपिंग की उपयोगी धारणा को परिभाषित और अध्ययन किया जा सकता है।<ref>Cardelli, Luca. A semantics of multiple inheritance. In G. Kahn, D. MacQueen, and G. Plotkin, editors, Semantics of Data Types, volume 173 of Lecture Notes in Computer Science, pages 51–67. Springer-Verlag, 1984. Full version in Information and Computation, 76(2/3):138–164, 1988.</ref> क्योंकि परिणामी कलन शब्दों को कई प्रकार की अनुमति देता है, यह अब साधारण प्रकार का सिद्धांत नहीं है। कार्यात्मक प्रोग्रामिंग भाषाओं के पश्चात से, परिभाषा के अनुसार, फ़ंक्शन शाब्दिक का समर्थन करता है, जिसे रिकॉर्ड में भी संग्रहीत किया जा सकता है, सबटाइपिंग के साथ रिकॉर्ड प्रकार ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग की कुछ विशेषताएं प्रदान करते हैं। संभवतः फंक्शन ात्मक प्रोग्रामिंग भाषाएं सामान्यतः प्रतिबंधित, पैरामीट्रिक पोलिमोर्फ़िज्म का रूप भी प्रदान करती हैं। सैद्धांतिक समुच्चयिंग में, दो विशेषताओं का सम्बन्ध का अध्ययन करना वांछनीय है; सामान्य सैद्धांतिक समुच्चयिंग प्रणाली  F<sub><:</sub> है | ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के सैद्धांतिक गुणों को कैप्चर करने का प्रयास करने वाली विभिन्न गणनाएं प्रणाली F<sub><:</sub> से प्राप्त की जा सकती हैंI


उपप्रकार की अवधारणा [[सम्मोहन]] और पवित्रता की भाषाई धारणाओं से संबंधित है। यह गणितीय तर्क में [[परिबद्ध परिमाणीकरण]] की अवधारणा से भी संबंधित है ([[आदेश-क्रमबद्ध तर्क]] देखें)। उप-टाइपिंग को वस्तु-उन्मुख भाषाओं से (कक्षा या वस्तु) [[वंशानुक्रम (कंप्यूटर विज्ञान)]] की धारणा के साथ भ्रमित नहीं होना चाहिए;{{sfn|Cook|Hill|Canning|1990}} सबटाइपिंग प्रकारों (ऑब्जेक्ट-ओरिएंटेड पार्लेंस में इंटरफेस) के बीच एक संबंध है, जबकि इनहेरिटेंस एक भाषा सुविधा से उपजी कार्यान्वयन के बीच एक संबंध है जो नई वस्तुओं को मौजूदा वस्तुओं से बनाने की अनुमति देता है। कई ऑब्जेक्ट-ओरिएंटेड भाषाओं में, सबटाइपिंग को इंटरफ़ेस इनहेरिटेंस कहा जाता है,<!-- todo add the insightful example from Mitchell with stack/queue/dequeue in the body --> विरासत के साथ कार्यान्वयन विरासत के रूप में जाना जाता है।
सबटाइपिंग की अवधारणा [[सम्मोहन]] और पवित्रता की भाषाई धारणाओं से संबंधित है। यह गणितीय तर्क में [[परिबद्ध परिमाणीकरण]] की अवधारणा से भी संबंधित है ([[आदेश-क्रमबद्ध तर्क]] देखें)। सबटाइपिंग को वस्तु-उन्मुख भाषाओं (वर्ग या वस्तु) [[वंशानुक्रम (कंप्यूटर विज्ञान)]] की धारणा के साथ भ्रमित नहीं होना चाहिए | सबटाइपिंग प्रकारों (ऑब्जेक्ट-ओरिएंटेड पार्लेंस में इंटरफेस) के मध्य संबंध है, जबकि वंशानुक्रम लैंग्वेज सुविधा से उपजी फंक्शन समन्वय के मध्य ऐसा संबंध है जो नई वस्तुओं को उपस्तिथ वस्तुओं से बनाने की अनुमति देता है। कई ऑब्जेक्ट-ओरिएंटेड भाषाओं में, सबटाइपिंग को इंटरफ़ेस इनहेरिटेंस कहा जाता है, उत्तराधिकार के साथ फंक्शन समन्वय उत्तराधिकार के रूप में जाना जाता है।


== उत्पत्ति ==
== उत्पत्ति ==
प्रोग्रामिंग भाषाओं में सबटाइपिंग की धारणा 1960 के दशक की है; इसे [[शुरुआत]] डेरिवेटिव्स में पेश किया गया था। सबटाइपिंग का पहला औपचारिक उपचार 1980 में जॉन सी. रेनॉल्ड्स द्वारा दिया गया था, जिन्होंने [[निहित रूपांतरण]]ों को औपचारिक बनाने के लिए [[श्रेणी सिद्धांत]] का उपयोग किया था, और [[लुका कार्डेली]] (1985)<ref>Pierce, ch. 15 notes</ref>
प्रोग्रामिंग भाषाओं में सबटाइपिंग की धारणा 1960 के दशक की है; इसे [[शुरुआत|प्रारंभ]] में डेरिवेटिव्स में प्रस्तावित किया गया था। सबटाइपिंग का प्रथम औपचारिक उपचार 1980 में जॉन सी. रेनॉल्ड्स द्वारा दिया गया था, जिन्होंने [[निहित रूपांतरण]] को औपचारिक बनाने के लिए [[श्रेणी सिद्धांत]] और [[लुका कार्डेली]] (1985) का उपयोग किया था।<ref>Pierce, ch. 15 notes</ref>
ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग की मुख्यधारा अपनाने के साथ सबटाइपिंग की अवधारणा ने दृश्यता (और कुछ हलकों में बहुरूपता के साथ समानार्थक शब्द) प्राप्त की है। इस संदर्भ में, [[बारबरा लिस्कोव]] के बाद सुरक्षित प्रतिस्थापन के सिद्धांत को अक्सर [[लिस्कोव प्रतिस्थापन सिद्धांत]] कहा जाता है, जिसने इसे 1987 में ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग पर एक सम्मेलन में एक [[मुख्य भाषण]] में लोकप्रिय बनाया था। क्योंकि इसे परिवर्तनशील वस्तुओं पर विचार करना चाहिए, उपप्रकार की आदर्श धारणा लिस्कोव और [[जेनेट विंग]] द्वारा परिभाषित, जिसे [[व्यवहार उपप्रकार]] कहा जाता है, एक प्रकार के चेकर में लागू किए जा सकने वाले कार्यों की तुलना में काफी मजबूत है। (देखना {{section link||Function types}} विवरण के लिए नीचे।)
 
ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग की मुख्य धारा अपनाने के साथ सबटाइपिंग की अवधारणा ने दृश्यता (और कुछ हलकों में पोलिमोर्फ़िज्म के साथ समानार्थक शब्द) प्राप्त की है। इस संदर्भ में, [[बारबरा लिस्कोव]] के पश्चात सुरक्षित प्रतिस्थापन के सिद्धांत को प्रायः [[लिस्कोव प्रतिस्थापन सिद्धांत]] कहा जाता है, जिसने इसे 1987 में ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग पर सम्मेलन में [[मुख्य भाषण]] में लोकप्रिय बनाया था। क्योंकि इसे परिवर्तनशील वस्तुओं पर विचार करना चाहिए, लिस्कोव और [[जेनेट विंग]] द्वारा परिभाषित सबटाइपिंग की आदर्श धारणा, जिसे [[व्यवहार उपप्रकार|व्यवहार सबटाइपिंग]] कहा जाता है, किसी चेकर में प्रारम्भ किए जा सकने वाले कार्यों की तुलना में अधिक सरल है। (देखना {{section link||फंक्शन के प्रकार}} विवरण के लिए नीचे।)


== उदाहरण ==
== उदाहरण ==
[[Image:Inheritance.svg|thumb|right|350px|उपप्रकारों का उदाहरण: जहां पक्षी सुपरटाइप है और अन्य सभी उपप्रकार हैं जैसा कि [[एकीकृत मॉडलिंग भाषा]] नोटेशन में तीर द्वारा दर्शाया गया है]]आरेख में उपप्रकारों का एक सरल व्यावहारिक उदाहरण दिखाया गया है। प्रकार के पक्षी के तीन उपप्रकार बतख, कोयल और शुतुरमुर्ग होते हैं। संकल्पनात्मक रूप से, इनमें से प्रत्येक मूल प्रकार के पक्षी की एक किस्म है जो कई पक्षी विशेषताओं को प्राप्त करता है लेकिन कुछ विशिष्ट अंतर हैं। इस आरेख में यूनिफाइड मॉडलिंग लैंग्वेज नोटेशन का उपयोग किया जाता है, जिसमें ओपन-हेडेड एरो सुपरटाइप और उसके उपप्रकारों के बीच संबंध की दिशा और प्रकार दिखाते हैं।
[[Image:Inheritance.svg|thumb|right|350px|सबटाइपिंगों का उदाहरण: जहां पक्षी सुपरटाइप है और अन्य सभी सबटाइपिंग हैं जैसा कि [[एकीकृत मॉडलिंग भाषा|एकीकृत मॉडलिंग लैंग्वेज]]<nowiki> नोटेशन में तीर द्वारा दर्शाया गया है |</nowiki>]]आरेख में सबटाइपिंगों का सरल व्यावहारिक उदाहरण दिखाया गया है। इस प्रकार के पक्षी के तीन सबटाइपिंग बतख, कोयल और शुतुरमुर्ग होते हैं। संकल्पनात्मक रूप से, इनमें से प्रत्येक मूल प्रकार के पक्षी का ऐसा प्रकार है जो कई पक्षी विशेषताओं को प्राप्त करता है किन्तुकुछ विशिष्ट अंतर हैं। इस आरेख में यूनिफाइड मॉडलिंग लैंग्वेज नोटेशन का उपयोग किया जाता है, जिसमें ओपन-हेडेड एरो सुपरटाइप और उसके सबटाइपिंगों के मध्य संबंध की दिशा और प्रकार दिखाते हैं।


एक अधिक व्यावहारिक उदाहरण के रूप में, एक भाषा जहां भी फ़्लोटिंग पॉइंट मानों की अपेक्षा की जाती है, पूर्णांक मानों का उपयोग करने की अनुमति दे सकती है (<code>Integer</code> <: <code>Float</code>), या यह एक सामान्य प्रकार <samp>Number</samp> को पूर्णांकों और वास्तविक के सामान्य सुपरटाइप के रूप में परिभाषित कर सकता है। इस दूसरे मामले में, हमारे पास ही है <code>Integer</code> <: <code>Number</code> और <code>Float</code> <: <code>Number</code>, लेकिन <code>Integer</code> और <code>Float</code> एक दूसरे के उपप्रकार नहीं हैं।
अधिक व्यावहारिक उदाहरण के रूप में, ऐसी लैंग्वेज जहां भी फ़्लोटिंग पॉइंट मानों की अपेक्षा की जाती है, पूर्णांक मानों का उपयोग करने की अनुमति दे सकती है (<code>Integer</code> <: <code>Float</code>), या यह सामान्य प्रकार <samp>Number</samp> को पूर्णांकों और वास्तविक के सामान्य सुपरटाइप के रूप में परिभाषित कर सकता है। इसका दूसरा विषय भी हमारे निकट है<code>Integer</code> <: <code>Number</code> और <code>Float</code> <: <code>Number</code>, किन्तु <code>Integer</code> और <code>Float</code> एक दूसरे के सबटाइपिंग नहीं हैं।


प्रोग्रामर इसके बिना संभव होने की तुलना में सबटाइपिंग [[अमूर्त सिद्धांत (प्रोग्रामिंग)]] का लाभ उठा सकते हैं। निम्नलिखित उदाहरण पर विचार करें:
प्रोग्रामर इसके बिना संभव होने की तुलना में सबटाइपिंग [[अमूर्त सिद्धांत (प्रोग्रामिंग)]] का लाभ उठा सकते हैं। निम्नलिखित उदाहरण पर विचार करें:


<वाक्यविन्यास लैंग = वीबी>
function max (x as Number, y as Number) is
फ़ंक्शन अधिकतम (x संख्या के रूप में, y संख्या के रूप में) है
     if x < y then
     अगर एक्स <वाई तब
        वापसी वाई
    अन्य
        वापसी एक्स
अंत
</वाक्यविन्यास हाइलाइट>


यदि पूर्णांक और वास्तविक दोनों उपप्रकार हैं <code>Number</code>, और एक मनमाना संख्या के साथ तुलना के एक ऑपरेटर को दोनों प्रकारों के लिए परिभाषित किया गया है, फिर इस फ़ंक्शन को किसी भी प्रकार के मान पास किए जा सकते हैं। हालांकि, इस तरह के एक ऑपरेटर को लागू करने की संभावना संख्या प्रकार को अत्यधिक बाधित करती है (उदाहरण के लिए, कोई एक जटिल संख्या के साथ पूर्णांक की तुलना नहीं कर सकता है), और वास्तव में केवल पूर्णांक के साथ पूर्णांक की तुलना करना, और वास्तविक के साथ वास्तविक, समझ में आता है। इस फ़ंक्शन को पुनर्लेखन करना ताकि यह केवल उसी प्रकार के 'x' और 'y' को स्वीकार करे, जिसके लिए बाध्य बहुरूपता की आवश्यकता होती है।
        return y
    else
        return x
end
यदि पूर्णांक और वास्तविक दोनों <code>Number</code>के सबटाइपिंग हैं और किसी इच्छानुसार संख्या के साथ तुलना के ऑपरेटर को दोनों प्रकारों के लिए परिभाषित किया गया है, फिर इस फ़ंक्शन को किसी भी प्रकार के मान पास किए जा सकते हैं। चूँकि, इस प्रकार के ऑपरेटर को प्रारम्भ करने की संभावना संख्या प्रकार को अत्यधिक बाधित करती है (उदाहरण के लिए, कोई जटिल संख्या के साथ पूर्णांक की तुलना नहीं कर सकता है) और वास्तव में केवल पूर्णांक के साथ और वास्तविक के साथ की तुलना करना समझ में आता है। इस फ़ंक्शन को पुनर्लेखन करना जिससे यह केवल उसी प्रकार के 'x' और 'y' को स्वीकार करे, जिसके लिए बाध्य पोलिमोर्फ़िज्म की आवश्यकता होती है।


== सबमिशन ==
== सबमिशन ==


टाइप थ्योरी में सबसम्प्शन की अवधारणा<ref>Benjamin C. Pierce, ''Types and Programming Languages'', MIT Press, 2002, 15.1 "Subsumption", p. 181-182</ref> परिभाषित या मूल्यांकन करने के लिए प्रयोग किया जाता है कि क्या प्रकार S, प्रकार T का उपप्रकार है।
टाइप सिद्धांत में सबसम्प्शन की अवधारणा<ref>Benjamin C. Pierce, ''Types and Programming Languages'', MIT Press, 2002, 15.1 "Subsumption", p. 181-182</ref> परिभाषित या मूल्यांकन करने के लिए प्रयोग किया जाता है कि क्या प्रकार S, प्रकार T का सबटाइपिंग है|


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


उपधारणा की अवधारणा पर चर्चा करते हुए, एक प्रकार के मूल्यों के सेट को गणितीय इटैलिक में उसका नाम लिखकर इंगित किया जाता है: {{mvar|T}}. प्रकार, जिसे एक डोमेन पर एक विधेय के रूप में देखा जाता है, उसका नाम बोल्ड में लिखकर इंगित किया जाता है: T. पारंपरिक प्रतीक <: का अर्थ एक उपप्रकार है, और :> का अर्थ एक सुपरटाइप है।
उपधारणा की अवधारणा पर वर्णन करते हुए, विशेष प्रकार के मूल्यों के समुच्चय को गणितीय इटैलिक T में उसका नाम लिखकर प्रदर्शित किया जाता है | उसी प्रकार, जिसे डोमेन पर विधेय के रूप में देखा जाता है, उसका नाम बोल्ड '''T''' में लिखकर प्रदर्शित किया जाता है। पारंपरिक प्रतीक <: का अर्थ सबटाइपिंग है, और :> का अर्थ सुपरटाइप है।


* यदि मानों का सेट है तो एक प्रकार टी '' सबस्यूम '' एस {{mvar|T}} जो इसे परिभाषित करता है, वह समुच्चय का सुपरसेट है {{mvar|S}}, ताकि इसका हर सदस्य {{mvar|S}} का भी सदस्य है {{mvar|T}}.
* विशेष प्रकार T, S को ग्रहण करता है यदि मान T का समुच्चय जिसे वह परिभाषित करता है, समुच्चय {{mvar|S}} का सुपरसेट है, जिससे {{mvar|S}} का प्रत्येक सदस्य {{mvar|T}} का सदस्य भी हो।
* एक प्रकार को एक से अधिक प्रकार से सम्मिलित किया जा सकता है: S के सुपरटाइप्स पर प्रतिच्छेद करते हैं {{mvar|S}}.
* विशेष प्रकार में कई प्रकार सम्मिलित किये जाते है: S के सुपरटाइप्स पर S प्रतिच्छेद करते हैं|
* यदि एस <: टी (और इसलिए {{math|S ⊆ ''T'' }}), फिर T, वह विधेय जो समुच्चय को परिचालित करता है {{mvar|T}}, विधेय S (समान डोमेन पर) का हिस्सा होना चाहिए जो परिभाषित करता है {{mvar|S}}.
* यदि S, T को समाहित करता है, और T, S को समाहित करता है, तो दो प्रकार समान होते हैं (हालाँकि वे एक ही प्रकार के नहीं हो सकते हैं यदि प्रकार प्रणाली नाम से प्रकारों को अलग करती है)।


सूचना विशिष्टता के संदर्भ में, एक उपप्रकार को इसके किसी भी सुपरटाइप की तुलना में अधिक विशिष्ट माना जाता है, क्योंकि यह उनमें से प्रत्येक के रूप में कम से कम उतनी ही जानकारी रखता है। इसके अधिक सामान्य सुपरटाइप की तुलना में यह उपप्रकार की प्रयोज्यता, या 'प्रासंगिकता' (उन स्थितियों की संख्या जहां इसे स्वीकार या पेश किया जा सकता है) को बढ़ा सकता है। इस अधिक विस्तृत जानकारी के होने का नुकसान यह है कि यह सम्मिलित विकल्पों का प्रतिनिधित्व करता है जो उपप्रकार के 'प्रचलन' को कम करता है (उन स्थितियों की संख्या जो इसे उत्पन्न या उत्पन्न करने में सक्षम हैं)।
* यदि S<:T(और इसलिए {{math|S ⊆ ''T'' }}), फिर T, वह विधेय जो समुच्चय {{mvar|T}}  को परिचालित करता है, विधेय S (समान डोमेन पर) का भाग होना चाहिए जो  {{mvar|S}} को परिभाषित करता है |               
*यदि S, T को समाहित करता है, और T, S को ग्रहण करता है, तो दो प्रकार समान होते हैं (चूँकि वे एक ही प्रकार के नहीं हो सकते हैं यदि प्रकार प्रणाली नाम से प्रकारों को भिन्न करती है)।


सदस्यता के संदर्भ में, [[सेट-बिल्डर नोटेशन]] का उपयोग करके टाइप परिभाषाओं को व्यक्त किया जा सकता है, जो एक सेट को परिभाषित करने के लिए एक विधेय का उपयोग करता है। विधेय को एक डोमेन पर परिभाषित किया जा सकता है (संभावित मानों का सेट) {{mvar|D}}. विधेय आंशिक कार्य हैं जो मूल्यों की तुलना चयन मानदंड से करते हैं। उदाहरण के लिए: एक पूर्णांक मान 100 से अधिक या 200 से कम के बराबर है? . यदि कोई मान मापदंड से मेल खाता है तो फ़ंक्शन मान लौटाता है। यदि नहीं, तो मान का चयन नहीं किया जाता है और कुछ भी वापस नहीं किया जाता है। (सूची की समझ कई प्रोग्रामिंग भाषाओं में उपयोग किए जाने वाले इस पैटर्न का एक रूप है।)
सूचना विशिष्टता के संदर्भ में, सबटाइपिंग को इसके किसी भी सुपरटाइप की तुलना में अधिक विशिष्ट माना जाता है, क्योंकि यह उनमें से प्रत्येक के रूप में अल्प से अल्प उतनी ही जानकारी रखता है। इसके अधिक सामान्य सुपरटाइप की तुलना में यह सबटाइपिंग की प्रयोज्यता, या 'प्रासंगिकता' (उन स्थितियों की संख्या जहां इसे स्वीकार या प्रस्तावित किया जा सकता है) को बढ़ा सकता है। इस अधिक विस्तृत जानकारी के होने का हानि यह है कि यह सम्मिलित विकल्पों का प्रतिनिधित्व करता है जो सबटाइपिंग के 'प्रचलन' को अल्प करता है (उन स्थितियों की संख्या जो इसे उत्पन्न या उत्पन्न करने में सक्षम हैं)


यदि दो विधेय हैं, <math>P_T</math> जो टाइप टी के लिए चयन मानदंड लागू करता है, और <math>P_s</math> जो प्रकार S के लिए अतिरिक्त मानदंड लागू करता है, फिर दो प्रकार के सेट परिभाषित किए जा सकते हैं:
सदस्यता के संदर्भ में, [[सेट-बिल्डर नोटेशन|समुच्चय-बिल्डर नोटेशन]] का उपयोग करके टाइप परिभाषाओं को व्यक्त किया जा सकता है, जो समुच्चय को परिभाषित करने के लिए विधेय का उपयोग करता है। विधेय को डोमेन पर परिभाषित किया जा सकता है (संभावित मानों का समुच्चय) {{mvar|D}}, विधेय आंशिक फंक्शन हैं जो मूल्यों की तुलना चयन मानदंड से करते हैं। उदाहरण के लिए कोई पूर्णांक मान 100 से अधिक या 200 से अल्प के बराबर है? यदि कोई मान मापदंड से मेल खाता है तो फ़ंक्शन मान प्रदान करता है। यदि नहीं, तो मान का चयन नहीं किया जाता है और कुछ भी वापस नहीं किया जाता है। (सूची की समझ कई प्रोग्रामिंग भाषाओं में उपयोग किए जाने वाले इस प्रारूप का रूप है।)
 
यदि दो विधेय हैं, <math>P_T</math> जो टाइप T के लिए चयन मानदंड प्रारम्भ करता है, और <math>P_s</math> जो प्रकार S के लिए अतिरिक्त मानदंड प्रारम्भ करता है, फिर दो प्रकार के समुच्चय परिभाषित किए जा सकते हैं:


:<math>T = \{v \in D  \mid \ P_T(v)\}</math>
:<math>T = \{v \in D  \mid \ P_T(v)\}</math>
:<math>S =\{v \in D  \mid \ P_T(v)\text{ and }P_s(v)\}</math>
:<math>S =\{v \in D  \mid \ P_T(v)\text{ and }P_s(v)\}</math>
विधेय <math>\mathbf T = P_T</math> साथ लगाया जाता है <math>P_s</math> यौगिक विधेय एस परिभाषित करने के भाग के रूप में {{mvar|S}}. दो विधेय संयुक्त हैं, इसलिए दोनों का चयन करने के लिए मूल्य के लिए सत्य होना चाहिए। विधेय <math>\mathbf S = \mathbf T \land P_s = P_T \land P_s</math> विधेय T को ग्रहण करता है, इसलिए {{nowrap|'''S <: T'''.}}
विधेय <math>\mathbf T = P_T</math> साथ लगाया जाता है <math>P_s</math> यौगिक विधेय S परिभाषित करने के भाग के रूप में {{mvar|S}} दो विधेय संयुक्त हैं, इसलिए दोनों का चयन करने के लिए मूल्य के लिए सत्य होना चाहिए। विधेय <math>\mathbf S = \mathbf T \land P_s = P_T \land P_s</math> विधेय T को ग्रहण करता है, इसलिए {{nowrap|'''S <: T'''.}}
उदाहरण के लिए: फेलिना नामक बिल्ली प्रजातियों की एक उपप्रजाति है, जो फेलिडे परिवार का हिस्सा है। जीनस फेलिस, जिससे घरेलू बिल्ली प्रजाति फेलिस कैटस संबंधित है, उस उपपरिवार का हिस्सा है।
 
उदाहरण के लिए: फेलिना नामक बिल्ली प्रजातियों की उपप्रजाति है, जो फेलिडे परिवार का भाग है। जीनस फेलिस, जिससे घरेलू बिल्ली प्रजाति फेलिस कैटस संबंधित है, उस उप-परिवार का भाग है।


:<math>\mathit{Felinae = \{cat \in Felidae  \mid \ ofSubfamily(cat, felinaeSubfamilyName)\}}</math>
:<math>\mathit{Felinae = \{cat \in Felidae  \mid \ ofSubfamily(cat, felinaeSubfamilyName)\}}</math>
:<math>\mathit{Felis =\{cat \in Felinae \mid \ ofGenus(cat, felisGenusName)\}}</math>
:<math>\mathit{Felis =\{cat \in Felinae \mid \ ofGenus(cat, felisGenusName)\}}</math>
पहले विधेय के अनुरूप मूल्यों के डोमेन पर दूसरे विधेय के अनुप्रयोग के माध्यम से विधेय के संयोजन को यहाँ व्यक्त किया गया है। प्रकार के रूप में देखा, {{nowrap|'''Felis <: Felinae <: Felidae'''}}.
पूर्व विधेय के अनुरूप मूल्यों के डोमेन पर दूसरे विधेय के अनुप्रयोग के माध्यम से विधेय के संयोजन को यहाँ व्यक्त किया गया है। प्रकार के रूप में देखा, {{nowrap|'''Felis <: Felinae <: Felidae'''}}.


यदि T, S (T :> S) को समाहित करता है तो एक प्रक्रिया, कार्य या अभिव्यक्ति को एक मान दिया जाता है <math>s \in S</math> एक ऑपरेंड के रूप में (पैरामीटर मान या शब्द) इसलिए उस मान पर टाइप टी में से एक के रूप में काम करने में सक्षम होगा, क्योंकि <math>s \in T</math>. उपरोक्त उदाहरण में, हम उम्मीद कर सकते हैं कि सबफैमिली का कार्य सभी तीन प्रकारों 'फेलिडे', 'फेलिना' और 'फेलिस' के मूल्यों पर लागू होगा।
यदि T, S (T:> S) को समाहित करता है तो प्रक्रिया, फंक्शन या अभिव्यक्ति को मान दिया जाता है <math>s \in S</math> ऑपरेंड के रूप में (पैरामीटर मान या शब्द) इसलिए उस मान पर टाइप T में से किस के रूप में फंक्शन करने में सक्षम होगा, क्योंकि <math>s \in T</math> है | उपरोक्त उदाहरण में, हम आशा कर सकते हैं कि उप-परिवार का फंक्शन सभी तीन प्रकारों 'फेलिडे', 'फेलिना' और 'फेलिस' के मूल्यों पर प्रारम्भ होगा।


== सबटाइपिंग योजनाएं ==
== सबटाइपिंग स्कीम्स ==


प्रकार सिद्धांतकार [[नाममात्र प्रकार प्रणाली]] के बीच अंतर करते हैं, जिसमें केवल एक निश्चित तरीके से घोषित प्रकार एक दूसरे के उपप्रकार हो सकते हैं, और [[संरचनात्मक प्रकार प्रणाली]], जिसमें दो प्रकार की संरचना निर्धारित करती है कि एक दूसरे का उपप्रकार है या नहीं। ऊपर वर्णित वर्ग-आधारित ऑब्जेक्ट-ओरिएंटेड सबटाइपिंग नाममात्र है; किसी वस्तु-उन्मुख भाषा के लिए एक संरचनात्मक उपप्रकार नियम यह कह सकता है कि यदि प्रकार 'ए' की वस्तुएं उन सभी संदेशों को संभाल सकती हैं जो 'बी' प्रकार की वस्तुएं संभाल सकती हैं (अर्थात, यदि वे सभी समान विधि को परिभाषित करते हैं (कंप्यूटर विज्ञान) एस), तो ''ए'' ''बी'' का एक उपप्रकार है, भले ही दूसरे से वंशानुक्रम (कंप्यूटर विज्ञान) हो या नहीं। यह तथाकथित ''[[बतख टाइपिंग]]'' गतिशील रूप से टाइप की गई वस्तु-उन्मुख भाषाओं में आम है। वस्तु प्रकार के अलावा अन्य प्रकार के लिए ध्वनि संरचनात्मक उपप्रकार नियम भी सर्वविदित हैं।{{citation needed|date=June 2012}}
प्रकार सिद्धांतकार [[नाममात्र प्रकार प्रणाली]] के मध्य अंतर करते हैं, जिसमें केवल निश्चित विधि से घोषित आपस के सबटाइपिंग हो सकते हैं, और [[संरचनात्मक प्रकार प्रणाली]], जिसमें दो प्रकार की संरचना निर्धारित करती है कि वो दूसरे का सबटाइपिंग है या नहीं है। ऊपर वर्णित वर्ग-आधारित ऑब्जेक्ट-ओरिएंटेड सबटाइपिंग नाममात्र है; किसी वस्तु-उन्मुख लैंग्वेज के लिए संरचनात्मक सबटाइपिंग नियम यह कह सकता है कि यदि प्रकार A की वस्तुएं उन सभी संदेशों को संभाल सकती हैं जो B प्रकार की वस्तुएं संभाल सकती हैं (अर्थात, यदि वे सभी समान विधि को परिभाषित करते हैं, तो A, B का सबटाइपिंग है, दूसरे से वंशानुक्रम हो या नहीं। यह तथाकथित ''[[बतख टाइपिंग|डक टाइपिंग]]'' गतिशील रूप से टाइप की गई वस्तु-उन्मुख भाषाओं में सरल है। वस्तु प्रकार के अतिरिक्त अन्य प्रकार के लिए ध्वनि संरचनात्मक सबटाइपिंग नियम भी सर्वविदित हैं। सबटाइपिंग के साथ प्रोग्रामिंग भाषाओं के कार्यसमन्वय दो सामान्य वर्गों में सम्मलित हैं: समावेशी कार्यसमन्वय, जिसमें टाइप A के किसी भी मूल्य का प्रतिनिधित्व भी टाइप B पर समान मान का प्रतिनिधित्व करता है | यदि A <: बB, और उत्तम रूप से कार्यसमन्वय, जिसमें टाइप A का मान स्वचालित रूप से प्रकार B में परिवर्तित किया जा सकता है। वस्तु-उन्मुख लैंग्वेज में उप-वर्गीकरण द्वारा प्रेरित सबटाइपिंग सामान्यतः समावेशी होता है; पूर्णांक और फ़्लोटिंग-पॉइंट नंबरों से संबंधित सबटाइपिंग संबंध, जो भिन्न-भिन्न प्रतिनिधित्व करते हैं, सामान्यतः उत्तम रूप के होते हैं।
सबटाइपिंग के साथ प्रोग्रामिंग भाषाओं के कार्यान्वयन दो सामान्य वर्गों में आते हैं: समावेशी कार्यान्वयन, जिसमें टाइप के किसी भी मूल्य का प्रतिनिधित्व भी टाइप बी पर समान मान का प्रतिनिधित्व करता है यदि <: बी, और जबरदस्त कार्यान्वयन, जिसमें टाइप का मान स्वचालित रूप से एक प्रकार बी में परिवर्तित किया जा सकता है। वस्तु-उन्मुख भाषा में उपवर्गीकरण द्वारा प्रेरित उपप्रकार आमतौर पर समावेशी होता है; पूर्णांक और फ़्लोटिंग-पॉइंट नंबरों से संबंधित उपप्रकार संबंध, जो अलग-अलग प्रतिनिधित्व करते हैं, आमतौर पर ज़बरदस्त होते हैं।


सबटाइपिंग संबंध को परिभाषित करने वाली लगभग सभी प्रकार की प्रणालियों में, यह रिफ्लेक्सिव (मतलब A <: A किसी भी प्रकार A के लिए) और सकर्मक (अर्थात् यदि A <: B और B <: C तो A <: C) है। यह इसे प्रकारों पर एक [[पूर्व आदेश]] बनाता है।
सबटाइपिंग संबंध को परिभाषित करने वाली लगभग सभी प्रकार की सिस्टम्स में, यह कर्मकर्त्ता (अर्थ A <: A किसी भी प्रकार A के लिए) और सकर्मक (अर्थात् यदि A <: B और B <: C तो A <: C) है। यह इस प्रकार[[पूर्व आदेश]] बनाता है।


== रिकॉर्ड प्रकार ==
== रिकॉर्ड टाइप्स ==


=== चौड़ाई और गहराई उपप्रकार ===
=== विड्थ और डेप्थ सबटाइपिंग ===


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


याद रखें कि एक रिकॉर्ड (नामित) फ़ील्ड का एक संग्रह है। चूंकि एक उपप्रकार एक प्रकार है जो मूल प्रकार पर अनुमत सभी परिचालनों की अनुमति देता है, एक रिकॉर्ड उपप्रकार को फ़ील्ड पर उसी संचालन का समर्थन करना चाहिए जो मूल प्रकार समर्थित है।
याद रखें कि रिकॉर्ड (नामित) फ़ील्ड का कोई संग्रह है। चूंकि सबटाइपिंग ऐसा प्रकार है जो मूल प्रकार पर अनुमत सभी परिचालनों की अनुमति देता है, रिकॉर्ड सबटाइपिंग को फ़ील्ड पर उसी संचालन का समर्थन करना चाहिए जो मूल प्रकार समर्थित है।


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


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


अभिलेखों की उप-टाइपिंग को System F-sub|System F में परिभाषित किया जा सकता है<sub><:</sub>, जो रिकॉर्ड प्रकारों के उपप्रकार के साथ पैरामीट्रिक बहुरूपता को जोड़ती है और कई कार्यात्मक प्रोग्रामिंग भाषाओं के लिए सैद्धांतिक आधार है जो दोनों सुविधाओं का समर्थन करती हैं।
अभिलेखों की सबटाइपिंग को प्रणाली F<sub><:</sub> में परिभाषित किया जा सकता है जो रिकॉर्ड प्रकारों के सबटाइपिंग के साथ पैरामीट्रिक पोलिमोर्फ़िज्म को जोड़ती है और कई कार्यात्मक प्रोग्रामिंग भाषाओं के लिए सैद्धांतिक आधार है जो दोनों सुविधाओं का समर्थन करती हैं।


कुछ प्रणालियाँ लेबल किए गए असंयुक्त संघ प्रकारों (जैसे [[बीजगणितीय डेटा प्रकार]]) के उप-टाइपिंग का भी समर्थन करती हैं। चौड़ाई उपप्रकार का नियम उलटा है: चौड़ाई उपप्रकार में दिखाई देने वाला प्रत्येक टैग चौड़ाई सुपरटाइप में दिखाई देना चाहिए।
कुछ प्रणालियाँ लेबल किए गए असंयुक्त संघ प्रकारों (जैसे [[बीजगणितीय डेटा प्रकार]]) के सबटाइपिंग का भी समर्थन करती हैं। चौड़ाई सबटाइपिंग का नियम विपरीत है, चौड़ाई सबटाइपिंग में दिखाई देने वाला प्रत्येक टैग चौड़ाई सुपरटाइप में दिखाई देना चाहिए।


== समारोह प्रकार ==
== फंक्शन टाइप्स ==


अगर {{math|1=''T''<sub>1</sub> → ''T''<sub>2</sub>}} एक फ़ंक्शन प्रकार है, तो इसका एक उप प्रकार कोई फ़ंक्शन प्रकार है {{math|1=''S''<sub>1</sub> → ''S''<sub>2</sub>}} उस संपत्ति के साथ {{math|1=''T''<sub>1</sub> <: ''S''<sub>1</sub>}} और {{math|1=''S''<sub>2</sub> <: ''T''<sub>2</sub>.}} निम्नलिखित [[टाइपिंग नियम]] का उपयोग करके इसे संक्षेप में प्रस्तुत किया जा सकता है:
यदि {{math|1=''T''<sub>1</sub> → ''T''<sub>2</sub>}} कोई फ़ंक्शन प्रकार है, तो इसका उप प्रकार कोई फ़ंक्शन प्रकार है {{math|1=''S''<sub>1</sub> → ''S''<sub>2</sub>}} उस संपत्ति के साथ {{math|1=''T''<sub>1</sub> <: ''S''<sub>1</sub>}} और {{math|1=''S''<sub>2</sub> <: ''T''<sub>2</sub>.}} निम्नलिखित [[टाइपिंग नियम]] का उपयोग करके इसे संक्षेप में प्रस्तुत किया जा सकता है:


<math display="block">{T_1 \leq: S_1 \quad S_2 \leq: T_2}
<math display="block">{T_1 \leq: S_1 \quad S_2 \leq: T_2}
Line 92: Line 91:
{S_1 \rightarrow S_2 \leq: T_1 \rightarrow T_2}
{S_1 \rightarrow S_2 \leq: T_1 \rightarrow T_2}
</math>
</math>
पैरामीटर प्रकार {{math|1=''S''<sub>1</sub> → ''S''<sub>2</sub>}} सहप्रसरण और प्रतिप्रसरण (कंप्यूटर विज्ञान) कहा जाता है क्योंकि इसके लिए उपप्रकार संबंध उल्टा होता है, जबकि वापसी का प्रकार सहप्रसरण और प्रतिप्रसरण (कंप्यूटर विज्ञान) है। अनौपचारिक रूप से, यह उलटा होता है क्योंकि परिष्कृत प्रकार उन प्रकारों में अधिक उदार होता है जिन्हें वह स्वीकार करता है और जिस प्रकार से लौटता है उसमें अधिक रूढ़िवादी होता है। [[स्काला (प्रोग्रामिंग भाषा)]] में यही वास्तव में काम करता है: एक एन-आरी फ़ंक्शन आंतरिक रूप से एक वर्ग है जो इनहेरिट करता है <math>\mathtt{ Function_N({-A_1}, {-A_2}, \dots, {-A_n}, {+B})}</math> [[विशेषता (कंप्यूटर प्रोग्रामिंग)]] (जिसे [[जावा (प्रोग्रामिंग भाषा)]] जैसी भाषाओं में एक सामान्य [[अप्लिकेशन प्रोग्रामिंग अंतरफलक]] के रूप में देखा जा सकता है), जहां <math>\mathtt{A_1, A_2, \dots, A_n}</math> पैरामीटर प्रकार हैं, और <math>\mathtt{B}</math> इसका वापसी प्रकार है; − प्रकार से पहले का अर्थ है कि प्रकार प्रतिपरिवर्ती है जबकि + का अर्थ सहपरिवर्ती है।
पैरामीटर प्रकार {{math|1=''S''<sub>1</sub> → ''S''<sub>2</sub>}} सह-प्रसरण और प्रति-प्रसरण (कंप्यूटर विज्ञान) कहा जाता है क्योंकि इसके लिए सबटाइपिंग संबंध विपरीत होता है, जबकि वापसी का प्रकार सह-प्रसरण और प्रति-प्रसरण (कंप्यूटर विज्ञान) है। अनौपचारिक रूप से, यह विपरीत होता है क्योंकि परिष्कृत प्रकार उन प्रकारों में अधिक उदार होता है जिन्हें वह स्वीकार करता है और जिस प्रकार से लौटता है उसमें अधिक रूढ़िवादी होता है। [[स्काला (प्रोग्रामिंग भाषा)|स्काला (प्रोग्रामिंग लैंग्वेज)]] में यही वास्तव में फंक्शन करता है: एन-आरी फ़ंक्शन आंतरिक रूप से वह वर्ग है जो इनहेरिट करता है| <math>\mathtt{ Function_N({-A_1}, {-A_2}, \dots, {-A_n}, {+B})}</math> [[विशेषता (कंप्यूटर प्रोग्रामिंग)]] (जिसे [[जावा (प्रोग्रामिंग भाषा)|जावा (प्रोग्रामिंग लैंग्वेज)]] जैसी भाषाओं में सामान्य [[अप्लिकेशन प्रोग्रामिंग अंतरफलक]] के रूप में देखा जा सकता है), जहां <math>\mathtt{A_1, A_2, \dots, A_n}</math> पैरामीटर प्रकार हैं, और <math>\mathtt{B}</math> इसका वापसी प्रकार है;− प्रकार से पूर्वका का अर्थ है कि प्रकार प्रतिपरिवर्ती है जबकि + का अर्थ सहपरिवर्ती है।
 
अधिकांश ऑब्जेक्ट-ओरिएंटेड भाषाओं की तरह साइड इफेक्ट की अनुमति देने वाली भाषाओं में, उप-टाइपिंग आम तौर पर यह गारंटी देने के लिए पर्याप्त नहीं है कि एक फ़ंक्शन को दूसरे के संदर्भ में सुरक्षित रूप से उपयोग किया जा सकता है। इस क्षेत्र में लिस्कोव का काम व्यवहार उपप्रकार पर केंद्रित है, जो इस लेख में चर्चा की गई प्रकार प्रणाली सुरक्षा के अलावा यह भी आवश्यक है कि उपप्रकार अनुबंध द्वारा कुछ डिजाइन में सुपरटेप द्वारा गारंटीकृत सभी [[अपरिवर्तनीय (कंप्यूटर विज्ञान)]] को संरक्षित करें।<ref name="LSP">Barbara Liskov, Jeannette Wing, ''[http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.39.1223 A behavioral notion of subtyping]'', ACM Transactions on Programming Languages and Systems, Volume 16, Issue 6 (November 1994), pp. 1811–1841. An updated version appeared as CMU technical report: {{cite web|url=http://reports-archive.adm.cs.cmu.edu/anon/1999/CMU-CS-99-156.ps|title=Behavioral Subtyping Using Invariants and Constraints|last=Liskov|first=Barbara|author-link=Barbara Liskov|author2=Wing, Jeannette |author-link2=Jeannette Wing |date=July 1999|format=[[PostScript|PS]]|access-date=2006-10-05}}</ref> उपप्रकार की यह परिभाषा आम तौर पर [[अनिर्णीत समस्या]] है, इसलिए इसे एक प्रकार के चेकर द्वारा सत्यापित नहीं किया जा सकता है।


[[अपरिवर्तनीय वस्तु]]ओं का उपप्रकार पैरामीटर मानों और वापसी मूल्यों के उपचार के समान है। राइट-ओनली रेफरेंस (या सिंक) कंट्रावेरिएंट हैं, जैसे पैरामीटर मान; रीड-ओनली रेफरेंस (या स्रोत) कॉन्वर्सिएंट हैं, जैसे रिटर्न वैल्यू। परिवर्तनीय संदर्भ जो स्रोत और सिंक दोनों के रूप में कार्य करते हैं, वे अपरिवर्तनीय हैं।
अधिकांश ऑब्जेक्ट-ओरिएंटेड भाषाओं के प्रकार साइड इफेक्ट की अनुमति देने वाली भाषाओं में, सबटाइपिंग सरलता गारंटी देने के लिए पर्याप्त नहीं है कि किसी फ़ंक्शन को दूसरे के संदर्भ में सुरक्षित रूप से उपयोग किया जा सकता है। इस क्षेत्र में लिस्कोव का फंक्शन व्यवहार सबटाइपिंग पर केंद्रित है, जो इस लेख में वर्णन की गई प्रकार प्रणाली सुरक्षा के अतिरिक्त यह भी आवश्यक है कि सबटाइपिंग अनुबंध द्वारा कुछ डिजाइन में सुपरटेप द्वारा गारंटीकृत सभी [[अपरिवर्तनीय (कंप्यूटर विज्ञान)]] को संरक्षित करें।<ref name="LSP">Barbara Liskov, Jeannette Wing, ''[http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.39.1223 A behavioral notion of subtyping]'', ACM Transactions on Programming Languages and Systems, Volume 16, Issue 6 (November 1994), pp. 1811–1841. An updated version appeared as CMU technical report: {{cite web|url=http://reports-archive.adm.cs.cmu.edu/anon/1999/CMU-CS-99-156.ps|title=Behavioral Subtyping Using Invariants and Constraints|last=Liskov|first=Barbara|author-link=Barbara Liskov|author2=Wing, Jeannette |author-link2=Jeannette Wing |date=July 1999|format=[[PostScript|PS]]|access-date=2006-10-05}}</ref> सबटाइपिंग की यह परिभाषा सरलता [[अनिर्णीत समस्या]] है, इसलिए इसे किसी प्रकार के चेकर द्वारा सत्यापित नहीं किया जा सकता है।


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


उपप्रकार और वंशानुक्रम स्वतंत्र (ऑर्थोगोनल) संबंध हैं। वे संयोग कर सकते हैं, लेकिन कोई भी दूसरे का विशेष मामला नहीं है। दूसरे शब्दों में, दो प्रकार S और T के बीच, सबटाइपिंग और वंशानुक्रम के सभी संयोजन संभव हैं:
== इनहेरिटेंस के साथ संबंध ==
# S न तो उपप्रकार है और न ही T का व्युत्पन्न प्रकार है
# S एक उपप्रकार है लेकिन T का व्युत्पन्न प्रकार नहीं है
# S एक उपप्रकार नहीं है, बल्कि T का एक व्युत्पन्न प्रकार है
# S एक उप प्रकार और T का व्युत्पन्न प्रकार दोनों है
पहला मामला स्वतंत्र प्रकारों द्वारा चित्रित किया गया है, जैसे <code>Boolean</code> और <code>Float</code>.


दूसरे मामले को बीच के संबंध से चित्रित किया जा सकता है <code>Int32</code> और <code>Int64</code>. अधिकांश वस्तु उन्मुख प्रोग्रामिंग भाषाओं में, <code>Int64</code> विरासत से संबंधित नहीं हैं <code>Int32</code>. हालाँकि <code>Int32</code> का उपप्रकार माना जा सकता है <code>Int64</code> चूंकि किसी भी 32 बिट पूर्णांक मान को 64 बिट पूर्णांक मान में प्रचारित किया जा सकता है।
सबटाइपिंग और वंशानुक्रम स्वतंत्र (ऑर्थोगोनल) संबंध हैं। वे संयोग कर सकते हैं, किन्तु कोई भी दूसरे का विशेष विषय नहीं है। दूसरे शब्दों में, दो प्रकार S और T के मध्य, सबटाइपिंग और वंशानुक्रम के सभी संयोजन संभव हैं:
# S न तो सबटाइपिंग है और न ही T का व्युत्पन्न प्रकार है।
# S सबटाइपिंग है किन्तु T का व्युत्पन्न प्रकार नहीं है।
# S सबटाइपिंग नहीं है, किन्तु T का व्युत्पन्न प्रकार है।
# S  उप प्रकार और T का व्युत्पन्न प्रकार दोनों है।
प्रथम विषय स्वतंत्र प्रकारों द्वारा चित्रित किया गया है, जैसे <code>Boolean</code> और <code>Float</code>.


{{Original research|date=July 2022}}
दूसरे विषय को मध्य के संबंध से चित्रित किया जा सकता है <code>Int32</code> और <code>Int64</code>.अधिकांश वस्तु उन्मुख प्रोग्रामिंग भाषाओं में, <code>Int64</code>  <code>Int32</code> उत्तराधिकार से संबंधित नहीं हैं चूँकि  <code>Int32</code> को <code>Int64</code> का सबटाइपिंग माना जा सकता है चूंकि किसी भी 32 बिट पूर्णांक मान 64 बिट पूर्णांक मान में प्रचारित किया जा सकता है।
तीसरा मामला कार्यों के उपप्रकार का परिणाम है। मान लें कि टाइप टी का एक सुपर क्लास है जिसमें एक ही प्रकार की वस्तु लौटाने वाली विधि एम है (यानी एम का प्रकार टी → टी है, यह भी ध्यान दें कि एम का पहला पैरामीटर यह/स्वयं है) और टी से एक व्युत्पन्न वर्ग प्रकार एस वंशानुक्रम से, S में m का प्रकार S → S है।{{Citation needed|date=July 2022}} S को T का उपप्रकार होने के लिए S में m का प्रकार T में m के प्रकार का उपप्रकार होना चाहिए {{Citation needed|date=July 2022}}, दूसरे शब्दों में: S → S ≤: T → T. फ़ंक्शन सबटाइपिंग नियम के बॉटम-अप एप्लिकेशन द्वारा, इसका अर्थ है: S ≤: T और T ≤: S, जो केवल तभी संभव है जब S और T समान हों। चूँकि वंशानुक्रम एक अप्रतिवर्ती संबंध है, S, T का उपप्रकार नहीं हो सकता।


उपप्रकार और वंशानुक्रम तब संगत होते हैं जब सभी विरासत में मिले क्षेत्र और व्युत्पन्न प्रकार के तरीकों में ऐसे प्रकार होते हैं जो संबंधित क्षेत्रों के उपप्रकार होते हैं और विरासत में मिले प्रकार के तरीके होते हैं।{{sfn|Cook|Hill|Canning|1990}}
तृतीय विषय कार्यों के सबटाइपिंग का परिणाम है। मान लें कि टाइप T का सुपर क्लास है जिसमें एकल प्रकार की वस्तु लौटाने वाली विधि m है (जैसे M का प्रकार T → T है, यह भी ध्यान दें कि m का प्रथम पैरामीटर यह/स्वयं है) और T से व्युत्पन्न वर्ग प्रकार S वंशानुक्रम से, S में m का प्रकार S → S है। S को T का सबटाइपिंग होने के लिए S में m का प्रकार T में m के प्रकार का सबटाइपिंग होना चाहिए , दूसरे शब्दों में: S → S ≤: T → T. फ़ंक्शन सबटाइपिंग नियम के बॉटम-अप एप्लिकेशन द्वारा, इसका अर्थ है: S ≤: T और T ≤: S, जो केवल तभी संभव है जब S और T समान हों। चूँकि वंशानुक्रम अप्रतिवर्ती संबंध है, S, T का सबटाइपिंग नहीं हो सकता।


सबटाइपिंग और वंशानुक्रम तब संगत होते हैं जब सभी उत्तराधिकार में मिले क्षेत्र और व्युत्पन्न प्रकार के विधि में ऐसे प्रकार होते हैं जो संबंधित क्षेत्रों के सबटाइपिंग होते हैं और उत्तराधिकार में मिले प्रकार के विधि होते हैं।{{sfn|Cook|Hill|Canning|1990}}
== केर्सिओन्स ==
केर्सिओन्स सबटाइपिंग सिस्टम्स में, सबटाइपिंगों को सबटाइप से सुपरटाइप में इम्प्लीसिट [[प्रकार रूपांतरण|टाइप कन्वर्शन]] फंक्शन्स द्वारा डिफाइन किया जाता है। प्रत्येक सबटाइपिंग संबंध (S <: T) के लिए, केर्सिओन्स फंक्शन कोएर्स: S → T प्रदान किया जाता है, और टाइप S के किसी भी ऑब्जेक्ट को टाइप T का ऑब्जेक्ट कोएर्स <sub>''S'' → ''T''</sub>(s) माना जाता है। किसी केर्सिओन फ़ंक्शन को कम्पोजीशन द्वारा डिफाइन किया जा सकता है, यदि S <: T और T <: U तो s को कंपाउंड केर्सिओन्स <sub>''T'' → ''U''</sub> ∘ ''coerce'' <sub>''S'' → ''T''</sub> के अंतर्गत टाइप U के ऑब्जेक्ट के रूप में माना जा सकता है, इसी प्रकार ''coerce'' <sub>''T'' → ''T''</sub> [[पहचान समारोह|आइडेंटिटी फंक्शन]] ''id''<sub>T</sub> है।


== ज़बरदस्ती ==
रिकॉर्ड के लिए केर्सिओन्स फंक्शन और यूनियन सबटाइपिंगों को कॉम्पोनेन्ट के अनुसार डिफाइन किया जा सकता है; विड्थ-एक्सटेंडेड रिकॉर्ड के विषय में, केर्सिओन्स टाइप केवल उन कंपोनेंट्स को डिस्कार्ड कर देते है जो सुपरटाइप में डिफाइन नहीं हैं। फ़ंक्शन टाइप्स के लिए टाइप केर्सिओन्स <sub>''f'<nowiki/>''(''s'') = ''coerceS''2 → ''T''2(''f''(''coerceT''1 → ''S''1(''t''))), द्वारा दिया जा सकता है, जो पैरामीटर वैल्यूज के कॉण्ट्रावैरिअन्स और रिटर्न वैल्यूज के कोवेरियन्स को दर्शाता है।
जबरदस्ती उपप्रकार प्रणालियों में, उपप्रकारों को उपप्रकार से सुपरटाइप में अंतर्निहित [[प्रकार रूपांतरण]] कार्यों द्वारा परिभाषित किया जाता है। प्रत्येक उपप्रकार संबंध (S <: T) के लिए, एक ज़बरदस्ती कार्य बल: S → T प्रदान किया जाता है, और प्रकार S के किसी भी वस्तु को वस्तु बल के रूप में माना जाता है<sub>''S'' ''T''</sub>(s) टाइप T का। एक ज़बरदस्ती फ़ंक्शन को रचना द्वारा परिभाषित किया जा सकता है: यदि S <: T और T <: U तो s को यौगिक ज़बरदस्ती (ज़बरदस्ती) के तहत टाइप यू की वस्तु के रूप में माना जा सकता है<sub>''T'' → ''U''</sub> ∘ ज़बरदस्ती<sub>''S'' ''T''</sub>). प्रकार की ज़बरदस्ती एक प्रकार से अपने आप में ज़बरदस्ती<sub>''T'' ''T''</sub> [[पहचान समारोह]] आईडी है<sub>T</sub>.


रिकॉर्ड के लिए ज़बरदस्ती कार्य और संघ उपप्रकारों को अलग करना घटक के अनुसार परिभाषित किया जा सकता है; चौड़ाई-विस्तारित रिकॉर्ड के मामले में, प्रकार की ज़बरदस्ती केवल उन घटकों को छोड़ देती है जो सुपरटेप में परिभाषित नहीं हैं। फ़ंक्शन प्रकारों के लिए प्रकार का दबाव f'(s) = ज़बरदस्ती द्वारा दिया जा सकता है<sub>''S''<sub>2</sub> → टी<sub>2</sub></ उप> (एफ (ज़बरदस्ती<sub>''T''<sub>1</sub> → एस<sub>1</sub></sub>(t))), पैरामीटर मानों के सहप्रसरण और प्रतिप्रसरण (कंप्यूटर विज्ञान) और वापसी मूल्यों के सहप्रसरण को दर्शाता है।
केर्सिओन्स फंक्शन विशिष्ट रूप से सबटाइपिंग और [[supertype|सुपर टाइप]] को देखते हुए निर्धारित किया जाता है। इस प्रकार, जब कई सबटाइपिंग संबंधों को डिफाइन किया जाता है, तो यह सुनिश्चित करने के लिए सावधानी करनी चाहिए कि सभी टाइप केर्सिओन्स कोहेरेंट हैं। उदाहरण के लिए, यदि कोई इन्टिजर जैसे 2: इन्टिजर को फ्लोटिंग पॉइंट नंबर (जैसे, 2.0: फ्लोट) के लिए केर्सिओन किया जा सकता है, तो यह 2.1: ''फ्लोट'' 2: इन्टिजर के लिए केर्सिओन स्वीकार्य नहीं है, क्योंकि कंपाउंड केर्सिओन ''coerce<sub>float</sub>'' <sub>→ ''float''</sub> द्वारा दिया गया <sub>''int'' → ''float''</sub> ∘ ''coerce'' <sub>''float'' → ''int''</sub> तब आइडेंटिटी केर्सिओन्स ''id<sub>float</sub>'' से भिन्न होता है।
 
जबरदस्ती का कार्य विशिष्ट रूप से उपप्रकार और [[supertype]] को देखते हुए निर्धारित किया जाता है। इस प्रकार, जब कई उपप्रकार संबंधों को परिभाषित किया जाता है, तो यह सुनिश्चित करने के लिए सावधानी बरतनी चाहिए कि सभी प्रकार के दबाव सुसंगत हैं। उदाहरण के लिए, यदि एक पूर्णांक जैसे 2: इंट को एक फ्लोटिंग पॉइंट नंबर (जैसे, 2.0: फ्लोट) के लिए ज़बरदस्ती किया जा सकता है, तो यह 2.1: फ़्लोट टू 2: इंट के लिए ज़बरदस्ती स्वीकार्य नहीं है, क्योंकि यौगिक ज़बरदस्ती ज़बरदस्ती<sub>''float'' → ''float''</sub> जबरदस्ती दिया गया<sub>''int'' → ''float''</sub> ∘ ज़बरदस्ती<sub>''float'' → ''int''</sub> तब पहचान ज़बरदस्ती आईडी से अलग होगा<sub>''float''</sub>.


== यह भी देखें ==
== यह भी देखें ==
{{wikibooks|Ada Programming|Type System|Subtypes}}
{{wikibooks|Ada Programming|Type System|Subtypes}}
* सहप्रसरण और प्रतिप्रसरण (कंप्यूटर विज्ञान)
* कोवेरियन्स और कॉण्ट्रावेरियन्स (कंप्यूटर विज्ञान)
* [[वृत्त-दीर्घवृत्त समस्या]] (मूल्य-प्रकारों के समान आधार पर चर-प्रकारों को उपप्रकार करने के खतरों के लिए)
* [[वृत्त-दीर्घवृत्त समस्या|सर्किल-एलिप्स प्रॉब्लम]] (वैल्यू-टाइप्स के समान आधार पर वेरिएबल-टाइप्स को सबटाइपिंग करने के पेर्लिस के लिए)
* [[कक्षा आधारित प्रोग्रामिंग]]
* [[कक्षा आधारित प्रोग्रामिंग|क्लास-बेस्ड प्रोग्रामिंग]]
* [[शीर्ष प्रकार]]
* [[शीर्ष प्रकार|टॉप टाइप]]
* [[शोधन प्रकार]]
* [[शोधन प्रकार|रिफाइनमेंट टाइप]]
* व्यवहार उपप्रकार
* बिहेवियरल सबटाइपिंग


==टिप्पणियाँ==
==टिप्पणियाँ==
Line 136: Line 132:


== संदर्भ ==
== संदर्भ ==
'''Textbooks'''
 
{{refbegin}}
{{refbegin}}
* Benjamin C. Pierce, ''Types and programming languages'', MIT Press, 2002, {{ISBN|0-262-16209-1}}, chapter 15 (subtyping of record types), 19.3 (nominal vs. structural types and subtyping), and 23.2 (varieties of polymorphism)
* Benjamin C. Pierce, ''Types and programming languages'', MIT Press, 2002, {{ISBN|0-262-16209-1}}, chapter 15 (subtyping of record types), 19.3 (nominal vs. structural types and subtyping), and 23.2 (varieties of polymorphism)
* C. Szyperski, D. Gruntz, S. Murer, ''Component software: beyond object-oriented programming'', 2nd ed., Pearson Education, 2002, {{ISBN|0-201-74572-0}}, pp.&nbsp;93–95 (a high-level presentation aimed at programming language users)
* C. Szyperski, D. Gruntz, S. Murer, ''Component software: beyond object-oriented programming'', 2nd ed., Pearson Education, 2002, {{ISBN|0-201-74572-0}}, pp.&nbsp;93–95 (a high-level presentation aimed at programming language users)
{{refend}}
{{refend}}
'''Papers'''
 
{{refbegin}}{{Cite conference|last1=Cook|first1=William R.|last2=Hill|first2=Walter|last3=Canning|first3=Peter S.|doi=10.1145/96709.96721|title=Inheritance is not subtyping|conference=Proc. 17th ACM SIGPLAN-SIGACT Symp. on Principles of Programming Languages (POPL)|pages=125–135|year=1990|isbn=0-89791-343-4|citeseerx=10.1.1.102.8635}}
{{refbegin}}{{Cite conference|last1=Cook|first1=William R.|last2=Hill|first2=Walter|last3=Canning|first3=Peter S.|doi=10.1145/96709.96721|title=Inheritance is not subtyping|conference=Proc. 17th ACM SIGPLAN-SIGACT Symp. on Principles of Programming Languages (POPL)|pages=125–135|year=1990|isbn=0-89791-343-4|citeseerx=10.1.1.102.8635}}
* Reynolds, John C. Using category theory to design implicit conversions and generic operators. In N. D. Jones, editor, Proceedings of the Aarhus Workshop on Semantics-Directed Compiler Generation, number 94 in Lecture Notes in Computer Science. Springer-Verlag, January 1980. Also in Carl A. Gunter and John C. Mitchell, editors, Theoretical Aspects of Object-Oriented Programming: Types, Semantics, and Language Design (MIT Press, 1994).
* Reynolds, John C. Using category theory to design implicit conversions and generic operators. In N. D. Jones, editor, Proceedings of the Aarhus Workshop on Semantics-Directed Compiler Generation, number 94 in Lecture Notes in Computer Science. Springer-Verlag, January 1980. Also in Carl A. Gunter and John C. Mitchell, editors, Theoretical Aspects of Object-Oriented Programming: Types, Semantics, and Language Design (MIT Press, 1994).
{{refend}}
{{refend}}


[[Category:Collapse templates|Subtype Polymorphism]]
[[Category:Created On 16/02/2023|Subtype Polymorphism]]
[[Category:Machine Translated Page|Subtype Polymorphism]]
[[Category:Navigational boxes| ]]
[[Category:Navigational boxes without horizontal lists|Subtype Polymorphism]]
[[Category:Pages with broken file links|Subtype Polymorphism]]
[[Category:Pages with script errors|Subtype Polymorphism]]
[[Category:Short description with empty Wikidata description|Subtype Polymorphism]]
[[Category:Sidebars with styles needing conversion|Subtype Polymorphism]]
[[Category:Template documentation pages|Documentation/doc]]


== अग्रिम पठन ==
== अग्रिम पठन ==
Line 151: Line 157:
* [[John C. Reynolds]], ''Theories of programming languages'', Cambridge University Press, 1998, {{ISBN|0-521-59414-6}}, chapter 16.
* [[John C. Reynolds]], ''Theories of programming languages'', Cambridge University Press, 1998, {{ISBN|0-521-59414-6}}, chapter 16.
* [[Martín Abadi]], [[Luca Cardelli]], ''A theory of objects'', Springer, 1996, {{ISBN|0-387-94775-2}}. Section 8.6 contrast the subtyping of records and objects.
* [[Martín Abadi]], [[Luca Cardelli]], ''A theory of objects'', Springer, 1996, {{ISBN|0-387-94775-2}}. Section 8.6 contrast the subtyping of records and objects.
{{refend}}
{{data types}}
{{DEFAULTSORT:Subtype Polymorphism}}[[Category: डेटा के प्रकार]] [[Category: बहुरूपता (कंप्यूटर विज्ञान)]] [[Category: प्रकार सिद्धांत]] [[Category: ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]]


[[Category: Machine Translated Page]]
[[Category:Collapse templates|Subtype Polymorphism]]
[[Category:Created On 16/02/2023]]
[[Category:Created On 16/02/2023|Subtype Polymorphism]]
[[Category:Machine Translated Page|Subtype Polymorphism]]
[[Category:Navigational boxes| ]]
[[Category:Navigational boxes without horizontal lists|Subtype Polymorphism]]
[[Category:Pages with broken file links|Subtype Polymorphism]]
[[Category:Pages with script errors|Subtype Polymorphism]]
[[Category:Short description with empty Wikidata description|Subtype Polymorphism]]
[[Category:Sidebars with styles needing conversion|Subtype Polymorphism]]
[[Category:Template documentation pages|Documentation/doc]]
[[Category:Vigyan Ready]]

Latest revision as of 07:18, 19 October 2023

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

सबटाइपिंग संबंध के कारण, शब्द कई प्रकार का हो सकता है। सबटाइपिंग इसलिए पोलिमोर्फ़िज्म का रूप है। ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग में 'पॉलीमॉर्फिज्म' शब्द का प्रयोग सामान्यतः केवल इस सबटाइपिंग पॉलीमॉर्फिज्म को संदर्भित करने के लिए किया जाता है, जबकि पैरामीट्रिक पोलिमोर्फ़िज्म की प्रौद्योगिकी को सामान्य प्रोग्रामिंग माना जाता है।

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

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

उत्पत्ति

प्रोग्रामिंग भाषाओं में सबटाइपिंग की धारणा 1960 के दशक की है; इसे प्रारंभ में डेरिवेटिव्स में प्रस्तावित किया गया था। सबटाइपिंग का प्रथम औपचारिक उपचार 1980 में जॉन सी. रेनॉल्ड्स द्वारा दिया गया था, जिन्होंने निहित रूपांतरण को औपचारिक बनाने के लिए श्रेणी सिद्धांत और लुका कार्डेली (1985) का उपयोग किया था।[3]

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

उदाहरण

सबटाइपिंगों का उदाहरण: जहां पक्षी सुपरटाइप है और अन्य सभी सबटाइपिंग हैं जैसा कि एकीकृत मॉडलिंग लैंग्वेज नोटेशन में तीर द्वारा दर्शाया गया है |

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

अधिक व्यावहारिक उदाहरण के रूप में, ऐसी लैंग्वेज जहां भी फ़्लोटिंग पॉइंट मानों की अपेक्षा की जाती है, पूर्णांक मानों का उपयोग करने की अनुमति दे सकती है (Integer <: Float), या यह सामान्य प्रकार Number को पूर्णांकों और वास्तविक के सामान्य सुपरटाइप के रूप में परिभाषित कर सकता है। इसका दूसरा विषय भी हमारे निकट हैInteger <: Number और Float <: Number, किन्तु Integer और Float एक दूसरे के सबटाइपिंग नहीं हैं।

प्रोग्रामर इसके बिना संभव होने की तुलना में सबटाइपिंग अमूर्त सिद्धांत (प्रोग्रामिंग) का लाभ उठा सकते हैं। निम्नलिखित उदाहरण पर विचार करें:

function max (x as Number, y as Number) is

   if x < y then
        return y
    else
        return x
end

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

सबमिशन

टाइप सिद्धांत में सबसम्प्शन की अवधारणा[4] परिभाषित या मूल्यांकन करने के लिए प्रयोग किया जाता है कि क्या प्रकार S, प्रकार T का सबटाइपिंग है|

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

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

  • विशेष प्रकार T, S को ग्रहण करता है यदि मान T का समुच्चय जिसे वह परिभाषित करता है, समुच्चय S का सुपरसेट है, जिससे S का प्रत्येक सदस्य T का सदस्य भी हो।
  • विशेष प्रकार में कई प्रकार सम्मिलित किये जाते है: S के सुपरटाइप्स पर S प्रतिच्छेद करते हैं|
  • यदि S<:T(और इसलिए S ⊆ T ), फिर T, वह विधेय जो समुच्चय T को परिचालित करता है, विधेय S (समान डोमेन पर) का भाग होना चाहिए जो S को परिभाषित करता है |
  • यदि S, T को समाहित करता है, और T, S को ग्रहण करता है, तो दो प्रकार समान होते हैं (चूँकि वे एक ही प्रकार के नहीं हो सकते हैं यदि प्रकार प्रणाली नाम से प्रकारों को भिन्न करती है)।

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

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

यदि दो विधेय हैं, जो टाइप T के लिए चयन मानदंड प्रारम्भ करता है, और जो प्रकार S के लिए अतिरिक्त मानदंड प्रारम्भ करता है, फिर दो प्रकार के समुच्चय परिभाषित किए जा सकते हैं:

विधेय साथ लगाया जाता है यौगिक विधेय S परिभाषित करने के भाग के रूप में S दो विधेय संयुक्त हैं, इसलिए दोनों का चयन करने के लिए मूल्य के लिए सत्य होना चाहिए। विधेय विधेय T को ग्रहण करता है, इसलिए S <: T.

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

पूर्व विधेय के अनुरूप मूल्यों के डोमेन पर दूसरे विधेय के अनुप्रयोग के माध्यम से विधेय के संयोजन को यहाँ व्यक्त किया गया है। प्रकार के रूप में देखा, Felis <: Felinae <: Felidae.

यदि T, S (T:> S) को समाहित करता है तो प्रक्रिया, फंक्शन या अभिव्यक्ति को मान दिया जाता है ऑपरेंड के रूप में (पैरामीटर मान या शब्द) इसलिए उस मान पर टाइप T में से किस के रूप में फंक्शन करने में सक्षम होगा, क्योंकि है | उपरोक्त उदाहरण में, हम आशा कर सकते हैं कि उप-परिवार का फंक्शन सभी तीन प्रकारों 'फेलिडे', 'फेलिना' और 'फेलिस' के मूल्यों पर प्रारम्भ होगा।

सबटाइपिंग स्कीम्स

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

सबटाइपिंग संबंध को परिभाषित करने वाली लगभग सभी प्रकार की सिस्टम्स में, यह कर्मकर्त्ता (अर्थ A <: A किसी भी प्रकार A के लिए) और सकर्मक (अर्थात् यदि A <: B और B <: C तो A <: C) है। यह इस प्रकारपूर्व आदेश बनाता है।

रिकॉर्ड टाइप्स

विड्थ और डेप्थ सबटाइपिंग

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

याद रखें कि रिकॉर्ड (नामित) फ़ील्ड का कोई संग्रह है। चूंकि सबटाइपिंग ऐसा प्रकार है जो मूल प्रकार पर अनुमत सभी परिचालनों की अनुमति देता है, रिकॉर्ड सबटाइपिंग को फ़ील्ड पर उसी संचालन का समर्थन करना चाहिए जो मूल प्रकार समर्थित है।

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

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

अभिलेखों की सबटाइपिंग को प्रणाली F<: में परिभाषित किया जा सकता है जो रिकॉर्ड प्रकारों के सबटाइपिंग के साथ पैरामीट्रिक पोलिमोर्फ़िज्म को जोड़ती है और कई कार्यात्मक प्रोग्रामिंग भाषाओं के लिए सैद्धांतिक आधार है जो दोनों सुविधाओं का समर्थन करती हैं।

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

फंक्शन टाइप्स

यदि T1T2 कोई फ़ंक्शन प्रकार है, तो इसका उप प्रकार कोई फ़ंक्शन प्रकार है S1S2 उस संपत्ति के साथ T1 <: S1 और S2 <: T2. निम्नलिखित टाइपिंग नियम का उपयोग करके इसे संक्षेप में प्रस्तुत किया जा सकता है:

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

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

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

इनहेरिटेंस के साथ संबंध

सबटाइपिंग और वंशानुक्रम स्वतंत्र (ऑर्थोगोनल) संबंध हैं। वे संयोग कर सकते हैं, किन्तु कोई भी दूसरे का विशेष विषय नहीं है। दूसरे शब्दों में, दो प्रकार S और T के मध्य, सबटाइपिंग और वंशानुक्रम के सभी संयोजन संभव हैं:

  1. S न तो सबटाइपिंग है और न ही T का व्युत्पन्न प्रकार है।
  2. S सबटाइपिंग है किन्तु T का व्युत्पन्न प्रकार नहीं है।
  3. S सबटाइपिंग नहीं है, किन्तु T का व्युत्पन्न प्रकार है।
  4. S उप प्रकार और T का व्युत्पन्न प्रकार दोनों है।

प्रथम विषय स्वतंत्र प्रकारों द्वारा चित्रित किया गया है, जैसे Boolean और Float.

दूसरे विषय को मध्य के संबंध से चित्रित किया जा सकता है Int32 और Int64.अधिकांश वस्तु उन्मुख प्रोग्रामिंग भाषाओं में, Int64 Int32 उत्तराधिकार से संबंधित नहीं हैं चूँकि Int32 को Int64 का सबटाइपिंग माना जा सकता है चूंकि किसी भी 32 बिट पूर्णांक मान 64 बिट पूर्णांक मान में प्रचारित किया जा सकता है।

तृतीय विषय कार्यों के सबटाइपिंग का परिणाम है। मान लें कि टाइप T का सुपर क्लास है जिसमें एकल प्रकार की वस्तु लौटाने वाली विधि m है (जैसे M का प्रकार T → T है, यह भी ध्यान दें कि m का प्रथम पैरामीटर यह/स्वयं है) और T से व्युत्पन्न वर्ग प्रकार S वंशानुक्रम से, S में m का प्रकार S → S है। S को T का सबटाइपिंग होने के लिए S में m का प्रकार T में m के प्रकार का सबटाइपिंग होना चाहिए , दूसरे शब्दों में: S → S ≤: T → T. फ़ंक्शन सबटाइपिंग नियम के बॉटम-अप एप्लिकेशन द्वारा, इसका अर्थ है: S ≤: T और T ≤: S, जो केवल तभी संभव है जब S और T समान हों। चूँकि वंशानुक्रम अप्रतिवर्ती संबंध है, S, T का सबटाइपिंग नहीं हो सकता।

सबटाइपिंग और वंशानुक्रम तब संगत होते हैं जब सभी उत्तराधिकार में मिले क्षेत्र और व्युत्पन्न प्रकार के विधि में ऐसे प्रकार होते हैं जो संबंधित क्षेत्रों के सबटाइपिंग होते हैं और उत्तराधिकार में मिले प्रकार के विधि होते हैं।[6]

केर्सिओन्स

केर्सिओन्स सबटाइपिंग सिस्टम्स में, सबटाइपिंगों को सबटाइप से सुपरटाइप में इम्प्लीसिट टाइप कन्वर्शन फंक्शन्स द्वारा डिफाइन किया जाता है। प्रत्येक सबटाइपिंग संबंध (S <: T) के लिए, केर्सिओन्स फंक्शन कोएर्स: S → T प्रदान किया जाता है, और टाइप S के किसी भी ऑब्जेक्ट को टाइप T का ऑब्जेक्ट कोएर्स ST(s) माना जाता है। किसी केर्सिओन फ़ंक्शन को कम्पोजीशन द्वारा डिफाइन किया जा सकता है, यदि S <: T और T <: U तो s को कंपाउंड केर्सिओन्स TUcoerce ST के अंतर्गत टाइप U के ऑब्जेक्ट के रूप में माना जा सकता है, इसी प्रकार coerce TT आइडेंटिटी फंक्शन idT है।

रिकॉर्ड के लिए केर्सिओन्स फंक्शन और यूनियन सबटाइपिंगों को कॉम्पोनेन्ट के अनुसार डिफाइन किया जा सकता है; विड्थ-एक्सटेंडेड रिकॉर्ड के विषय में, केर्सिओन्स टाइप केवल उन कंपोनेंट्स को डिस्कार्ड कर देते है जो सुपरटाइप में डिफाइन नहीं हैं। फ़ंक्शन टाइप्स के लिए टाइप केर्सिओन्स f'(s) = coerceS2 → T2(f(coerceT1 → S1(t))), द्वारा दिया जा सकता है, जो पैरामीटर वैल्यूज के कॉण्ट्रावैरिअन्स और रिटर्न वैल्यूज के कोवेरियन्स को दर्शाता है।

केर्सिओन्स फंक्शन विशिष्ट रूप से सबटाइपिंग और सुपर टाइप को देखते हुए निर्धारित किया जाता है। इस प्रकार, जब कई सबटाइपिंग संबंधों को डिफाइन किया जाता है, तो यह सुनिश्चित करने के लिए सावधानी करनी चाहिए कि सभी टाइप केर्सिओन्स कोहेरेंट हैं। उदाहरण के लिए, यदि कोई इन्टिजर जैसे 2: इन्टिजर को फ्लोटिंग पॉइंट नंबर (जैसे, 2.0: फ्लोट) के लिए केर्सिओन किया जा सकता है, तो यह 2.1: फ्लोट 2: इन्टिजर के लिए केर्सिओन स्वीकार्य नहीं है, क्योंकि कंपाउंड केर्सिओन coercefloat float द्वारा दिया गया intfloatcoerce floatint तब आइडेंटिटी केर्सिओन्स idfloat से भिन्न होता है।

यह भी देखें

टिप्पणियाँ

  1. Copestake, Ann. Implementing typed feature structure grammars. Vol. 110. Stanford: CSLI publications, 2002.
  2. Cardelli, Luca. A semantics of multiple inheritance. In G. Kahn, D. MacQueen, and G. Plotkin, editors, Semantics of Data Types, volume 173 of Lecture Notes in Computer Science, pages 51–67. Springer-Verlag, 1984. Full version in Information and Computation, 76(2/3):138–164, 1988.
  3. Pierce, ch. 15 notes
  4. Benjamin C. Pierce, Types and Programming Languages, MIT Press, 2002, 15.1 "Subsumption", p. 181-182
  5. Barbara Liskov, Jeannette Wing, A behavioral notion of subtyping, ACM Transactions on Programming Languages and Systems, Volume 16, Issue 6 (November 1994), pp. 1811–1841. An updated version appeared as CMU technical report: Liskov, Barbara; Wing, Jeannette (July 1999). "Behavioral Subtyping Using Invariants and Constraints" (PS). Retrieved 2006-10-05.
  6. Cook, Hill & Canning 1990.


संदर्भ

  • Benjamin C. Pierce, Types and programming languages, MIT Press, 2002, ISBN 0-262-16209-1, chapter 15 (subtyping of record types), 19.3 (nominal vs. structural types and subtyping), and 23.2 (varieties of polymorphism)
  • C. Szyperski, D. Gruntz, S. Murer, Component software: beyond object-oriented programming, 2nd ed., Pearson Education, 2002, ISBN 0-201-74572-0, pp. 93–95 (a high-level presentation aimed at programming language users)
Cook, William R.; Hill, Walter; Canning, Peter S. (1990). Inheritance is not subtyping. Proc. 17th ACM SIGPLAN-SIGACT Symp. on Principles of Programming Languages (POPL). pp. 125–135. CiteSeerX 10.1.1.102.8635. doi:10.1145/96709.96721. ISBN 0-89791-343-4.
  • Reynolds, John C. Using category theory to design implicit conversions and generic operators. In N. D. Jones, editor, Proceedings of the Aarhus Workshop on Semantics-Directed Compiler Generation, number 94 in Lecture Notes in Computer Science. Springer-Verlag, January 1980. Also in Carl A. Gunter and John C. Mitchell, editors, Theoretical Aspects of Object-Oriented Programming: Types, Semantics, and Language Design (MIT Press, 1994).

अग्रिम पठन