feragat
İstediğiniz gibi bu çok gayrı resmi.
Gramer
Bağımlı olarak yazılmış bir dilde, tür düzeyinde ve değer düzeyinde bir ciltleyicimiz vardır:
Term = * | (∀ (Var : Term). Term) | (Term Term) | (λ Var. Term) | Var
İyi yazılmış terim, ekli türden bir terimdir, yazacağız t ∈ σveya
σ
t
terim olduğunu belirtmek için ttürü vardır σ.
Yazma kuralları
Basitlik uğruna λ v. t ∈ ∀ (v : σ). τher ikisinde de aynı değişkene ihtiyacımız var λve bu ∀değişkeni aynı vdurumda bağlarız.
Kurallar:
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)
Bu nedenle, *"her türlü tipi" (1) olup, ∀tip (2), lambda soyutlamalardan formları türleri pi-tipleri (3) ve varsa vile sokulur ∀ (v : σ). τ, daha sonra vtürü vardır σ(5).
"normal formda", azaltma kuralını kullanarak mümkün olduğunca fazla azaltma yaptığımız anlamına gelir:
"" "İndirim kuralı
(λ 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.
Veya iki boyutlu sözdiziminde
σ
t
anlamı t ∈ σ:
(∀ (v : σ). τ) σ SUBS(τ, v, t)
~>
(λ v . b) t SUBS(b, v, t)
Bir terimi bir lambda soyutlamasının, bir terim ilişkili forall niceleyicideki değişkenle aynı tipte olduğu zaman uygulamak mümkündür. Daha sonra hem lambda soyutlamasını hem de forall niceleyicisini daha önce saf lambda hesabındakiyle aynı şekilde azaltırız. Değer seviyesi kısmını çıkardıktan sonra (4) yazım kuralını elde ederiz.
Bir örnek
İşte fonksiyon uygulama operatörü:
∀ (A : *) (B : A -> *) (f : ∀ (y : A). B y) (x : A). B x
λ A B f x . f x
(biz kısaltmak ∀ (x : σ). τiçin σ -> τeğer τsöz etmez x)
fdöner B ybir öngörülen yÇeşidi A. Biz uygulamak fiçin xdoğru cins olan Ave yerine yilişkin xde ∀sonrasÖ .böylece f x ∈ SUBS(B y, y, x)~> f x ∈ B x.
Şimdi işlev uygulama operatörünü kısaltalım appve bunu kendimize uygulayalım:
∀ (A : *) (B : A -> *). ?
λ A B . app ? ? (app A B)
?Sağlamamız gereken şartlara yer veriyorum. Öncelikle açıkça tanıtmak ve örneklemek Ave B:
∀ (f : ∀ (y : A). B y) (x : A). B x
app A B
Şimdi sahip olduklarımızı birleştirmeliyiz
∀ (f : ∀ (y : A). B y) (x : A). B x
hangisi aynı
(∀ (y : A). B y) -> ∀ (x : A). B x
ve ne app ? ?alır
∀ (x : A'). B' x
Bu sonuçlanır
A' ~ ∀ (y : A). B y
B' ~ λ _. ∀ (x : A). B x -- B' ignores its argument
(ayrıca bkz. Tahmini nedir? )
İfademiz (bazı adlandırmalardan sonra)
∀ (A : *) (B : A -> *). ?
λ A B . app (∀ (x : A). B x) (λ _. ∀ (x : A). B x) (app A B)
Herhangi yana A, Bve f(burada f ∈ ∀ (y : A). B y)
∀ (y : A). B y
app A B f
somutlaştırabilir Ave Belde edebiliriz ( fuygun türdeki herhangi biri için)
∀ (y : ∀ (x : A). B x). ∀ (x : A). B x
app (∀ (x : A). B x) (λ _. ∀ (x : A). B x) f
ve tür imzası eşittir (∀ (x : A). B x) -> ∀ (x : A). B x.
Tüm ifade
∀ (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)
yani
∀ (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
Bu değer seviyesindeki tüm düşüşlerden sonra aynı şeyi appgeri verir .
O olsun saf lambda hesabi sadece birkaç adım gerektirir Yani süre appgelen app appbir Yazılan ortamda, biz de birleşme önemsemelisin ve işler hatta bazı tutarsız kolaylık (ile daha karmaşık hale (ve özellikle bir bağımlı daktilo) * ∈ *).
Kontrol türü
- Eğer
tbir *daha sonra t ∈ *(1)
- Eğer
tbir ∀ (x : σ) τ, σ ∈? *, τ ∈? *(yaklaşık nota bakın ∈?aşağıda) daha sonra t ∈ *(2) tarafından
- Eğer
tolduğu f x, f ∈ ∀ (v : σ) τbazıları için σve τ, x ∈? σdaha sonra t ∈ SUBS(τ, v, x)tarafından (4)
- Eğer
tbir değişkendir v, vtarafından tanıtılan ∀ (v : σ). τsonra t ∈ σ(5)
Bunların hepsi çıkarım kurallarıdır, ancak lambdalar için aynı şeyi yapamayız (tür çıkarımı bağımlı türler için kararsızdır). Bu nedenle, lambdalar için t ∈? σçıkarımdan ziyade kontrol ederiz ( ):
- Eğer
tedilir λ v. bve karşı kontrol ∀ (v : σ) τ, b ∈? τdaha sonrat ∈ ∀ (v : σ) τ
- Başka
tbir şey varsa ve kontrol edildiyse , yukarıdaki işlevi kullanmanın σtürünü yazın tve olup olmadığını kontrol edin.σ
Türleri için kontrol Eşitlik yüzden karar vermek normal formlarda olmalarını gerektirir ttip vardır σİlk kontrolü σtürüne sahip *. Öyleyse σ, normalleştirilebilir (modulo Girard'ın paradoksu) ve normalleşir (dolayısıyla σ(0) ile iyi biçimlendirilir). SUBSayrıca korumak için ifadeleri normalleştirir (0).
Buna çift yönlü tip kontrolü denir. Bununla birlikte, her lambdaya bir tür ek açıklama eklememiz gerekmez: eğer f xtüründe fbiliniyorsa, o zaman çıkarılan ve eşitlik için karşılaştırılmış olmak yerine xalınan argüman türüne karşı kontrol edilir f(aynı zamanda daha az verimlidir). Fakat eğer fbir lambda ise , açık bir tür ek açıklama gerektirir (ek açıklamalar gramerde ve her yerde atlanır, eklenebilir Ann Term Termveya λ' (σ : Term) (v : Var)yapıcılara eklenebilir ).
Ayrıca, daha basit, daha kolay bir göz atın ! Blog yazısı.