İlkel Özyinelemeli İşlevler için Kombinatörler


Yanıtlar:


17

Evet, ama daktilolu birleştiricileri göz önünde bulundurmalısınız. Yani, ve aşağıdaki tür şemalarını vermeniz gerekir : ; burada ve , her kullanımda herhangi bir beton türüne örneklenebilen meta değişkenlerdir.K K : A B A S : ( A B C ) ( A B ) ( A C ) A , B CSK

K:ABAS:(ABC)(AB)(AC)
A,BC

Ardından, türlerin diline türünü eklemek ve aşağıdaki birleştiricileri eklemek istersiniz : z : N s u c c : NN i t e r : N( NN ) NNN

z:Nsucc:NNiter:N(NN)NN

Eklemeler için eşitlik kuralları şunlardır:

iterifz=iiterif(succe)=f(iterife)

Rakamlarla ve yinelemeyle zenginleştirilmiş basit yazılan lambda hesabında programlar yazarsanız, yazdığınız programları okumak çok daha kolaydır. Tarif ettiğim sistem , yüksek tip aritmetiğin dili olan Goedel'in T'sinin bir kısıtlamasıdır . Goedel T olarak, yineleme için yazma daha sınırlıdır: T içinde , sen örneğini doğal sayılar sadece tip, her tür at. Bu sizi ilkel özyinelemeden geçirir ve Ackerman'ın işlevi gibi şeyleri tanımlamanızı sağlar.

iter:A(AA)NA
iter

EDIT: Xoff, önceki fonksiyonun nasıl kodlanacağını sordu. Bunu standart bir numara ile takip eder. Açıklamak için, bunun için daha okunaklı olduğu için (braket soyutlamasıyla ortadan kaldırılabilen) lambda gösterimini kullanacağım. İlk olarak, çiftlerimiz ve için daha genel bir . Sonra şunları tanımlayabiliriz:iter

pred=λk.iter(z,z)(λ(n,n).(succn,n))kpred=λk.snd(predk)

Sadece nat-tipi yineleyiciniz varsa, o zaman sinir bozucu olan ancak temel bir engel teşkil etmeyen izomorfizminden yararlanmanız gerekir .NN×N


Peki bu, yazılan biçerdöverlere getirilen kısıtlama sayesinde Turing-complete'tan daha az mı? Tür değişkenleri (özyinelemeli olarak) tür değişkenleri üzerindeki işlevleri gösterebilir mi (örneğin, bazı D ve E türleri için A = D -> E)?
NietzscheanAI

2
Evet yapabilirler. Yazılan ve kısıtlaması , bu dili, üst düzey fonksiyonlara sahip olmasına rağmen sonlandığı bilinen basitçe yazılmış lambda hesabının birleşik bir sunumuna dönüştürür. Bu blog yayınımda STLC'yi kategorik olarak ilham alan birleştiricilere nasıl çevireceğinizi görebilirsiniz: semantic-domain.blogspot.com/2012/12/…KSK
Neel Krishnaswami

Neel, teşekkürler. Kilise rakam kodlaması ile z, succ ve iter'i S ve K cinsinden temsil etmenin mümkün olduğunu düşünmekte haklı mıyım?
NietzscheanAI

Sisteminizle önceki işlevi nasıl yaparsınız ( ve gibi işlevler ?( s u c c x ) x00(succx)x
Xoff

@Xoff: selefi işlevi açısından iyi bilinen bir doğrusal zaman tanımına sahiptir iter. Bu cs.stackexchange.com'da bir soru nesnesi olabilir ...
cody
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.