पॉलीमॉर्फिक प्रकार के साथ एक फ़ंक्शन क्यों होना चाहिए `forall t: टाइप, t-> t` पहचान समारोह होना चाहिए?


18

मैं प्रोग्रामिंग लैंग्वेज थ्योरी में नया हूं। मैं कुछ ऑनलाइन व्याख्यान देख रहा था जिसमें प्रशिक्षक ने दावा किया था कि बहुरूपिया प्रकार के साथ एक फ़ंक्शन forall t: Type, t->tपहचान है, लेकिन यह क्यों नहीं समझाया। क्या कोई मुझे समझा सकता है क्यों? शायद पहले सिद्धांतों से दावे का प्रमाण।


3
मुझे लगा कि यह प्रश्न एक डुप्लिकेट होना चाहिए, लेकिन मैं इसे नहीं ढूंढ सकता। cs.stackexchange.com/questions/341/… एक तरह का फॉलो-अप है। मानक संदर्भ मुक्त करने के लिए प्रमेय है! फिल वाडलर द्वारा।
गिलेस एसओ- बुराई को रोकना '

1
इस प्रकार के साथ एक सामान्य फ़ंक्शन का निर्माण करने का प्रयास करें जो कुछ और करता है। आप पाएंगे कि कोई नहीं है।
बरगी

@ बर्गी हां मुझे कोई काउंटर उदाहरण नहीं मिला, लेकिन फिर भी यह सुनिश्चित नहीं था कि इसे कैसे साबित किया जाए।
अभिषेक

लेकिन जब आप एक खोजने की कोशिश कर रहे थे तो आपकी क्या टिप्पणियां थीं? आपके द्वारा किए गए किसी भी प्रयास ने काम क्यों नहीं किया?
Bergi

@ गिल्स शायद आपको cs.stackexchange.com/q/19430/14663 याद है ?
बरगी

जवाबों:


32

ध्यान देने वाली पहली बात यह है कि यह जरूरी नहीं है। उदाहरण के लिए, भाषा के आधार पर उस प्रकार के साथ एक फ़ंक्शन, पहचान फ़ंक्शन होने के अलावा, सकता है: 1) हमेशा के लिए लूप, 2) कुछ राज्य को म्यूट करें, 3) वापसी null, 4) एक अपवाद फेंकें, 5) कुछ I / O प्रदर्शन करें, 6) कांटा एक धागा कुछ और करने के लिए, 7) call/ccshenanigans करते हैं , 8) जावा की तरह कुछ का उपयोग करें Object.hashCode, 9) यह निर्धारित करने के लिए प्रतिबिंब का उपयोग करें कि क्या प्रकार एक पूर्णांक है और इसे बढ़ाएं यदि ऐसा है, तो 10) कॉल स्टैक का विश्लेषण करने के लिए प्रतिबिंब का उपयोग करें और संदर्भ के आधार पर कुछ करें, जिसे यह कहा जाता है, 11) शायद कई अन्य चीजें और निश्चित रूप से उपरोक्त के मनमाने संयोजन।

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

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


1
सिस्टम एफ ने अनंत छोरों से कैसे बचा था जो कि प्रकार प्रणाली का पता नहीं लगा सकते हैं? यह सामान्य मामले में अयोग्य के रूप में वर्गीकृत है।
जोशुआ

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

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

15

दावे का प्रमाण काफी जटिल है, लेकिन अगर आप वास्तव में चाहते हैं, तो आप इस विषय पर रेनॉल्ड्स के मूल पेपर की जांच कर सकते हैं।

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


8

डेरेक का उल्लेख करने वाले सभी कैवेट के साथ, और सेट सिद्धांत का उपयोग करने वाले विरोधाभासों को अनदेखा करते हुए, मुझे रेनॉल्ड्स / वाडलर की भावना में एक प्रमाण देना चाहिए।

प्रकार का एक कार्य:

f :: forall t . t -> t

प्रकार t द्वारा अनुक्रमित के कार्यों का एक परिवार है ।ftt

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

fg

forall t . t -> t

stfsfssstgtttfgfsgt

fstfsft

()()t()t((), c)ctf()ftf()()()ftcc()cftidttf है id

आप मेरे ब्लॉग में अधिक जानकारी पा सकते हैं ।


-2

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

असत्य!

function f(a): forall t: Type, t->t
    function g(a): forall t: Type, t->t
       return (a is g) ? f : a
    return a is f ? g : a

जहां isऑपरेटर संदर्भ पहचान के लिए दो चर की तुलना करता है। यही है, वे एक ही मूल्य होते हैं। समान मूल्य नहीं, समान मूल्य। कार्य fऔर gकुछ परिभाषा के बराबर हैं, लेकिन वे समान नहीं हैं।

