उत्पाद प्रकारों के साथ प्रकार का अनुमान


15

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

एक शब्द एक शाब्दिक, शब्दों की एक रचना, एक शब्द का एक उद्धरण, या एक आदिम है।

e::=x|ee|[e]|…

सभी शर्तें कार्यों को दर्शाती हैं। दो कार्यों के लिए e1 और , , , रिवर्स रचना को दर्शाता है। साहित्य निलादिक कार्यों को दर्शाता है।ई १e2e1e2=e2∘e1

रचना के अलावा अन्य शब्दों में बुनियादी प्रकार के नियम हैं:

x:ι[Lit]Γ⊢e:σΓ⊢[e]:∀α.α→σ×α[Quot],α not free in Γ

अनुपस्थित रूप से आवेदन के लिए नियम हैं, क्योंकि संक्षिप्त भाषाओं में इसका अभाव है।

एक प्रकार या तो एक शाब्दिक, एक प्रकार का चर, या ढेर से ढेर के लिए एक फ़ंक्शन है, जहां एक स्टैक को राइट-नेस्टेड टपल के रूप में परिभाषित किया गया है। सभी कार्य स्पष्ट रूप से "ढेर के बाकी" के संबंध में बहुरूपिक हैं।

τ::=ι|α|ρ→ρρ::=()|τ×ρσ::=τ|∀α.σ

यह पहली चीज है जो संदिग्ध लगती है, लेकिन मुझे नहीं पता कि इसके साथ वास्तव में क्या गलत है।

पठनीयता में मदद करने और कोष्ठक में कटौती करने के लिए, मैं मानूंगा कि प्रकार योजनाओं में है। मैं एक एकल के बजाय एक स्टैक को दर्शाने वाले एक चर के लिए एक बड़े अक्षर का उपयोग करूंगा।ab=b×(a)

छह आदिम हैं। पहले पाँच बहुत मासूम हैं। dupसर्वोच्च मूल्य लेता है और इसकी दो प्रतियां तैयार करता है। swapशीर्ष दो मूल्यों का क्रम बदलता है। popशीर्ष मूल्य को त्यागता है। quoteएक मूल्य लेता है और एक उद्धरण (फ़ंक्शन) पैदा करता है जो इसे लौटाता है। applyस्टैक के लिए एक उद्धरण लागू होता है।

dup::∀Ab.Ab→Abbswap::∀Abc.Abc→Acbpop::∀Ab.Ab→Aquote::∀Ab.Ab→A(∀C.C→Cb)apply::∀AB.A(A→B)→B

अंतिम कॉम्बिनेटर, composeको दो उद्धरण लेने चाहिए और उनके के प्रकार को वापस करना चाहिए, अर्थात, । वैधानिक रूप से टाइप किए गए सुगम भाषा कैट में , का प्रकार बहुत सीधा है।[e1][e2]compose=[e1e2]compose

compose::∀ABCD.A(B→C)(C→D)→A(B→D)

हालांकि, यह प्रकार बहुत अधिक प्रतिबंधात्मक है: इसके लिए आवश्यक है कि पहले फ़ंक्शन का उत्पादन दूसरे की खपत से बिल्कुल मेल खाता हो । वास्तव में, आपको अलग-अलग प्रकारों को ग्रहण करना होगा, फिर उन्हें एकजुट करना होगा। लेकिन आप उस प्रकार को कैसे लिखेंगे?

compose::∀ABCDE.A(B→C)(D→E)→A…

यदि आप को दो प्रकारों के अंतर को हैं, तो मुझे लगता है कि आप सही प्रकार से लिख सकते हैं ।∖compose

compose::∀ABCDE.A(B→C)(D→E)→A((D∖C)B→((C∖D)E))

यह अभी भी अपेक्षाकृत सीधा है: composeएक फ़ंक्शन लेता है और एक । इसका परिणाम खपत की खपत के ऊपर द्वारा नहीं उत्पादित , और पैदा करता है के उत्पादन के ऊपर से भस्म नहीं । यह साधारण रचना के लिए नियम देता है।एफ 2 : डी → ई बी एफ 2 एफ 1 डी एफ 1 एफ 2f1:B→Cf2:D→EBf2f1Df1f2

Γ⊢e1:∀AB.A→BΓ⊢e2:∀CD.C→DΓ⊢e1e2:((C∖B)A→((B∖C)D))[Comp]

हालांकि, मुझे नहीं पता कि यह काल्पनिक वास्तव में किसी भी चीज से मेल खाता है, और मैं इसे लंबे समय तक हलकों में चारों ओर पीछा कर रहा हूं कि मुझे लगता है कि मैंने गलत मोड़ लिया। क्या यह ट्यूपल्स का सरल अंतर हो सकता है?∖

∀A.()∖A=()∀A.A∖()=A∀ABCD.AB∖CD=B∖D iff A=Cotherwise=undefined

क्या इस बारे में कुछ बुरी तरह से टूट गया है जिसे मैं नहीं देख रहा हूं, या मैं सही रास्ते की तरह कुछ हूं? (मैंने शायद इस सामान में से कुछ को गलत तरीके से निर्धारित किया है और साथ ही उस क्षेत्र में सुधार की भी सराहना करेगा।)


