Bağımlı tip teorisi ve 'keyfi' tip fonksiyonlar
Bu soruya ilk cevabım kavramlar üzerinde yüksek ve detaylar üzerinde düşüktü ve “neler oluyor?” Alt sorusuna yansıdı; bu cevap aynı olacak, ancak 'keyfi tip fonksiyonlar alabilir miyiz?' alt sorusuna odaklanacaktır.
Toplam ve ürünün cebirsel işlemlerinin bir uzantısı, genellikle yazılı Σ
ve Π
sırasıyla bir dizinin (veya daha genel olarak, bir fonksiyonun toplamı ve ürününün) toplamını ve ürününü temsil eden 'büyük operatörler' olarak adlandırılır . Bkz. Sigma Gösterimi .
Yani toplam
a₀ + a₁X + a₂X² + ...
yazılabilir
Σ[i ∈ ℕ]aᵢXⁱ
a
Örneğin, gerçek sayıların bazı dizileri nerede . Ürün, Π
yerine benzer şekilde temsil edilecektir Σ
.
Uzaktan baktığınızda, bu tür bir ifade, içinde 'keyfi' bir fonksiyona çok benzer X
; tabii ki ifade edilebilir seriler ve bunlarla ilişkili analitik fonksiyonlarla sınırlıyız. Bu bir tür teorisinde temsil edilmeye aday mı? Kesinlikle!
Bu ifadeleri hemen temsil eden tür teorileri sınıfı 'bağımlı' tür teorilerinin sınıfıdır: bağımlı türlerle teoriler. Doğal olarak terimlere bağlı terimlerimiz vardır ve Haskell gibi yazım fonksiyonlarına ve tür miktarına sahip dillerde, türlere bağlı olarak terim ve türlere sahibiz. Bağımlı bir ortamda ek olarak terimlere bağlı olarak tiplerimiz vardır. Haskell bağımlı olarak yazılan bir dil değildir, ancak bağımlı türlerin birçok özelliği , dile biraz işkence yapılarak simüle edilebilir .
Curry-Howard ve bağımlı türleri
'Curry-Howard izomorfizmi', basit tipli lambda hesabının terimleri ve tip değerlendirme kurallarının sezgisel önerme mantığına uygulanan türlerin (Gentzen tarafından formüle edildiği gibi) tam olarak doğal indirime (Gentzen tarafından formüle edildiği) karşılık geldiği bir gözlem olarak hayata başladı. ve ikisi bağımsız olarak icat edilmiş / keşfedilmiş olmasına rağmen ispatların yerini alan terimler. O zamandan beri, tip teorisyenleri için büyük bir ilham kaynağı oldu. Dikkate alınması gereken en belirgin şeylerden biri, önermeli mantığın bu yazışmasının yüklem veya daha yüksek dereceli mantıklara genişletilip genişletilemeyeceğidir. Bağımlı tip teoriler başlangıçta bu keşif yolundan doğdu.
Basitçe yazılmış lambda hesabı için Curry-Howard izomorfizmasına giriş için buraya bakınız . Örnek olarak, kanıtlamak istiyorsak A ∧ B
kanıtlamak A
ve kanıtlamak zorundayız B
; birleştirilmiş bir kanıt basitçe bir çift kanıttır: her bir bağlaç için bir kanıt.
Doğal indirimde:
Γ ⊢ A Γ ⊢ B
Γ ⊢ A ∧ B
ve basitçe yazılmış lambda hesabında:
Γ ⊢ a : A Γ ⊢ b : B
Γ ⊢ (a, b) : A × B
Benzer yazışmalar ∨
ve toplam türleri, →
işlev türleri ve çeşitli eleme kuralları için de vardır.
Kanıtlanmamış (sezgisel olarak yanlış) bir teklif, ıssız bir tipe karşılık gelir.
Mantıksal önermeler olarak türlerin benzetilmesiyle, tür dünyasında tahminlerin nasıl modelleneceğini düşünmeye başlayabiliriz. Bunun resmileştirilmesinin birçok yolu vardır ( yaygın olarak kullanılan bir standart için Martin-Löf'ün Sezgisel Tip Teorisine bu girişe bakın ), ancak soyut yaklaşım genellikle bir yüklemin serbest terim değişkenlerine sahip bir teklif gibi olduğunu gözlemler veya alternatif olarak, önermeleri dikkate alan bir işlev. Tür ifadelerinin terimler içermesine izin verirsek, lambda kalkülüs tarzında bir tedavi hemen bir olasılık olarak kendini sunar!
Sadece yapıcı deliller düşünüldüğünde, bunun delili ∀x ∈ X.P(x)
nedir? Bunu, x
karşılık gelen önerilerinin ( P(x)
) kanıtlarına terim ( ) alarak bir kanıt işlevi olarak düşünebiliriz . Bu nedenle, türün (öneri) üyeleri (kanıtlar), ∀x : X.P(x)
her x
biri X
için bir tür terim veren 'bağımlı işlevlerdir' P(x)
.
Ne olmuş ∃x ∈ X.P(x)
? Biz herhangi bir üyesini gerek X
, x
birlikte bir kanıtı olan, P(x)
. Tip (önerme) üyeleri (deliller) Yani ∃x : X.P(x)
seçkin bir terim: 'bağımlı çifti' in x
içinde X
, birlikte tip bir süre ile P(x)
.
İşaretleme: kullanacağım
∀x ∈ X...
sınıf üyeleri hakkındaki gerçek ifadeler için X
ve
∀x : X...
tip üzerinden evrensel nicelemeye karşılık gelen tip ifadeleri için X
. Aynı şekilde ∃
.
Kombinatoryal düşünceler: ürünler ve toplamlar
Önermelerle türlerin Curry-Howard yazışmasının yanı sıra, bu sorunun ana noktası olan cebirsel türlerin sayı ve işlevlerle birleştirici yazışmaları vardır. Ne mutlu ki, bu yukarıda özetlenen bağımlı türlere genişletilebilir!
Modül gösterimini kullanacağım
|A|
bir türün 'boyutunu' temsil etmek A
, tür ve sayılar arasında soruda özetlenen yazışmaları açıkça ortaya koymak. Bunun teorinin dışında bir kavram olduğunu unutmayın; Dilde böyle bir operatöre ihtiyaç olduğunu iddia etmiyorum.
Olası (tamamen azaltılmış, standart) türdeki üyeleri sayalım
∀x : X.P(x)
hangi tip terimlerini alan bağımlı fonksiyonların x
türüdürX
türüdür P(x)
. Bu tür her fonksiyonun her terimi için bir çıktıya sahip olmalı X
ve bu çıktı belirli bir tipte olmalıdır. Her x
giriş için X
, bu |P(x)|
çıktı 'seçenekleri' verir .
Delici çizgi
|∀x : X.P(x)| = Π[x : X]|P(x)|
Tabii ki eğer anlamda büyük bir anlaşma yapmaz X
ise IO ()
, ancak cebirsel türleri için de geçerlidir.
Benzer şekilde, bir tür terimi
∃x : X.P(x)
çiftlerinin türü (x, p)
ile p : P(x)
, bu nedenle herhangi bir x
bölgesindekiX
biz herhangi bir üye ile, uygun bir çift gerçekleştirebilmesi P(x)
vererek |P(x)|
seçimlerini '.
Bu nedenle,
|∃x : X.P(x)| = Σ[x : X]|P(x)|
aynı uyarılar ile.
Bu, sembolleri kullanarak teorilerde bağımlı türler için ortak gösterimi haklı çıkarır Π
ve Σ
, ve gerçekten de çok teori yukarda bahsedilen yazışmalar, 'toplamı' 'vardır ve ve 'ürün' 'için tüm' arasında arasında ayrımı.
Yaklaşıyoruz!
Vektörler: bağımlı tuplleri temsil eder
Şimdi aşağıdaki gibi sayısal ifadeleri kodlayabilir miyiz
Σ[n ∈ ℕ]Xⁿ
tür ifadeleri olarak?
Pek değil. Bir tür ve doğal bir sayı Xⁿ
olan Haskell'deki gibi ifadelerin anlamını gayri resmi olarak düşünebiliriz , ancak gösterimin kötüye kullanılması; bu bir sayı içeren bir tür ifadesidir: belirgin olarak değilX
n
geçerli bir ifade .
Öte yandan, resimdeki bağımlı türlerle, sayı içeren türler tam olarak noktadır; aslında, bağımlı tuples veya 'vektörler' bağımlı türlerin liste erişimi gibi işlemler için nasıl pragmatik tip düzeyinde güvenlik sağlayabileceğinin çok yaygın bir örneğidir . Bir vektör sadece uzunluğu ile ilgili tip seviyesi bilgileri ile birlikte bir listedir: tam olarak aşağıdaki gibi tip ifadeleri için neyin peşindeyizXⁿ
.
Bu cevabın süresi boyunca
Vec X n
uzunluk- n
vektör türü olmakX
değerlerinin türü olmalıdır.
Teknik olarak n
burada, gerçek bir doğal sayı yerine, doğal bir sayı sistemindeki bir temsildir. Nat
Peano stilindeki doğal sayıları ( ) başka bir doğal sayının sıfırı ( 0
) veya halefi ( S
) olarak temsil edebiliriz ve n ∈ ℕ
yazdığım ˻n˼
için Nat
temsil ettiği terim anlamına gelir n
. Örneğin, ˻3˼
bir S (S (S 0))
.
Sonra elimizde
|Vec X ˻n˼| = |X|ⁿ
herhangi biri için n ∈ ℕ
.
Nat türleri: ℕ terimleri türlere yükseltmek
Şimdi gibi ifadeleri kodlayabiliriz
Σ[n ∈ ℕ]Xⁿ
türleri olarak. Bu özel ifade, kuşkusuz X
, soruda tanımlandığı gibi , listelerin türüyle izomorf olan bir tür ortaya çıkaracaktır . (Sadece bu değil, aynı zamanda kategori-teorik bakış açısından, bir fonktor olan tip fonksiyonu X
, yukarıdaki tipe almak doğal olarak izomorfiktir Liste .)
'Keyfi' işlevler için bulmacanın son parçası, nasıl kodlanacağı
f : ℕ → ℕ
gibi ifadeler
Σ[n ∈ ℕ]f(n)Xⁿ
böylece bir kuvvet serisine keyfi katsayılar uygulayabiliriz.
Cebirsel türlerin sayılarla yazışmasını zaten anlıyoruz, türlerden sayılara ve tip fonksiyonlarını sayısal fonksiyonlara eşlememize izin veriyoruz. Diğer yoldan da gidebiliriz! - doğal bir sayı göz önüne alındığında, bağımlı türlerimiz olsun ya da olmasın, birçok terim üyesi ile birlikte tanımlanabilir bir cebirsel tür vardır. Bunu indüksiyonla tip teorisinin dışında kolayca ispatlayabiliriz . İhtiyacımız olan şey , sistemin içindeki doğal sayılardan türlere eşlemenin bir yoludur .
Hoş bir farkındalık, bağımlı türlere sahip olduğumuzda, indüksiyonla kanıtın ve özyineleme ile inşaatın neredeyse benzer hale gelmesidir - aslında birçok teoride aynı şeydir. İhtiyaçlarımızı karşılayan tiplerin var olduğunu tümüyle indükleyerek kanıtlayabildiğimiz için bunları inşa edemeyiz mi?
Terim düzeyinde türleri temsil etmenin birkaç yolu vardır. Burada *
türlerin evreni için hayali bir Haskellish gösterimi kullanacağım , genellikle bağımlı bir ortamda bir tür olarak kabul edilir. 1
Benzer şekilde, ℕ
bağımlı tip teoriler olduğu gibi, ' elemeyi' not etmek için de en az yol vardır. Haskellish desen eşleştirme gösterimi kullanacağım.
Biz, bir eşleme gerek α
gelen Nat
etmek *
özelliğiyle,
∀n ∈ ℕ.|α ˻n˼| = n.
Aşağıdaki sözde tanımlama yeterlidir.
data Zero -- empty type
data Successor a = Z | Suc a -- Successor ≅ Maybe
α : Nat -> *
α 0 = Zero
α (S n) = Successor (α n)
Bu yüzden görüyoruz ki, eylem, α
halefin davranışını S
bir çeşit homomorfizm haline getirir. Successor
bir türün üye sayısına 'bir ekleyen' bir tür işlevidir; yani, tanımlı boyutu |Successor a| = 1 + |a|
olan herhangi biri için a
.
Örneğin α ˻4˼
(ki α (S (S (S (S 0))))
),
Successor (Successor (Successor (Successor Zero)))
ve bu türün şartları
Z
Suc Z
Suc (Suc Z)
Suc (Suc (Suc Z))
Tam dört elemanları bize veren: |α ˻4˼| = 4
.
Aynı şekilde, herhangi n ∈ ℕ
biri için
|α ˻n˼| = n
gereğince, gerektiği gibi.
- Birçok teori, üyelerin
*
yalnızca türlerin temsilcisi olmasını gerektirir ve işlem, *
türden ilişkili türlerine açık bir eşleme olarak sağlanır . Diğer teoriler, gerçek türlerin kendilerinin terim düzeyinde varlık olmasına izin verir.
'Keyfi' işlevler?
Şimdi bir tür olarak tamamen genel bir güç serisi ifade etmek için aparat var!
Seri
Σ[n ∈ ℕ]f(n)Xⁿ
tip olur
∃n : Nat.α (˻f˼ n) × (Vec X n)
nerede ˻f˼ : Nat → Nat
fonksiyonun dili içinde uygun bir temsil f
. Bunu aşağıdaki gibi görebiliriz.
|∃n : Nat.α (˻f˼ n) × (Vec X n)|
= Σ[n : Nat]|α (˻f˼ n) × (Vec X n)| (property of ∃ types)
= Σ[n ∈ ℕ]|α (˻f˼ ˻n˼) × (Vec X ˻n˼)| (switching Nat for ℕ)
= Σ[n ∈ ℕ]|α ˻f(n)˼ × (Vec X ˻n˼)| (applying ˻f˼ to ˻n˼)
= Σ[n ∈ ℕ]|α ˻f(n)˼||Vec X ˻n˼| (splitting product)
= Σ[n ∈ ℕ]f(n)|X|ⁿ (properties of α and Vec)
Bu ne kadar 'keyfi'? Bu yöntemle sadece tamsayı katsayılarıyla değil doğal sayılarla da sınırlıyız. Bunun dışında, Turing Completef
göz önüne alındığında, herhangi bir şey olabilir bağımlı türlere sahip dili , herhangi bir şey olabilir, doğal sayı katsayılarıyla herhangi bir analitik işlevi temsil edebiliriz.
Bunun, örneğin, bu List X ≅ 1/(1 - X)
tür negatif ve tamsayı olmayan 'türlerin' söz konusu olayda veya olası bir anlamda bu bağlamda ne olabileceği sorusuyla etkileşimini araştırmadım .
Umarım bu cevap keyfi tip fonksiyonlarla ne kadar ileri gidebileceğimizi araştırmanın bir yoludur.