Toplam fonksiyonel programlamanın sınırları nelerdir?


19

Toplam fonksiyonel programlamanın sınırlamaları nelerdir? Turing-complete değildir, ancak yine de olası programların büyük bir alt kümesini destekler. Turing-complete dilinde yazabileceğiniz, ancak tamamen işlevsel bir dilde yazamayacağınız önemli yapılar var mı?

Toplam işlevsel dilde yazılmış programların tamamen statik olarak analiz edilebileceğini söylemek doğru mudur, Turing-complete dillerinde statik analiz durdurma problemi ile sınırlıdır? Bununla birlikte, toplam fonksiyonel dillerde her şeyin statik olarak belirlendiği anlamına gelmez, çünkü bazı şeyler sadece çalışma zamanında bilinir, ancak teoride, ideal bir toplam fonksiyonel programlama dilinde yazılmış programların analiz edilebileceği anlamına gelir. teorik olarak statik olarak belirlenebilir statik olarak belirlenebilir. Yoksa, statik analizi eksik yapan toplam işlevsel dilde kalıtsal olarak hala çözülemeyen sorunlar var mı? Bazı sorunlar her zaman hangi dilde yazılırlarsa yazılsınlar, ancak dile miras kalan bu tür sorunlarla ilgileniyorum,

Yanıtlar:


16

Toplam işlevsel dile bağlıdır .

Bu cevap bir ses çıkarmaya benziyor, ancak daha spesifik bir şey söylenemez. Sonuçta, ilgilendiğiniz önemli karar verilebilir programı düşünün. Çözmek için favori Turing-complete dilinde bir program yazın. Sorun çözülebildiğinden, programınız tüm girişlerde durur.

(Muhtemelen, karar verilemez bir sorunun ilginç programları olabilir, ancak insanların kullanabileceği gibi değil, çünkü cevabı bilmek için yeterince uzun süre bekleyemeyecekler.)

Şimdi, yeni bir dili yalnızca geçerli bir giriş programı olacak şekilde tanımlayın: az önce yazdığınız program, daha önce olduğu gibi aynı anlambilim ile. Kesinlikle toplamdır, çünkü içinde yazılan tüm programlara (sadece bir tane vardır) tüm girdiler her zaman sona erer.

Bu ucuz hile aslında yararlıdır: Coq dili , örneğin, sonlandığına dair bir kanıt olmadığı sürece hiçbir program tipinin kontrol edilmemesi nedeniyle toplam işlevsel bir dildir. (Eğer bu şarttan feragat ederseniz, bu Turing-complete olurdu, bu yüzden tek engel fesih kanıtı bulmaktır.)

"Teorik olarak statik olarak belirlenebilecek her şey statik olarak belirlenebilir" ile ne demek istediğinizden emin değilim; totolojik olarak doğru geliyor. Bununla birlikte, toplam dillerin doğası gereği analiz edilmesi kolay değildir; hiçbir şeyin ayrışmadığını biliyorsunuz, bu yararlı bir gerçektir, ancak girdi ve çıktı arasındaki ilişki hala karmaşıktır. (Özellikle, hala sonsuz sayıda olası girdi vardır, bu yüzden teoride bile hepsini kapsamlı bir şekilde deneyemezsiniz.)


Cevabınız için teşekkürler. Yani toplam olmak biraz yardımcı olur, ancak çok zor bir sorun olmaya devam etmektedir. "Teorik olarak statik olarak belirlenebilir her şey statik olarak belirlenebilir" ile kastettiğim, eğer yeterli kaynaklara sahip olsaydınız, girdi ve çıktı arasındaki tüm ilişkileri analiz etmenin mümkün, çok zor ya da değil olmasıydı. . Yoksa bunun sınırlı olmasının temel nedenleri mi? Rice'ın teoreminde olduğu gibi, kısmi işlevler için de durum böyle. Yoksa Rice teoremini yanlış mı anlıyorum?
Matthijs Steen

Bence bu "ilişki" ile ne demek istediğine bağlı olabilir. Özellikle, sadece "A girişi B çıkışına gider" demek istiyorsanız, bu tamamen işlevsel bir dilde önemsiz bir şekilde belirlenebilir; sadece programı çalıştırın. Ama muhtemelen sonsuz bir girdi sınıfı hakkında bir şeyler söyleyen analizlerle ilgileniyorsunuz.
Paul Stansifer

(oops; yanlışlıkla girmek) ... ama bu başka bir aptalca numara açar, çünkü eğer yapmak istersem kimlik fonksiyonu hakkında kararsız sorular sorabilirim: "Bazıları için durmakta Xolan (identity X)bir Turing Makinesi mi?" Tabii ki olmak görünmüyor yaklaşık identity , ama nasıl "hakkında" tanımlıyorsunuz?
Paul Stansifer

