Bir daktilo için doğruluk kanıtı neyi kanıtlamalıdır?


11

Birkaç yıldır program yapıyorum, ancak teorik CS'ye çok aşina değilim. Son zamanlarda programlama dillerini incelemeye çalışıyorum ve bunun bir parçası olarak tip kontrolü ve çıkarım.

Sorum şu ki, bir programlama dili için bir tür çıkarım ve kontrol programı yazmaya çalışırsam ve daktilo makinemin çalıştığını kanıtlamak istersem, tam olarak aradığım kanıt nedir?

Düz dilde, tip denetleyicimin çalışma zamanında oluşabilecek bir kod parçasındaki hataları tanımlayabilmesini istiyorum. Uygulamamın doğru olduğunu kanıtlamak için Coq gibi bir şey kullanırsam, bu "doğruluk kanıtı" tam olarak ne göstermeye çalışır?


Belki (1) uygulamanızın belirli bir yazım sistemi uygulayıp uygulamadığını veya (2) yazım sistem yapması gerektiğini düşündüğünüz hataları önleyip önlemediğini bilmek isteyip istemediğinizi açıklığa kavuşturabilirsiniz ? Bunlar farklı sorular. TT
Martin Berger

1
@MartinBerger: Ah, bu farkı aşmışım gibi görünüyor. Asıl sorum muhtemelen her ikisini de sormaktı. Bağlam şu ki bir dil oluşturmaya çalışıyorum ve bunun için bir daktilo yazıyordum. İnsanlar benden denenmiş ve test edilmiş bir algoritma kullanmamı istedi. Ben kullandığım algoritma ve daktilo "doğru" olduğunu kanıtlamak için ne kadar zor olacağını görmek ilgimi çekti. Dolayısıyla sorumdaki belirsizlik.
Vivek Ghaisas

2
(1) gerçekten program doğrulamasında bir sorudur ve yazmayla ilgisi yoktur. Uygulamanızın spesifikasyonunu karşıladığını göstermesi yeterlidir. (2) ile ilgili olarak, önce acil tip hata olmanın ne anlama geldiğini tanımlayın (örneğin 2 + "hello", "sıkışmış" gibi terimler ). Bu resmileştirildikten sonra, tür sağlamlığı teoremini kanıtlayabilirsiniz. Bu, hiçbir tür programın anında tür hatasına dönüşemeyeceği anlamına gelir. Resmen, bir program, eğer kanıtlamak tip bulunmayan ve herhangi için eğer: çalışır adımlar haline , ardından hemen bir tür hatası yoktur. (1/2)MnMnNN
Martin Berger

1
Bu tipik olarak üzerinde indüksiyon ve tipleme yargısının türetilmesi ile kanıtlanmıştır. (2/2)n
Martin Berger

Teşekkür ederim! Açıklamanıza dayanarak, (2) gerçekten aradığım şey gibi görünüyor. Lütfen bir cevap verebilir misiniz? (Ve yararlı olabileceğini düşündüğünüz herhangi bir ayrıntıyı ekleyin.) Bunu cevap olarak kabul ediyorum! :)
Vivek Ghaisas

Yanıtlar:


10

Soru iki şekilde yorumlanabilir:

  • Uygulamanın belirli bir yazım sistemi uygulayıp uygulamadığı ?T
  • Yazma sistemi , olması gerektiğini düşündüğünüz hataları önlüyor mu?T

Birincisi gerçekten program doğrulamasında bir sorudur ve yazmayla ilgisi yoktur. Sadece uygulamanızın şartnameye uygun olduğunu göstermesi gerekir, Andrej'in cevabına bakın.

