Turing'in bütünlüğünden vazgeçerek İdris ne yapamaz?


35

İdris'in bağımlı türleri olduğunu biliyorum ama tam bir sonuç almadı. Turing eksiksizliğini bırakarak ne yapamaz ve bu bağımlı türlere sahip olmakla mı ilgilidir?

Sanırım bu oldukça özel bir soru, ancak bağımlı tipler ve ilgili tip sistemler hakkında çok fazla bir şey bilmiyorum.


2
Sanırım somut bir örnek mi arıyorsunuz? Idris ile aşina değilim, ama Isabelle / HOL'de her zaman sonlanmayan (daha da kötüsü, sonlandırma kanıtı vermeniz gerekmeyen) işlevleri yazamazsınız (veya derleyemezsiniz ).
Raphael

Evet, bu satırlar boyunca bir şeyler - Tip sistemindeki belirli özelliklere sahip bir dili kodlayamayacağınız gibi oldukça niş bir durum olup olmadığından veya biraz daha genel olup olmayacağından (örneğin, söylediğiniz gibi), tamamen emin değildim. , tüm işlevlerin sonlandırıldığı kanıtlanmalıdır)
Squidly

1
Sanırım bu yanlış varsayım, İdris'in "Pacman'ın eksiksiz olduğunu" söyleyen Edwin Brady'den geliyor. Sanırım "Turing tamamlandı" yerine "Pacman tamamlandı" diyerek asıl meselesi, dillerin insan beyni tarafından kolayca derlenebilmesinin önemini vurgulamak istediğini ve sadece makinelerle değil! .. BrainFuck gibi aptal dillerin kesinlikle olduğunu düşünüyorum. Tamamlanıyor, ancak BrainFuck’ta yazılmış bir kodun anlaşılması oldukça uzun bir zaman alabilir, böylece BrainFuck’ta bir Pacman programını geliştirmek ve daha da önemlisi korumak oldukça zahmetlidir.
Michelrandahl

@Mitzh Gerçekten değil. Sanırım konuşmasında söylediğini duyduğum bir şeyi yanlış anladım.
Kalamar olarak

Yanıtlar:


50

İdris Tamamlanıyor! Bütünlüğü kontrol eder (verilerle programlama yapılırken sonlandırma, kodata ile programlama yapılırken verimlilik) ancak her şeyin toplam olmasını gerektirmez.

İlginç bir şekilde, veri ve kodata sahip olmak, Turing Completeness'ı modellemek için yeterlidir, çünkü kısmi işlevler için bir monad yazabilirsiniz. Bunu yıllar önce yaptım, Coq'da yaptım - muhtemelen şimdiye dek aşındı ama yine de burada: http://eb.host.cs.st-andrews.ac.uk/Partial/partial.v .

Gerçekten böyle şeyleri yürütmek için bir kaçışa ihtiyacınız var, ama Idris bunu yapmanıza izin veriyor.

Idris, tip kontrolünü kararsız tutmak için tip seviyesinde kısmi fonksiyonları azaltmayacaktır. Ayrıca, yalnızca toplam programların kanıt olarak makul şekilde inanılabilinir.


4
Adamın kendisi. Bu bağlamda verimlilik nedir?
Kalamar

5
Sonlandırmanın iki katı: Endüktif bir tanım sona ermelidir (tüm verilerini tüketerek), bir eşleştirici tanımın üretken olması gerekir - pratikte bu, özyinelemeli herhangi bir çağrının bir kurucu tarafından korunması gerektiği anlamına gelir. Bu açıklamayı en net buldum (ymmv): adam.chlipala.net/cpdt/html/Coinductive.html
Edwin Brady

14

İlk olarak, “hesaplama” olarak adlandırdığımız her şeyin bir Turing makinesiyle (veya diğer birçok eşdeğer modelden herhangi biriyle) yapılabilecek bir şey olduğunu söyleyen Kilise Turing tezi hakkında bir şeyler duyduğunuzu varsayıyorum . Bu nedenle Turing-complete dili, herhangi bir hesaplamanın ifade edilebileceği bir dildir. Tam tersine, Turing eksik bir dil, ifade edilemeyen bir hesaplama olduğu bir dildir.

Tamam, bu pek bilgilendirici değildi. Bir örnek vereyim. Turing eksik bir dilde yapamayacağınız bir şey var: bir Turing makine simülatörü yazamazsınız (aksi halde benzetilen Turing makinede herhangi bir hesaplamayı kodlayabilirsiniz).

Tamam, bu hala çok bilgilendirici değildi. Asıl soru, Turing eksik bir dilde hangi faydalı programın yazılamayacağı? Eh, hiç kimse birisinin bir yerde yararlı bir amaç için yazdığı tüm programları içeren ve bu, tüm Turing makine hesaplamalarını içermeyen bir "faydalı program" tanımı yapamadı. Bu nedenle, tüm yararlı programları yazabileceğiniz Turing eksik bir dil tasarlamak hala çok uzun vadeli bir araştırma hedefidir.

Şimdi dışarıda çok farklı türlerde eksik Turing dilleri var ve yapamadıklarında farklılık gösteriyorlar. Ancak, ortak bir tema var: Turing-complete dilleri, program boyutuna bağlı olmayan bir süre için koşullu olarak sonlandırma veya devam etmenin bir yolunu ve programın girişe bağlı bir miktar bellek kullanması için bir yol içermelidir. . Somut olarak, çoğu zorunlu programlama dili, sırasıyla döngü ve dinamik bellek ayırma yoluyla bu yetenekleri sağlar. Çoğu işlevsel programlama dili, bu yetenekleri özyineleme ve veri yapısı yerleştirme yoluyla sağlar.