आप अपने व्याकरण में चर का उपयोग कैसे करते हैं? यह प्रश्न आपको उस "सबटाइपिंग" से निपटने में मदद करता है जिसकी आपको आवश्यकता है।
— जुम

1
@ जैमद: मुझे यकीन नहीं है कि मैं सवाल समझ सकता हूं। औपचारिक रूप से परिभाषित प्रकार की योजनाओं के लिए टाइप वैरिएबल बस हैं, और भाषा में केवल वैरिएबल नहीं हैं, बस परिभाषाएं, जो [पारस्परिक रूप से] पुनरावर्ती हो सकती हैं।
— जॉन प्यार्इ

काफी उचित। क्या आप कह सकते हैं कि (शायद एक उदाहरण के साथ) नियम composeबहुत अधिक प्रतिबंधात्मक क्यों है? मुझे आभास है कि यह इस तरह ठीक है। (जैसे प्रतिबंध को C=D
— λ-

@ जैमड: श्योर। इस twiceरूप में परिभाषित पर विचार करें dup compose apply, जो एक उद्धरण लेता है और इसे दो बार लागू करता है। [1 +] twiceठीक है: आप टाइप कर रहे हैं दो कार्य टाइप कर रहे हैं । लेकिन नहीं है: यदि ∀ ए बी ।ι→ι[pop] twice , समस्या यह है कि है एक ≠ एक∀Ab.f1,f2:Ab→A , इसलिए अभिव्यक्ति को अस्वीकृत कर दिया गया है, भले ही यह मान्य हो और टाइप the ए बी हो ।A≠Ab । क्वालीफायर को सही जगह पर लगाने के लिए समाधान निश्चित रूप से है, लेकिन मैं मुख्य रूप से सोच रहा हूं कि वास्तव मेंकुछ परिपत्र परिभाषाकेबिनाकैसे लिखें। ∀Ab.Abb→Acompose
— जॉन पूर्डी

जवाबों:


9

निम्नलिखित रैंक -2 प्रकार पर्याप्त रूप से सामान्य हो रहा है। यह प्रश्न में प्रस्तावित प्रकार की तुलना में बहुत अधिक बहुरूपी है। यहाँ परिवर्तनीय ढेर के सन्निहित भाग पर परिमाणित करते हैं, जो बहु-तर्क कार्यों को पकड़ता है।

compose:∀ABCδ.δ (∀α.α A→αB) (∀β.β B→βC)→δ (∀γ.γ A→γC)

ग्रीक अक्षरों का उपयोग केवल स्पष्टता के लिए बाकी के ढेर के चर के लिए किया जाता है।

यह बाधाओं को व्यक्त करता है कि स्टैक पर पहले तत्व का आउटपुट स्टैक दूसरे तत्व के इनपुट स्टैक के समान होना चाहिए। दो के लिए चर को वास्तव में तुरंत तर्क देना, एक नए ऑपरेशन को परिभाषित करने के बजाय, ठीक से काम करने के लिए बाधाओं को प्राप्त करने का तरीका है, जैसा कि आप प्रश्न में प्रस्ताव करते हैं।B

टाइप चेकिंग रैंक -2 प्रकार सामान्य रूप से अनिर्वाय है, मुझे विश्वास है, हालांकि कुछ काम किए गए हैं जो अभ्यास में अच्छे परिणाम देते हैं (हास्केल के लिए):

  • साइमन एल। पीटन जोन्स, दिमित्रीओस विटिनीओटिस, स्टेफनी वीरिच, मार्क शील्ड्स: मनमाना-प्रकार के प्रकारों के लिए व्यावहारिक प्रकार का निष्कर्ष। जे। कार्यात्मक। कार्यक्रम। 17 (1): 1-82 (2007)

रचना का प्रकार नियम केवल है:

Γ⊢e1:∀α.α A→α BΓ⊢e1:∀α.α B→α CΓ⊢e1 e2:∀α.α A→α C

सामान्य रूप से काम करने के लिए टाइप सिस्टम प्राप्त करने के लिए, आपको निम्नलिखित विशेषज्ञता नियम की आवश्यकता है:

Γ⊢e:∀α.α A→α BΓ⊢e:∀α.C A→α C B

धन्यवाद, यह बहुत मददगार था। यह प्रकार एकल तर्क के कार्यों के लिए सही है, लेकिन यह कई तर्कों का समर्थन नहीं करता है। उदाहरण के लिए, dup +टाइप होना चाहिए क्योंकि प्रकार ι हैι→ι+ιι→ι

1
स्टैक के प्रकार स्टैक के टुकड़ों पर मात्रा निर्धारित करते हैं, इसलिए दो तर्क कार्यों से निपटने में कोई समस्या नहीं है। मुझे यकीन नहीं है कि यह कैसे लागू होता है dup +, क्योंकि यह रचना का उपयोग नहीं करता है, जैसा कि आपने इसे ऊपर परिभाषित किया है।
— डेव क्लार्क

एर, ठीक है, मेरा मतलब था [dup] [+] compose। लेकिन मैंने पढ़ाαBB×αB=ι×ι(ι×ι)×αι×(ι×α)

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

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