İ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 total
sona 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).