Daha sonraki soru hakkında konuşayım. Andrej'in dediği gibi, soyut bir bakış açısıyla, bir yazım sistemi programların özelliklerini güçlendiriyor gibi görünüyor. Uygulamada, yazım sisteminiz hataların oluşmasını önlemeye çalışır, yani yazılabilir programlar ilgilenilen hata sınıfını göstermemelidir. Olduğunu göstermek amacıyla T Eğer düşünmek gerektiğini yapar, iki şey yapmak zorunda.TT

  • İlk olarak, bir programın hemen yazma hatası almasının ne anlama geldiğini resmi olarak tanımlarsınız . Bunun tanımlanabileceği birçok yol vardır - bu size bağlıdır. Genellikle biz gibi programları önlemek istiyoruz 2 + "hello". Başka bir deyişle, tam olarak anında yazma hatası olan programları içeren programların bir alt kümesini tanımlamanız, onları Kötü olarak adlandırmanız gerekir .

  • Sonra Tiplendirilemeyen olan programları programlara evrimleşmezler kanıtlamak zorundadır Bad . Bunu resmileştirelim. Yazma kararınız Hatırlayın olarak okumak gerektiğini: Program M tipi vardır a ortamı tarafından verilen yazıldığında serbest değişkenleri varsayarak, y . O zaman kanıtlamak istediğiniz teorem:ΓM:α.MαΓ

    Teorem. Her ne zaman ve M N ardından N Kötü .ΓM:αMNN

    Bu teoremi nasıl kanıtlayacağınız, dilin ayrıntılarına, yazım sistemine ve Kötü seçiminize bağlıdır .

Kötü tanımlamanın standart yollarından biri şudur: terimi , bir değer değilse ya da bir azaltma adımı M N ise derhal bir tür hatası içerir . (Bu durumda M genellikle sıkışmış olarak adlandırılır .) Bu yalnızca küçük adımlı işletim anlambilimi için geçerlidir. Teoremi kanıtlamanın standart bir yolu,MMNM

  • ve M N birlikte Γ N : α anlamına gelir . Buna "özne azaltma" denir. Genellikle, yazım kararının türetilmesi ve indirimlerin uzunluğu üzerinde eşzamanlı indüksiyon ile kanıtlanmıştır.ΓM:αMN-ΓN:α

  • Her ne zaman sonra M değil Bad . Bu genellikle yazma kararının türetilmesi ile ilgili olarak kanıtlanmıştır.ΓM:αM

Tüm yazım sistemlerinin, örneğin oturum türleri gibi "nesne azaltma" özelliğine sahip olmadığını unutmayın. Bu durumda, daha karmaşık kanıtlama teknikleri gereklidir.


20

Bu iyi bir soru! Yazılı bir dilde yazılanlardan ne beklediğimizi sorar.

İlk olarak unitype ile herhangi bir programlama dilini yazabileceğimizi unutmayın : sadece bir harf seçin, söyleyin Uve her programın türü olduğunu söyleyin U. Bu çok kullanışlı değil, ama bir noktaya değiniyor.

Türleri anlamanın birçok yolu vardır, ancak bir programcının bakış açısından aşağıdakilerin yararlı olduğunu düşünüyorum. Bir türü spesifikasyon veya garanti olarak düşünün . Söylemek için tipi vardır A o "biz garanti / / talebini bekliyoruz demek ki e göre kodlanmış özelliğini tatmin A ". Genellikle A gibi basit bir şeydir , bu durumda özellik sadece "bir tamsayı" dır.ebirebirbirint

Türlerinizin ne kadar etkileyici olabileceğinin sonu yoktur. Prensipte, her türlü mantıksal ifade olabilirler, kategori teorisini ve neyi kullanamazlar, vb. Şu anda, eşzamanlı programların paylaşılan durumla nasıl çalıştığı hakkında konuşmanıza izin veren "eşzamanlı ayırma mantığı" üzerine bir konuşma dinliyorum. Süslü şeyler.

Programlama dili tasarımında türlerin sanatı, ifade ve basitliği dengelemekten biridir :

  • daha etkileyici türler neler olduğunu daha ayrıntılı olarak (kendimize ve derleyiciye) açıklamamıza izin verir
  • daha basit tiplerin anlaşılması daha kolaydır ve derleyicide daha kolay otomatikleştirilebilir. (İnsanlar, tip kontrolü yapmak için esasen bir kanıt asistanı ve kullanıcının girişini gerektiren türlerle gelir.)

