SORU
2 Kasım 2010, Salı


Haskell fonksiyonları/model-kontrol/teyit doğruluğu özellikleri ile ispat edilebilir?

Fikirler üzerinde devam: Are there any provable real-world languages?

Senin hakkında bilmiyorum, ama benimgaranti edemem kod yazma hasta.

Yukarıdaki soru sorduktan sonra ve inanılmaz ilgi (Teşekkürler!) 15* *kanıtlanabilir, pragmatik bir yaklaşım için arama daraltmak için karar verdim. Aslında yararlı (var 16* web frameworks *bunun için yazılı, bu iyi bir kriter gibi görünüyor çünkü Haskell seçtimVEKanıtlanabilir olması, ya da en azından değişmezler test izin olabilecek, functionally, sıkı yeterli olduğunu düşünüyorum.

Benim istediğim bir şey var(bulamadık)

Haskell bir işlevi bak, Ekle, psudocode yazılmış bir çerçeve istiyorum

add(a, b):
    return a   b

eğer belirli invarients her yürütme devlet üzerinde tutun ve kontrol edin. Bazı resmi kanıt, ancak model Denetleyicisi gibi bir şey için yerleşmek için tercih ederim.
Bu örnekte, invarient verilen değerler olabilirbirvebdönüş değeri her zaman toplamıdırbir b.

Bu basit bir örnek, ama imkansız böyle bir çerçeve için var olduğunu sanmıyorum. Kesinlikle test edilebilir bir fonksiyon karmaşıklığı üst sınırını (bir işlev için 10 dize girişi kesinlikle çok uzun bir zaman alacaktı!) olacaktı ancak bu fonksiyonların daha dikkatli tasarım teşvik edecek, ve diğer biçimsel yöntemler kullanarak daha farklı değil. Değişkenleri/ayarlar tanımlarken Z veya B kullanarak, değişkenleri, mümkün olan en küçük aralıklar ver şu lanet emin olun hayal edin. Eğer İNT asla 100, emin olun yukarıda olacak Eğer gibi sen yeniden! Bu, doğru sorun ayrışma gibi teknikleri - bence - Haskell gibi saf fonksiyonel bir dil yeterli kontrol için izin vermelidir.

Henüz resmi bir yöntem veya Haskell ile deneyimli değilim. Benim fikrim bir ses, ya da belki haskell uygun olmadığını düşünüyorsanız bana da haber ver. Eğer farklı bir dil öneriniz varsa, lütfen "var-bir-web-çerçeve" test ve özgün okuyun question :-) . geçer emin olun

CEVAP
2 Kasım 2010, Salı


Peki, Haskell yol aldığın için başlamak için bir kaç şey:

  • Curry-Howard correspondence bilir misin? Sistemleri, makine kontrol, çok güçlü bir türü sistemleri ile, birçok yönden, sadece işlevsel bir programlama dili olan deliller bu temel için kullanılır.

  • Haskell kodu sıfırlamak için gerekli kavramları sağlayan soyut matematik alanları biliyor musunuz? Cebirin değişik tatlar ve kategori teorisinin bazı parçaları bir sürü gelir.

  • Haskell, Turing-tam Tüm diller gibi, her zaman nontermination olasılığı olduğunu unutmayın. Genel olarak, çok zor bir şey olacağını kanıtlamakher zamanya da doğru bir şey olacağını kanıtlamak için ya da nonterminating bir değeri bağlıdır daha doğru olacak.

Cidden için gidiyoruzkanıtdeğil sadecetestbu gibi şeyleri akılda tutmak. Bu temel kural: geçersiz Birleşik Devletleri derleyici hataları neden Olun. İlk etapta kodlandığı geçersiz veri önlemek, yazın denetleyicisi için sıkıcı bölümü yapalım o zaman.

Gitmek istersen daha da, eğer yanlış hatırlamıyorsam bana kanıt Yardımcısı Coq bir "ayıklamak için Haskell" özellik-ispat keyfi özellikleri hakkında kritik işlevler, sonra dönüp deliller içine Haskell kodu.

Fantezi türü sistem şeyler yapmak için Haskell, Oleg Kiselyov is the Grand Master doğrudan. higher-rank polymorphic types to encode static proofs of array bounds checking gibi harika hareketleri kendi sitesinde örnekler bulabilirsiniz.

Daha hafif şeyler için, doğruluğu kontrol edildikten veri parçasını işaretlemek için using a type-level certificate gibi şeyler yapabilirsiniz. Hala kendi için doğruluğu kendini kontrol, ama başka bir kod en azından bazı veriler, aslında, kontrol edilmiştir bilerek güvenebilirsiniz.