Evet, tek tek girişler için değil, bazı tanımların tüm olası giriş değerleri için geçerli olup olmadığını bilmek istiyorum. Sizi doğru anlarsam, ne tür bir programlama dili kullanılırsa kullanılsın her zaman bazı kararsız soruların olacağı anlamına geliyorsunuz. Her ne kadar bu kararsız soruların bir kısmı, sorunun İlk etapta ortaya çıkmasının önlenmesi ile engellenmiş olsa da, Durma Sorununun toplam fonksiyonel dilleri gibi? Çünkü kimlik işleviyle ilgili sorunuz tamamen işlevsel bir dilde karar veremez mi?
Matthijs Steen

Evet; "Turing Machine" ifadesinin "Garantisinin Turing Machine Süresi Dolduktan Sonra Bozulması" ile değiştirildiği sorunun değiştirilmiş bir versiyonu son derece çözülebilir. Bu amaçlar için, problemleri durdurarak, programları incelerken, çözülemez bir sorunla dolu olan, çözülemeyen bir soruna gidilecek bir örnek olmak biraz zordur.
Paul Stansifer

16

Toplam fonksiyonel programlamanın sınırlamaları nelerdir? Turing-complete değildir, ancak yine de olası programların büyük bir alt kümesini destekler. Turing-complete dilinde yazabileceğiniz, ancak tamamen işlevsel bir dilde yazamayacağınız önemli yapılar var mı?

LLL

  1. LLLLtutarlıdır. Aredmetik yapabileceğinizi varsayarak, Goedel'in teoreminin dışladığı şey budur. Dolayısıyla, bilindik tercümanları toplam işlevsel dillerde yazamayacağımızı biliyoruz.

  2. Bununla birlikte, bunun tersi, toplam dillerin ifade gücü üzerindeki sınırların aslında matematiğin ifade gücü üzerindeki sınırlar olduğudur . Örneğin, Coq'ta (bir kanıt asistanı) tanımlanabilir fonksiyonlar, erişilebilir olmayan birçok kardinal ile ZFC kullanılarak hesaplanabileceği kanıtlanan fonksiyonlardır. Yani esasen çalışan bir matematikçinin memnuniyetini kanıtlayabileceğiniz herhangi bir fonksiyon Coq.

  3. Flip tarafının flip tarafı matematik zor! Bu nedenle, toplam dillerin "tamamen analiz edilebilir" olduğu konusunda kolay bir anlam yoktur - bir işlevin sona erdiğini bilseniz bile, istediğiniz bir özelliğe sahip olduğunu kanıtlamak için çok fazla yaratıcı çalışma yapmanız gerekebilir. Örneğin, listelerden listelere bir fonksiyonun toplam olduğunu bilmek, bir sıralama fonksiyonu olduğunu kanıtlamak için çok uzağa gitmez ....


Cevabınız için teşekkürler. Bu sorunla ilgili yazıyı Lambda the Ultimate weblogunda okudum , ancak yorumlardaki bazı insanlar, kendi değerlendiricisinin düzenli olarak açık bir şekilde oluşturulabilir bir terim olarak mümkün olmamasına rağmen, çalışan bir kendi kendini yaratmanın mümkün olacağını belirtiyor. bazı hileci ile değerlendirici. Acaba, bazı işlev hileleriyle tam bir işlevsel dilde çözülemeyen (veya yaklaşık olarak çözülemeyen) sorunlar var mı?
Matthijs Steen

Öz-değerlendirmenin bir sorun olarak sayılmadığını söyleyebilirim, çünkü dile bağlı olarak değişir. "X dilinde bir programı değerlendirin" sorunu, X veya Y dilinde çözmeye çalışsanız da olmasanız da aynı sorundur. Özellikle, X dili tamamen işlevsel bir dilde ise, sorun bazı fonksiyonel dillerde çözülebilir , daha önce kullandığım aynı saçma hileyi kullanarak.
Paul Stansifer

Neel, toplam bir dilin kendi yorumlayıcısını destekleyemediğini kanıtlamaktan çok daha kolay gibi görünüyor. Seni yanlış mı anlıyorum? Basit bir köşegenleştirmeyle, sabit noktaları olmayan bir işlevi olan herhangi bir dil kendi yorumlayıcısını destekleyemez (aritmetik destekleyip desteklemese de). Tartışma Conor McBride tarafından burada açıklanmıştır: mail.haskell.org/pipermail/haskell-cafe/2003-May/004343.html
Tom Ellis

@TomEllis: Argümanım aslında Conor'unkiyle aynı. Aslında, görevi "Epimenides / Cantor / Russell / Quine / Godel / Turing argümanı" olarak adlandırdığında zaten bu gözlemi (Conor'un karakteristik zekasıyla) yapıyor.
Neel Krishnaswami
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.