İdris, Agda'dan şiddetle ilham alıyor . Ağda teoremleri kanıtlamak için tasarlanmış bir dildir . Şimdi teoremleri ispatlamak ve çalışan programlar çok yakından ilişkilidir , böylece tıpkı bir teoremi ispat ettiğiniz gibi Agda'da programlar yazabilirsiniz. Sezgisel olarak, “A'nın ifade ettiği B” teorisinin kanıtı, A teorisinin kanıtını argüman olarak alan ve teorem B'nin kanıtını veren bir fonksiyondur.

Sistemin amacı teoremleri ispatlamak olduğundan, programcının keyfi işlevler yazmasına izin veremezsiniz. Diyelim ki, az önce kendisinin denen aptalca özyinelemeli bir işlev yazmanıza izin verdi:

oops : A -> B
oops x = oops x

Böyle bir işlevin varlığının sizi A'nın B'yi ima ettiğine ikna edemezsiniz, yoksa sadece gerçek teoremleri değil, bir şeyi ispatlayabileceksiniz! Böylece Agda (ve benzer teorem kanıtlar) keyfi yinelemeyi yasaklar. Özyinelemeli bir işlev yazdığınızda, her zaman sona erdiğini ispatlamanız gerekir , böylece ne zaman bir teorem kanıtı ispat ederseniz, B teoreminin bir ispatını oluşturacağını bilirsiniz.

Agda'nın derhal pratik sınırlaması, keyfi özyinelemeli fonksiyonlar yazamamanızdır. Sistemin sonlandırmayan tüm fonksiyonları reddetmesi gerektiğinden, durma sorununun (veya daha genel olarak Rice teoreminin ) kararsızlığı da reddedilen sonlandırma fonksiyonlarının olmasını sağlar. Ek bir pratik zorluk, sisteme, işlevinizin sona erdiğini kanıtlamak için sisteme yardım etmeniz gerektiğidir.

A'dan B'ye bir işleve sahipseniz, A'nın B'den bahsettiği bir matematik kanıtı kadar iyidir, ispat sistemlerini daha programlama dili gibi yapmak konusunda araştırmalar sürmektedir. fonksiyonların sonlandırılması araştırma konularından biridir. Diğer uzatma yönleri, girdi / çıktı ve eşzamanlılık gibi “gerçek dünya” endişeleriyle başa çıkmayı içerir. Başka bir zorluk, bu sistemleri sadece ölümlüler için erişilebilir kılmaktır (veya belki de bazı ölümlüleri gerçekten erişilebilir oldukları konusunda ikna etmek).

İdris ile aşina değilim. Bahsettiğim zorlukları ele alıyor. Bildiğim kadarıyla bir üstünkörü bakışta anlıyoruz 2013 ön baskı , İdris olduğu Turing tamamlama ama toplamıdır denetleyicisi içerir. Toplam denetleyicisi, anahtar kelimeyle açıklamalı her işlevin totalsona erdiğini doğrular . Her fonksiyonun toplam olduğu İdris programlarını içeren dil parçası, Arda ile ifade gücüne benzer (muhtemelen tür teorisindeki farklılıklar nedeniyle tam bir eşleşme değil, kasıtlı olarak denemeden asla farketmeyeceğiniz kadar yakın).

Farklı şekillerde Turing-tamamlanmamış diğer dil örnekleri için, bkz. Coq gibi turing yapmayan bir tam dilin pratik sınırlamaları nelerdir? (Bu cevabın alındığı büyük ölçüde).


3
" Turing eksik bir dilde ne yararlı bir program yazılamaz?" Bir Java sanal makinesi.
David Richerby

@DavidRicherby Yapamaz mısın? JVM gerçekten Turing tamamlandı mı? Tek bir nesnenin boyutunda bir sınır vardır, sınırlandırılmamış bir nesneye tahsis ve erişime izin verebilir misiniz? Örneğin, C'de cevap hayır gibi görünüyor çünkü sadece çok az sayıda imleç değeri var.
Gilles 'SO- kötülük'

Bu bölümle ilgilenen okuyucular için, her zaman sonlanan diller için neden programlama dili olamadığı konusunda başka bir yazımız var.
Raphael

3
@Gilles Anladığım kadarıyla gerçek hiçbir programlama dilinin Turing-tamamlanmadığını söylemekten daha az ya da çok eşdeğer değil mi? Sonuçta, herhangi bir uygulama sizin bahsettiğiniz engellerle karşılaşacaktır. Bu, İdris'in Turing-tamamlanmadığı için ne kaybettiğini düşünürken odada bulunan oldukça büyük bir fil gibi görünüyor. Örneğin, diğer dillerden daha fazlasını kaybediyor mu? Sınırlandırılmamış harici depolamayı yasaklarsanız (örneğin, "lütfen sonraki / önceki diski yerleştirin" demeyi durduran program) yasaklarsanız, herhangi bir dil önemsiz bir şekilde Turing-complete değildir, bu durumda herhangi bir soru boşalır.
David Richerby

3
@DavidRicherby Yorumlarım (ancak cevabım değil) programlama dili teorisi geek modunda. SML'nin resmi spesifikasyonunu alırsanız (örneğin), tüm hesaplanabilir programları simüle edebilecek bir dilin uygulamasını tasarlamak (ancak fiziksel dünyada uygulamamak) mümkündür. Bu böyle bir şey değil C, çünkü hafızanın doğruluğu dile ( sizeof(void*)) eklenmiştir . Cevabımda, dilleri ideal bir şekilde ele alıyorum, bu yüzden SML veya C Turing-complete olarak kabul edilir.
Gilles 'SO- kötülük'
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.