Her programcı programlama dilleri teorisinde doktora sahibi olmadığından, sadelik göz ardı edilmemelidir.

Şimdi sorunuza geri dönelim: Yazı sisteminizin iyi olduğunu nasıl anlarsınız ? Peki, türlerinizin dengeli olduğunu gösteren teoremleri kanıtlayın. İki tür teorem olacaktır:

  1. Türlerinizin faydalı olduğunu söyleyen teoremler . Bir programın bir türü olduğunu bilmek, örneğin programın takılmayacağına dair bazı garantiler anlamına gelmelidir (bu bir Güvenlik teoremi olacaktır ). Başka bir teorem ailesi türleri semantik modellere bağlayacaktır, böylece programlarımız hakkında bir şeyler kanıtlamak için gerçek matematiği kullanmaya başlayabiliriz (bunlar Yeterlilik teoremleri ve diğerleri). Yukarıdaki bütünlük kötüdür, çünkü böyle yararlı teoremleri yoktur.

  2. Türlerinizin basit olduğunu söyleyen teoremler . Temel olan, verilen bir ifadenin belirli bir türe sahip olup olmadığının kararlaştırılabilir olmasıdır. Başka bir basitlik özelliği, bir türü çıkarmak için bir algoritma vermektir. Basitlikle ilgili diğer teoremler şunlardır: bir ifadenin en fazla bir türü olması veya bir ifadenin temel türü olması (yani, sahip olduğu tüm türler arasında "en iyi" olanı).

Daha spesifik olmak zordur çünkü türler çok genel bir mekanizmadır. Ama umarım neyi vurmanız gerektiğini görürsünüz. Programlama dili tasarımının çoğu yönü gibi, mutlak bir başarı ölçüsü yoktur. Bunun yerine, tasarım olasılıklarının bir alanı vardır ve önemli olan, uzayda nerede olduğunuzu veya olmak istediğinizi anlamaktır.


Bu ayrıntılı cevap için teşekkürler! Ancak, sorumun cevabından hala emin değilim. Somut bir örnek olarak, yeterince basit bir yazı sistemine sahip statik olarak yazılmış bir dil olan C'yi ele alalım. C için bir daktilo yazmış olsaydım, daktilo makinemin "doğru" olduğunu nasıl kanıtlayabilirim? HM yerine Haskell için bir tip denetleyici yazsaydım bu cevap nasıl değişir? Şimdi "doğruluğu" nasıl kanıtlarım?
Vivek Ghaisas

1
TebirTebir

Kombinasyon olarak 2. ve 3. yapmayı tavsiye ederim. Ayrıca, CompCert'e bir göz atın .
Andrej Bauer

1
Tebirebire

birbire

5

"Daktilo makinemin çalıştığını kanıtla" ile ifade edebileceğiniz birkaç farklı şey vardır. Sanırım, sorunuzun sorduğu şeyin bir parçası;)

Bu sorunun yarısı, tür kuramınızın dil ile ilgili özellikleri ne kadar ispatlayabilecek kadar iyi olduğunu kanıtlıyor. Andrej'in yanıtı imo ile çok iyi bir şekilde mücadele ediyor. Sorunun diğer yarısı - dilin ve onun türünün sisteminin zaten sabit olduğunu varsaymaktır - belirli tür denetleyicinizin aslında tür sistemini doğru bir şekilde uyguladığını nasıl kanıtlayabilirsiniz? Burada almayı görebildiğim iki ana bakış açısı var.

