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 t
tü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ı v
durumda 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 v
ile sokulur ∀ (v : σ). τ
, daha sonra v
tü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
)
f
döner B y
bir öngörülen y
Çeşidi A
. Biz uygulamak f
için x
doğru cins olan A
ve yerine y
ilişkin x
de ∀
sonrasÖ .
böylece f x ∈ SUBS(B y, y, x)
~> f x ∈ B x
.
Şimdi işlev uygulama operatörünü kısaltalım app
ve 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 A
ve 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
, B
ve f
(burada f ∈ ∀ (y : A). B y
)
∀ (y : A). B y
app A B f
somutlaştırabilir A
ve B
elde edebiliriz ( f
uygun 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 app
geri verir .
O olsun saf lambda hesabi sadece birkaç adım gerektirir Yani süre app
gelen app app
bir 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
t
bir *
daha sonra t ∈ *
(1)
- Eğer
t
bir ∀ (x : σ) τ
, σ ∈? *
, τ ∈? *
(yaklaşık nota bakın ∈?
aşağıda) daha sonra t ∈ *
(2) tarafından
- Eğer
t
olduğu f x
, f ∈ ∀ (v : σ) τ
bazıları için σ
ve τ
, x ∈? σ
daha sonra t ∈ SUBS(τ, v, x)
tarafından (4)
- Eğer
t
bir değişkendir v
, v
tarafı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
t
edilir λ v. b
ve karşı kontrol ∀ (v : σ) τ
, b ∈? τ
daha sonrat ∈ ∀ (v : σ) τ
- Başka
t
bir şey varsa ve kontrol edildiyse , yukarıdaki işlevi kullanmanın σ
türünü yazın t
ve olup olmadığını kontrol edin.σ
Türleri için kontrol Eşitlik yüzden karar vermek normal formlarda olmalarını gerektirir t
tip 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). SUBS
ayrı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 x
türünde f
biliniyorsa, o zaman çıkarılan ve eşitlik için karşılaştırılmış olmak yerine x
alınan argüman türüne karşı kontrol edilir f
(aynı zamanda daha az verimlidir). Fakat eğer f
bir lambda ise , açık bir tür ek açıklama gerektirir (ek açıklamalar gramerde ve her yerde atlanır, eklenebilir Ann Term Term
veya λ' (σ : Term) (v : Var)
yapıcılara eklenebilir ).
Ayrıca, daha basit, daha kolay bir göz atın ! Blog yazısı.