দাবি পরিত্যাগী
আপনার অনুরোধ অনুসারে এটি খুব অনানুষ্ঠানিক।
ব্যাকরণ
নির্ভরশীলভাবে টাইপ করা ভাষায় আমাদের টাইপ স্তরের পাশাপাশি মান স্তরেও একটি বাইন্ডার থাকে:
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, vপ্রবর্তন করেন ∀ (v : σ). τতারপর t ∈ σদ্বারা (5)
এই সমস্ত অনুমানের নিয়ম, তবে আমরা ল্যাম্বডাসের জন্য একই কাজ করতে পারি না (নির্ভরযোগ্য ধরণের ক্ষেত্রে টাইপ অনুক্রমটি অনস্বীকার্য)। সুতরাং ল্যাম্বডাসের জন্য আমরা পরীক্ষা করে নিই (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) )।
এছাড়াও, সরল, আরও সহজ! ব্লগ পোস্ট.