Birincisi: Belirli bir uygulamanın spesifikasyonuna uygun olduğuna nasıl güvenebiliriz? İstediğiniz güvence derecesine bağlı olarak, büyük bir test paketinden memnun olabilirsiniz veya bir tür resmi doğrulama veya daha büyük olasılıkla her ikisinin bir karışımını isteyebilirsiniz . Bu perspektifin üst tarafı, iddia ettiğiniz iddialar için sınırlar koymanın önemini gerçekten vurgulamasıdır: "doğru" tam olarak ne anlama geliyor? kodun hangi kısmı kontrol edilir, vs TCB varsayılan olarak hangi kısımdır? Dezavantajı, bu konuda çok fazla düşünmenin , bu tavşan deliklerinden hoşlanmıyorsanız, felsefi tavşan deliklerine - iyi, "olumsuz" yol açmasıdır .

İkinci perspektif, doğruluk konusunda daha matematiksel bir yaklaşımdır. Matematikteki dillerle uğraşırken, sık sık "teorilerimiz" için "modeller" kurarız (ya da tam tersi) ve daha sonra kanıtlamaya çalışırız: (a) modelde yapabileceğimiz teoride yapabileceğimiz her şey ve (b) teoride yapabileceğimiz modelde yapabileceğimiz her şey. (Bunlar Sağlamlık ve Tamlıkteoremler. Hangisinin sözdizimsel kuramdan mı, semantik modelden mi “başladığınıza” bağlıdır.) Bu zihniyetle, tür kontrol uygulamanızı söz konusu tür teorisi için belirli bir model olarak düşünebiliriz. Dolayısıyla, uygulamanızın yapabilecekleri ile teorinin yapabilmeniz gerektiğini söyledikleri arasındaki bu iki yönlü yazışmayı kanıtlamak istersiniz. Bu perspektifin üst tarafı, gerçekten tüm köşe vakalarını kapsamış olup olmadığınıza, uygulamanızın tam olarak güvenli olması için kabul etmesi gereken programları bırakmamaya ve uygulamanızın sağlam olup olmadığına odaklanmasıdır. herhangi bir programa izin vermeme duygusu kötü yazılmış olarak reddedilmelidir. Dezavantajı, yazışma kanıtınızın muhtemelen uygulamanın kendisinden oldukça ayrı olması,


"Bu bakış açısının tersine, özellikle model sadece sağlam, ancak tam değil ise, tüm köşe vakalarını kapsayıp kapsamadığınıza gerçekten odaklanmasıdır." Farklı bir bakış açısı öneriyorum: bir modelden geçmek , çeşitli nedenlerle kullandığınız, örneğin model daha basit olduğu için, koşullu bir kanıt tekniğidir . Bir modelden geçme konusunda felsefi olarak daha onurlu bir şey yoktur - sonuçta gerçek yürütülebilir dosya ve davranışı hakkında bilmek istersiniz.
Martin Berger

"Model" ve "teori" nin geniş anlamda kastedildiğini düşündüm ve wren sadece "sağlamlık + bütünlük teoremi" ile iki yönlü bir yazışma kurmaya çalışmanın önemini vurguluyordu. (Bunun da önemli olduğunu düşünüyorum ve Andrej'in gönderisine bir yorum yaptı.) Bazı durumlarda sadece bir sağlamlık teoremini (veya bakış açınıza bağlı olarak bir bütünlük teoremini) kanıtlayabileceğimiz, ancak her iki yöne de sahip olacağımız doğrudur. akılda kalıcı bir metodolojik kısıtlama vardır.
Noam Zeilberger

1
@NoamZeilberger "Soru şu," dedi Martin, "kelimeleri çok farklı şeyler ifade edip edemeyeceğiniz."
Martin Berger

Yazma sistemleri ve programlama dili anlambilimi hakkında bilgi sahibi olduğumda, modellerin, kendiliğinden sona ermek yerine, kendi başına sonlanmaktan ziyade, yalnızca sömürücü bir şekilde işlevsel semantikle ilgili kanıt teknikleri olduğunu fark ettim.
Martin Berger

1
Sağlamlık ve bütünlük ile farklı modelleri ilişkilendirmek, içgörü aktarımı için önemli bir bilimsel metodolojidir.
Martin Berger
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.