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