Fonksiyonel kodun doğru olduğunu kanıtlamak için yaygın resmi teknikler nelerdir?


10

Tezimin bir parçası olarak yazdığım bir Haskell programının bölümlerine kanıt sağlamak istiyorum. Ancak şimdiye kadar iyi bir referans çalışması bulamadım.

Graham Hutton'un Haskell'i öğrenirken okuduğum Haskell'deki Programlama ( Google Kitaplar ) tanıtım kitabı gibi programlar hakkında muhakeme yapmak için birkaç tekniğe değiniyor

  • eşit muhakeme
  • çakışan olmayan desenler kullanma
  • liste indüksiyonu

bölüm 13'te ama çok derinlemesine değil.

Haskell veya diğer fonksiyonel kodlar için resmi ispatlama tekniklerine daha ayrıntılı bir genel bakış sunan önerebileceğiniz herhangi bir kitap veya makale var mı?

Yanıtlar:


5

Fonksiyonel programlamada sonuçları kanıtlamanın fiili yöntemlerinden biri Richard Bird grubu aracılığıyladır.

Özellikle, denklemsel akıl yürütme ve liste indüksiyonu için derinlemesine veya en azından daha kapsamlı bir yaklaşım istersiniz ve bu Yapıcı İşlevsel Programlama Dersleri'nde verilmektedir .

Daha genel olarak, Bird ve de Moor'un "Programlama Cebiri" metni, optimizasyon ve dinamik programlama problemleri gibi fonksiyonel algoritmaların doğruluğunu da ele alır.


Bu sorun için başka faydalı kaynaklarla karşılaşırsanız, lütfen bunlardan bahsedin ve belki de bu yayını bir wiki'ye dönüştürebiliriz.


Teşekkür ederim! Elbette, daha fazla kaynak bulursam, bunları yazıma eklediğimden emin olacağım.
FK82

6

İle başlayabilirsiniz

Konular mantığın temel kavramları, bilgisayar destekli teorem kanıtlama, Coq proof asistanı, fonksiyonel programlama, operasyonel anlambilim, Hoare mantığı ve statik tip sistemleri içerir. Sergi, ileri lisans öğrencilerinden doktora öğrencilerine ve araştırmacılara kadar çok çeşitli okuyuculara yöneliktir. Mantık veya programlama dillerinde belirli bir arka plan kabul edilmez, ancak bir dereceye kadar matematiksel olgunluk yardımcı olacaktır.

Programlama dili teorisi bölümlerini atlayabilir (veya gözden kaçabilir) ve yalnızca Önsözden İndekslere kadar resmi kanıtlarla nasıl başa çıkacağınızı öğrenebilirsiniz. Kitap gerçekten iyi yazılmış ve aydınlatıcı.

O zaman devam etmek isteyebilirsiniz

Bu ciltte, sıralama algoritmalarını, ikili arama ağaçlarını, dengeli ikili arama ağaçlarını ve öncelik kuyruklarını belirlemeyi ve doğrulamayı (doğruluğunu kanıtlamayı) öğreneceksiniz. Bu kitabı kullanmadan önce, herhangi bir standart lisans algoritması ders kitabında bulunan bu algoritmalar ve veri yapıları hakkında bilgi sahibi olmalısınız. Yazılım Temelleri Cilt 1'deki (Mantık Temelleri) tüm materyalleri anlamalısınız

Uyarı notu: VFA hala beta sürümde!


(İkinci bağlantınız yanlış yere yönlendiriliyor.) Ayrıca, Agda'da Doğrulanmış İşlevsel Programlama var ; resmi olarak bir programlama dili olan Agda'yı kullanan ancak unicode kullanan ve dolayısıyla matematik notasyonuna daha yakın olan.
Musa Al-hassy

Düzeltildi, teşekkürler. Evet, VFPiA'yı okudum, ama benim zevkime göre değil.
Anton Trunov

Cevabınız için teşekkür ederim! Bence bir yanlış anlama var. Algoritmaları kanıtlamak için fonksiyonel teknikler aramıyorum (kanıt asistanı gibi), ancak fonksiyonel kodu kanıtlama teknikleri için (örneğin, verilen bir algoritmanın doğru bir şekilde uygulanmasını kanıtlamak için) @ MusaAl-hassy cevabı çok yakın istenen cevap. Kaçırdığım ve alıntıladığınız kitaplar da bu yönü kapsıyorsa, ilgili bölümleri eklemeyi düşünür müsünüz?
FK82

@ FK82 İşte olduğu Theorem app_assoc : ∀ l1 l2 l3 : natlist, (l1 ++ l2) ++ l3 = l1 ++ (l2 ++ l3)gelen Listeleri bölüm. Bu örnek ilgilendiğiniz şeye benziyor mu? Coq'ta fonksiyonel programlama ile başlarlar, ancak daha sonra fonksiyonel programların özellikleri hakkında akıl yürütmeye devam ederler . Önsöz'den IndPrinciples'a kadar olan bölümler her ikisini de kapsar ve programlama ve akıl yürütme orada iç içedir.
Anton Trunov

1
@ FK82 (1) Bu yoruma tamamen katılıyorum . (2) R. Bird'ün "Haskell ile İşlevsel Düşünme" (2015) kitabına bakmak isteyebilirsiniz. Kitabın Haskell ile ilgili tonlarca akıl yürütme örneği var. (3) Ayrıca, aynı yazarın "Fonksiyonel Algoritma Tasarım İncileri" (2010) size yardımcı olabilir.
Anton Trunov

5

Saf işlevsel dillerle ilgili şeyleri kanıtlamak için mükemmel bir kanıtlama teknikleri ve örneklerinin, genellikle kendi spesifikasyon dillerinin bir parçası olarak eşit olarak akıl yürütmenin mümkün olduğu saf bir işlevsel dil içeren kanıt asistanları olduğu ortaya çıkıyor.

Bir gibi bir kitabı danışmak isteyebilirsiniz Bağımlı Türleri ile Sertifikalı Programlama belirli geçirmez asistanı, yani Coq akıl bu tür derinlemesine bir giriş için.


Teşekkürler! Aslında Haskell'deki teknikleri arıyorum . Yayımım tüm işlevsel kodları içerecek şekilde düzenlendi, ancak bu benim niyetimin çok üstünde.
FK82

1
Haskell'i özel olarak doğrulamak için tasarlanmış sistemlerin farkında değilim, ancak 1) Coq'un (ve Agda'nın) fonksiyonel çekirdeğinin esasen Haskell'inkinden ayırt edilemez ( toplam işlevlere kısıtlama hariç ) ve 2) Doğrulanmış programlar Coq ve Agda edilebilir içinde ekstre (Haskell ekstraksiyon daha Coq daha Ocaml merkezlidir Ağda, desteklenir düşünmektelerse) Haskell
cody

Bunu bildiğim iyi oldu! Ancak bu, programımı (veya ilgili bölümleri) Coq veya Agda'da yeniden yazdığım anlamına gelir. Benim durumumda bunun makul olduğunu düşünmüyorum.
FK82

Haskell'i Isabelle'e dönüştürmeye veya Isabelle'i kullanarak denklikleri doğrudan kanıtlamaya çalışan birkaç deneysel "ön uç" var , ancak olgunluklarında çok fazla stok tutmayacağım. Kodun yeniden yazılması sonuçta daha az iş olacağını düşünüyorum.
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.