Program doğrulamasını biliyorsanız , Arka Plandan önce Soruyu okumayı tercih edebilirsiniz . Program doğrulamasına aşina değilseniz, yine de bu soruya cevap verebilirsiniz, ancak önce Arka Plan'ı okumayı tercih edebilirsiniz .
Arka fon
Kısmi doğruluk kontrolünün kararsız olduğu sıklıkla ifade edilir. Tartışma uğruna, bu ifadeyi Floyd - Hoare tarzında kesinleştirmenin çok özel bir yolunu seçelim. Bir flowgraph bir ayırt bir digraph olan başlangıç düğümü tüm düğümlerin ulaşılabilir olan. Bir programı olan düğümleri komutları bir flowgraph olup. Komutları üç tipi vardır (1) varsayımlar kabul q , (2) iddialar Assert q = e: ve (3) atamaları v. Burada q bir fol (birinci dereceden mantık) formülü, e bir fol terimi ve v bir değişkendir.
Her bir x düğümüne a (x) önkoşulu ve b (x) önkoşuluyla ek açıklama yapmanın bir yolu olduğunda , bir programın kısmen doğru olduğunu söyleriz, böylece (1) ilk düğümün önkoşulu geçerlidir, (2) { a (x) } x { b (x) } tüm x komutları için geçerlidir ve (3) ( b (x) bir (y) anlamına gelir ) x ile y arasındaki tüm kenarlar için geçerlidir . Burada Hoare üçlüleri aşağıdaki gibi tanımlanır:
- { p } assert q { r }, ( p ima ( q ve r )) 'nin geçerli olduğu anlamına gelir
- { p } varsayalım q { r }, (( p ve q ) 'nun r ) anlamına geldiğini gösterir
- { S }: v = E { r ((o} araçları s ile e ikame v ) ifade eder r ) geçerlidir
İşte bu kısmi doğruluğun kontrol edilmesinin neden kararsız olduğuna dair el-dalgalı bir argüman : Bazı a (x) ve bazı b (x) doldurduktan sonra bazı fol formüllerinin geçerli olup olmadığını kontrol etmeniz gerekir ve bu karar verilemez.
Kısmi doğrulukta sonlandırmayı kodlamanın tipik bir yolu, esasen "son çalıştırıldığımdan beri sonlandırmaya doğru ilerleme kaydedildi" diyen bazı özel iddialar eklemektir. Bu ilerleme iddiaları , akış şeması üzerindeki (ilk düğümden başlayan) tüm sonsuz yürüyüşlerin sonsuz sayıda ilerleme iddiası içereceği şekilde yerleştirilmelidir. Daha açık olmak gerekirse, ilerleme iddialarının her zaman u < v biçiminde onaylayıcıya sahip olduğunu varsayalım , burada u ve v pozitif tamsayılardır, önce u : = f ataması gelir ve bunu v : = u ataması izler . Burada f birvaryant işlevi , u geçerli değeridir ve v eski değeridir. Şimdi, "pozitif tamsayılar" hakkında konuştuğumuzdan ve bunları karşılaştırdığımızdan, fol'dan biraz daha fazla kullanılabilir olduğundan emin olmalıyız: Diyelim ki Peano aritmetiği mevcut. (Bu seçim hakkında pek bir şey hissetmiyorum. Uygunsa göz ardı etmekten çekinmeyin.) Elbette, f programda belirtilen diğer işlevleri ve sabitleri kullanabilir. (Programın başına varsayım eklemenin, mantıksal olmayan aksiyomları uygulamaya eşdeğer olduğunu unutmayın.)
Şimdi, ilerleme iddiaları olan program hala kısmen doğruysa, orijinal programın sona erdiğini biliyoruz.
Soru
Bir sonlandırma programı göz önüne alındığında, ilerleme iddiaları için varyant fonksiyonlar bulmak zor. Ama ne kadar zor? (Yukarıdaki büyük arka planla bile, nasıl bakmak istediğinize bağlı olarak bu soruyu hala açık uçlu veya kötü tanımlanmış bıraktığımı biliyorum.)
Başka bir deyişle, sonlandırmayı kısmi doğruluğa indirgeme sorununu resmileştiren ve daha sonra karmaşıklığı hakkında bir şeyler söyleyen bir referans arıyorum. Tüm bunları yapan bir cevap elbette memnuniyetle karşılanacaktır.