अस्वीकरण
यह बहुत ही अनौपचारिक है, जैसा आपने अनुरोध किया था।
व्याकरण
एक भरोसेमंद रूप से टाइप की गई भाषा में हमारे पास टाइप स्तर के साथ-साथ मूल्य स्तर पर एक बाइंडर है:
Term = * | (∀ (Var : Term). Term) | (Term Term) | (λ Var. Term) | Var
अच्छी तरह से टाइप किया हुआ शब्द संलग्न प्रकार के साथ एक शब्द है, हम लिखेंगे t ∈ σ
या
σ
t
यह बताने के लिए कि शब्द t
में टाइप है σ
।
टाइपिंग नियम
सादगी के लिए हमें आवश्यकता है कि λ v. t ∈ ∀ (v : σ). τ
दोनों में λ
और ∀
एक ही चर ( v
इस मामले में) को बांधें ।
नियम:
t ∈ σ is well-formed if σ ∈ * and t is in normal form (0)
* ∈ * (1)
∀ (v : σ). τ ∈ * -: σ ∈ *, τ ∈ * (2)
λ v. t ∈ ∀ (v : σ). τ -: t ∈ τ (3)
f x ∈ SUBS(τ, v, x) -: f ∈ ∀ (v : σ). τ, x ∈ σ (4)
v ∈ σ -: v was introduced by ∀ (v : σ). τ (5)
इस प्रकार, *
"सभी प्रकारों का प्रकार" (1), ∀
प्रकारों से प्रकार (2), लंबोदर अमूर्त में पाई-प्रकार (3) हैं और यदि v
द्वारा प्रस्तुत किया गया है ∀ (v : σ). τ
, तो v
टाइप σ
(5) है।
"सामान्य रूप में" का अर्थ है कि हम कमी नियम का उपयोग करके यथासंभव कम कटौती करते हैं:
"कमी" नियम
(λ v. b ∈ ∀ (v : σ). τ) (t ∈ σ) ~> SUBS(b, v, t) ∈ SUBS(τ, v, t)
where `SUBS` replaces all occurrences of `v`
by `t` in `τ` and `b`, avoiding name capture.
या जहां दो आयामी वाक्यविन्यास में
σ
t
साधन t ∈ σ
:
(∀ (v : σ). τ) σ SUBS(τ, v, t)
~>
(λ v . b) t SUBS(b, v, t)
केवल एक शब्द के लिए एक लैम्ब्डा अमूर्त लागू करना संभव है जब शब्द में एक ही प्रकार होता है जैसा कि संबंधित फोर्ल क्वांटिफायर में चर होता है। फिर हम लैम्ब्डा एब्सट्रैक्शन और फोरल क्वांटिफायर दोनों को उसी तरह कम करते हैं जैसे कि पहले शुद्ध लैम्ब्डा कैलकुलस में। मान स्तर भाग को घटाने के बाद, हमें (4) टाइपिंग नियम मिलता है।
एक उदाहरण
यहां फ़ंक्शन एप्लिकेशन ऑपरेटर है:
∀ (A : *) (B : A -> *) (f : ∀ (y : A). B y) (x : A). B x
λ A B f x . f x
( यदि हम उल्लेख नहीं ∀ (x : σ). τ
करते हैं σ -> τ
तो संक्षिप्त करें )τ
x
f
B y
किसी भी y
प्रकार के लिए रिटर्न A
। हम इस पर लागू होते f
हैं x
, जो सही प्रकार का है A
, और इसके बाद के विकल्प के y
लिए , इस प्रकार ~> ।x
∀
.
f x ∈ SUBS(B y, y, x)
f x ∈ B x
आइए अब फ़ंक्शन एप्लिकेशन ऑपरेटर को संक्षिप्त करें app
और इसे स्वयं लागू करें:
∀ (A : *) (B : A -> *). ?
λ A B . app ? ? (app A B)
मुझे ?
उन शर्तों के लिए जगह चाहिए जो हमें प्रदान करने की आवश्यकता है। पहले हम स्पष्ट रूप से परिचय और तात्कालिकता A
और B
:
∀ (f : ∀ (y : A). B y) (x : A). B x
app A B
अब हमारे पास जो कुछ है उसे एकजुट करने की जरूरत है
∀ (f : ∀ (y : A). B y) (x : A). B x
जो जैसा है वैसा है
(∀ (y : A). B y) -> ∀ (x : A). B x
और क्या app ? ?
प्राप्त होता है
∀ (x : A'). B' x
इसका परिणाम यह होगा
A' ~ ∀ (y : A). B y
B' ~ λ _. ∀ (x : A). B x -- B' ignores its argument
(यह भी देखें कि भविष्यवाणी क्या है? )
हमारी अभिव्यक्ति (कुछ नाम बदलने के बाद) हो जाती है
∀ (A : *) (B : A -> *). ?
λ A B . app (∀ (x : A). B x) (λ _. ∀ (x : A). B x) (app A B)
किसी भी के लिए A
, B
और f
(जहां f ∈ ∀ (y : A). B y
)
∀ (y : A). B y
app A B f
हम तुरंत A
और उचित प्रकार के साथ B
(किसी f
के लिए) प्राप्त कर सकते हैं
∀ (y : ∀ (x : A). B x). ∀ (x : A). B x
app (∀ (x : A). B x) (λ _. ∀ (x : A). B x) f
और प्रकार हस्ताक्षर के बराबर है (∀ (x : A). B x) -> ∀ (x : A). B x
।
पूरी अभिव्यक्ति है
∀ (A : *) (B : A -> *). (∀ (x : A). B x) -> ∀ (x : A). B x
λ A B . app (∀ (x : A). B x) (λ _. ∀ (x : A). B x) (app A B)
अर्थात
∀ (A : *) (B : A -> *) (f : ∀ (x : A). B x) (x : A). B x
λ A B f x .
app (∀ (x : A). B x) (λ _. ∀ (x : A). B x) (app A B) f x
जो मूल्य स्तर पर सभी कटौती के बाद समान app
वापस देता है ।
इसलिए जब इसे टाइप करने के लिए शुद्ध लैम्ब्डा कैलकुलस में बस कुछ ही चरणों की आवश्यकता होती app
है app app
, एक टाइपिंग सेटिंग (और विशेष रूप से एक भरोसेमंद टाइप) में हमें एकीकरण के बारे में भी ध्यान रखने की आवश्यकता होती है और कुछ असंगत सुविधा ( * ∈ *
) के साथ भी चीजें अधिक जटिल हो जाती हैं ।
प्रकार की जाँच
- यदि
t
है *
तो t ∈ *
(1)
- अगर
t
है ∀ (x : σ) τ
, σ ∈? *
, τ ∈? *
(के बारे में टिप्पणी देखें ∈?
नीचे) तो t ∈ *
(2)
- अगर
t
है f x
, f ∈ ∀ (v : σ) τ
कुछ के लिए σ
और τ
, x ∈? σ
तब t ∈ SUBS(τ, v, x)
से (4)
- यदि
t
एक चर है v
, तब तक (5) द्वारा v
पेश किया गया था∀ (v : σ). τ
t ∈ σ
ये सभी इंजेक्शन नियम हैं, लेकिन हम लैम्ब्डा के लिए ऐसा नहीं कर सकते हैं (प्रकार निर्भरता निर्भर प्रकारों के लिए अनिर्दिष्ट है)। इसलिए लंबोदर के लिए हम ( t ∈? σ
) के बजाय अनुमान लगाते हैं:
- तो
t
है λ v. b
और उसकी जांच ∀ (v : σ) τ
, b ∈? τ
तोt ∈ ∀ (v : σ) τ
- यदि
t
कुछ और है और σ
उसके खिलाफ जांच की गई है तो t
उपरोक्त फ़ंक्शन का उपयोग करने के प्रकार का पता लगाएं और जांचें कि क्या यह हैσ
प्रकारों की समानता की जाँच के लिए उन्हें सामान्य रूपों में होना आवश्यक है, इसलिए यह तय करने के लिए कि हमारे t
पास σ
पहले σ
टाइप किया गया प्रकार है या नहीं *
। यदि ऐसा है, तो σ
सामान्य है (मोडुलो गिरार्ड का विरोधाभास) और यह सामान्य हो जाता है (इसलिए σ
(0) द्वारा अच्छी तरह से बन जाता है)। SUBS
संरक्षित करने के लिए भावों को भी सामान्य करता है (0)।
इसे द्विदिश प्रकार-जाँच कहा जाता है। इसके साथ हमें प्रत्येक लंबोदर को एक प्रकार के साथ एनोटेट करने की आवश्यकता नहीं है: यदि f x
प्रकार में f
जाना जाता है, तो x
तर्क के प्रकार की तुलना में जाँच की जाती है कि f
अनुमान लगाया जा रहा है और समानता के लिए तुलना की जाती है (जो कि कम कुशल भी है)। लेकिन अगर f
एक लैम्ब्डा है, यह एक स्पष्ट प्रकार एनोटेशन की आवश्यकता होती है (एनोटेशन व्याकरण में छोड़े गए हैं और हर जगह, आप या तो जोड़ सकते हैं Ann Term Term
या λ' (σ : Term) (v : Var)
निर्माताओं के लिए)।
इसके अलावा, सरल, आसान पर एक नज़र है ! ब्लॉग पोस्ट।