Bir adım atın, bir binadan hafif doğrulama ve fantezi türü sistem numara, kullanmaktır aslında Haskell çalışır iyi bir ana dili için gömme domain-specific languages; ilk inşa bir dikkatle kısıtlı sublanguage (ideal olarak, bir şarkı, değil Turing-complete) hakkında sana verebilirim daha kolay ispat yararlı özellikleri, kullanımı programları DSL sağlayacak anahtar parçaları işlevsellikleri senin genel program. Örneğin, sen-ebil ispat eden iki bağımsız değişken işlev ilişkilendirilebilir saldırıyı haklı çıkarmak amacıyla parallelized azaltma bir koleksiyon öğeleri kullanarak bu işlevi (beri sipariş işlevi uygulama önemli değil, sadece sipariş değişkenler).


Oh, son bir şey. Aksi takdirde güvenli-by-inşaat olacağını kod sabote ki Haskell içeren tuzaklar kaçınarak, bazı tavsiyeler, yeminli düşmanları buradagenel yineleme,IO monadvekısmi fonksiyonları:

  • Önlemek için nispeten kolaydır: en son bunları yazmıyorsun, ve bunları kullanmayın. Desen her set mümkün olan her durumda işler ve asla error undefined aynı olduğundan emin olun. Tek zor kısım hataları neden olabilir standart kütüphane fonksiyonları kaçınmaktır. Belli ki bazı güvenli olmayan, fromJust :: Maybe a -> a head :: [a] -> a gibi ama diğerleri daha ince olabilir. Eğer gerçekten, gerçekten herhangi bir giriş değerleri ile bir şey yapmak, bir işlevi yazma kendinizi bulursanız, o zaman geçersiz Birleşik Devletleri input type tarafından kodlanmış ve bunu düzeltmek için, ilk gereken izin veriyorsunuz.

  • İkinci kolay IO bir ifadede kullanılan çeşitli saf fonksiyonları aracılığıyla bir şeyler saçılma tarafından yüzeysel önlemek için. Daha iyi olduğu için, mümkün olduğunca, hareket bütün program içine saf kod olması bağımsız olarak değerlendirilmesi ile her şeyi ama gerçek G/Ç Bu çoğunlukla zor olur sadece ne zaman ihtiyacınız özyineleme bu tahrik harici giriş, hangi rüzgar attı beni bu son madde:

  • Bilgece bir söz:İyi kurulmuş özyinelemeveüretken corecursion. Her zaman özyinelemeli fonksiyonlar da bilinen temel bir dava için başlangıç noktası olacak emin olun veya isteğe bağlı öğeleri bir dizi oluşturuluyor. Saf kod, bunu yapmanın en kolay yolu bu ya da özyinelemeli olarak çöken bir sonlu veri yapısı (örneğin, yerine bir işlevi çağırmadan kendisi doğrudan süredir artan bir sayaç için bazı maksimum, oluşturun bir liste holding aralığı sayaç değerleri ve katla) veya yinelemeli olarak üreten bir tembel veri yapısı (örneğin, bir liste ilerici yaklaşımlar bir değer), süre dikkatle hiç karıştırma iki doğrudan (örneğin, yok sadece "ilk öğesi akışı toplantı durumu"; var olmayabilirdi. Bunun yerine, bazı maksimum derinlik, sonlu listesi arama, değil bulmuş durumda uygun işleme) akarsudan değerleri al.

  • Birleştiren son iki öğe için o kısım bence yapman gereken IO genel özyineleme, denemek için inşa programı olarak artan parçaları, sonra da yoğunlaşmasına tüm garip parçalara tek bir "sürücü" fonksiyonu. Örneğin, sen-ebil yazmak bir GUI olay döngüsü ile saf bir fonksiyon gibi mainLoop :: UIState -> Events -> UIState, çıkış testi gibi quitMessage :: Events -> Bool, bir işlev için bekleyen olaylar getEvents :: IO Events ve bir güncelleme fonksiyonu updateUI :: UIState -> IO () sonra gerçekten çalışacak bir genelleştirilmiş fonksiyonu runLoopIO :: (b -> a -> b) -> b -> IO a -> (b -> IO ()) -> IO (). Bu tutar karışık parçalar gerçekten saf, izin, çalışan bütün program ile bir olay komut ve kontrol sonuç UI devlet, süre izole garip özyinelemeli I/O bölüme tek bir soyut işlevi kolay kavrar ve çoğu kez kaçınılmaz olarak doğru tarafından parametricity.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AceHoodVEVO

    AceHoodVEVO

    12 Mayıs 2009
  • Ciaran Blumenfeld

    Ciaran Blume

    20 NİSAN 2009
  • mliskIT

    mliskIT

    29 Mart 2012