यदि यह फ़ंक्शन स्वयं पास हो जाता है तो यह कुछ और लौटाता है; अन्यथा यह अपना इनपुट लौटाता है। किसी और चीज़ के समान ही है इसलिए इसे प्रतिस्थापित किया जा सकता है। दूसरे शब्दों में, fपहचान नहीं है, क्योंकि f(f)रिटर्न g, जबकि पहचान वापस आ जाएगीf

प्रमेय के लिए इसे धारण करने की हास्यास्पद क्षमता को कम करना होगा

function cantor(n, <z, a>) : forall t: t: Type int, <int, t> -> <int, t>
    return n > 1 ? cantor((n % 2 > 0) ? (n + 1) : n / 2, <z + 1, a>) : <z, a>
return cantor(1000, <0, a>)[1]¹

यदि आप यह मानने को तैयार हैं कि आप बहुत आसान प्रकार का अनुमान लगा सकते हैं।

यदि हम डोमेन को प्रतिबंधित करने का प्रयास करते हैं, जब तक कि प्रमेय हमारे पास नहीं है तब तक हम इसे दूर तक सीमित रखने के लिए प्रयास करते हैं।

  • शुद्ध कार्यात्मक (कोई उत्परिवर्ती राज्य, कोई आईओ नहीं)। ठीक है मैं उसके साथ रह सकता हूं। कई बार हम फंक्शन्स पर सबूत चलाना चाहते हैं।
  • खाली मानक पुस्तकालय। हुंह।
  • नहीं raiseऔर नहीं exit। अब हम विवश होने लगे हैं।
  • कोई निचला प्रकार नहीं है।
  • भाषा में एक नियम होता है जो संकलक को यह सुनिश्चित करने की अनुमति देता है कि इसे समाप्त करके अनंत पुनरावृत्ति को समाप्त किया जाए। संकलक को तुच्छ अनंत पुनरावर्तन को अस्वीकार करने की अनुमति है।
  • संकलक को विफल होने की अनुमति दी जाती है यदि उसे किसी ऐसी चीज के साथ प्रस्तुत किया जाता है जिसे या तो साबित नहीं किया जा सकता है। अब मानक पुस्तकालय तर्कों के रूप में कार्य नहीं कर सकता है। बू।
  • नहीं है nil। इससे समस्या होने लगी है। हमने 1 / 0. out से निपटने के तरीकों से बाहर भाग लिया है
  • भाषा शाखा प्रकार के इंफ़ेक्शन नहीं कर सकती है और जब प्रोग्रामर एक प्रकार की भाषा कैंटीन साबित कर सकता है तो इसके लिए कोई ओवरराइड नहीं होता है। यह बहुत बुरा है।

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

The यदि आपको लगता है कि कंपाइलर उस एक को कम कर सकता है, तो इसे आज़माएं

function fermat(z) : int -> int
    function pow(x, p)
        return p = 0 ? 1 : x * pow(x, p - 1)
    function f2(x, y, z) : int, int, int -> <int, int>
        left = pow(x, 5) + pow(y, 5)
        right = pow(z, 5)
        return left = right
            ? <x, y>
            : pow(x, 5) < right
                ? f2(x + 1, y, z)
                : pow(y, 5) < right
                    ? f2(2, y + 1, z)
                    : f2(2, 2, z + 1)
    return f2(2, 2, z)
function cantor(n, <z, a>) : forall t: t: Type int, <int, t> -> <int, t>
    return n > 1 ? cantor((n % 2 > 0) ? (n + 1) : n / 2, <z + 1, a>) : <z, a>
return cantor(fermat(3)[0], <0, a>)[1]

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

³ किसी को लगता है कि आप बिना किसी सामान्य जेनेरिक प्रकार के रिटर्न देने वाले इस रिटर्न को शून्य कर सकते हैं। यह एक बुरा दंड देता है जिसके लिए मैंने कोई प्रभावी भाषा नहीं देखी है जो इसे भुगतान कर सकती है।

function f(a, b, c): t: Type: t[],int,int->t
    return a[b/c]

संकलन नहीं करना चाहिए। मूलभूत समस्या रनटाइम एरे इंडेक्सिंग नहीं है।


@ बर्गी: मैंने एक प्रतिरूप का निर्माण किया।
जोशुआ

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

1
@ डब्लू: अगर एक f है तो a का प्रकार f का प्रकार है जो g का प्रकार भी है और इसलिए टाइपसेक को पास होना चाहिए। अगर एक वास्तविक संकलक इसे बाहर निकालता है तो मैं रनटाइम कास्ट का उपयोग करूंगा कि वास्तविक भाषाओं में हमेशा स्थैतिक प्रकार प्रणाली के लिए यह गलत हो रहा है और यह रनटाइम में कभी भी विफल नहीं होगा।
जोशुआ

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

1
@ डब्लू: आप इस बिंदु को याद करते हैं। स्थिर प्रकार के चेकर के लिए पर्याप्त जानकारी है यह साबित करने के लिए कि क्या यह खोजने के लिए बुद्धि थी कोड सुरक्षित है।
जोशुआ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.