Matematiksel kanıtları yazmak neden bilgisayar kodunu yazmaktan daha hatalıdır?


190

Herhangi bir hata yapmadan matematiksel kanıtları yazmayı, hata yapmayan bir bilgisayar programı yazmayı çok daha kolay bulduğumu fark ettim.

Görünüşe göre bu benim deneyimimden daha yaygın bir şey. Çoğu insan programlarında sürekli yazılım hataları yapar ve her zaman hatanın ne olduğunu söyleyen derleyicileri vardır. Büyük bir bilgisayar programı yazan ve bir keresinde hiçbir hata yapmayan, hiç bir şey yapamayacağına dair tam bir güven duymuş birini duymadım. (Aslında, neredeyse hiç bir program hatasızdır, hatta birçok hata ayıklanmıştır).

Yine de insanlar, tüm derleyicileri veya matematiksel ispat kitaplarını, derleyicileri olmadan, hata yaptıklarına dair geri bildirimde bulunmaksızın, bazen başkalarından geri bildirim almadan bile yazabilirler.

Açıklığa kavuşturayım. Bu, insanların matematiksel ispatlarda hata yapmadıklarını söylemek değildir, ancak hafif tecrübeli matematikçiler için bile, hatalar genellikle o kadar sorunlu değildir ve size işaret eden bir derleyici gibi bazı "dış kâhiler" yardımı olmadan çözülebilir. hata.

Aslında, durum böyle olmasaydı, o zaman matematik bana öyle geliyor ki mümkün olurdu.

Bu da bana şu soruyu sormamı sağladı: Kusursuz matematiksel kanıtlar yazmanın ve hatasız bilgisayar kodunun yazılmasının, öncekinden çok daha fazla izlenebilir olmasını sağlayacak kadar farklı olan şey nedir?

İnsanların, programcıları tembel kılan ve kodlarını titizlikle yazmak için gerekli olanı yapmalarını engelleyen, hatalarını gösteren bir derleyicinin "dış kahinesi" olduğu gerçeği söylenebilir. Bu görüş, eğer bir derleyicileri olmasaydı, matematikçiler kadar kusursuz olabilecekleri anlamına gelirdi.

Bunu ikna edici bulabilirsiniz, ancak deneyimlerime dayanarak matematiksel deliller yazıp matematiksel kanıtlar yazıyorsun, bana bunun gerçekten açıklama olmadığını sezgisel olarak gösteriyor. İki girişimde daha temel olarak farklı bir şey var gibi görünüyor.

İlk düşüncem, fark olabilir, bir matematikçi için doğru bir kanıt sadece her mantıksal adımın doğru olmasını gerektirir. Her adım doğruysa, kanıtın tamamı doğrudur. Öte yandan, bir programın hatasız olması için, sadece her kod satırının doğru olması gerekmez, aynı zamanda programdaki diğer tüm kod satırlarıyla olan ilişkisinin de çalışması gerekir.

Başka bir deyişle, eğer bir provadaki aşaması doğruysa, o zaman adımında hata yapmak hiç aşamasını karıştırmaz . Ama kod bir çizgi halinde doğru o zaman çizgisi içinde bir hata yapıyor, aşağı yazılır hattı çalışmasını etkileyecektir biz çizgi yazdıktan sonra, böylece Elimizdeki tüm diğer hatlara dikkate ilişkisini almaya. Kapsülleme ve tüm bunları, bunu sınırlamak için kullanabiliriz, ancak tamamen ortadan kaldırılamaz.Y X X Y X XXYXXYXX

Bu, matematiksel bir ispattaki hataları kontrol etme prosedürünün ispat-adım sayısında esasen doğrusal olduğu, ancak bilgisayar kodundaki hataları kontrol etme prosedürünün esas olarak kod satırlarının sayısında üssel olduğu anlamına gelir.

Ne düşünüyorsun?

Not: Bu sorunun çok çeşitli gerçekleri ve bakış açılarını araştıran çok sayıda yanıtı vardır. Cevaplamadan önce, lütfen hepsini okuyun ve yalnızca eklemek için yeni bir şeyiniz varsa cevaplayın. Gereksiz cevaplar veya gerçekleri olan görüşleri yedeklemeyen cevaplar silinebilir.


3
Teorem kanıtlarında hem kağıda hem de makineleştirilmiş programlar için doğruluk kanıtlarının farkında mısınız? Her ikisi de var ve güncellemenizle çelişiyor. doğrusu öğretildiği gibi programlamanın doğruluk kanıtı ile programlama ile ilgisi olduğu doğrudur.
Blaisorblade

76
Bence, bir Knuth alıntı hatırlatıyor "! Yukarıdaki kod dikkat Sadece doğru, test ettim asla kanıtladı"
Hagen von Eitzen

Yorumlar uzun tartışmalar için değildir; bu konuşma sohbete taşındı .
Gilles

7
Bana 100 milyon satır uzunluğunda ve "böcek" olmayan, el yazısıyla yazılmış bir matematik kanıtı bulun ve size sahip olduğum her şeyi vereceğim.
Davor

İşlevsel programlar, ispatlardan daha kolay yazılabilir, ancak, devlet gelir gelmez ... zorluk patlar ...
aoeu256

Yanıtlar:


226

Sorunuza cevap olarak bir neden ve bir yanlış anlama sunmama izin verin.

Temel nedeni o (görünüşte) doğru matematiksel kanıtları yazmak için daha kolay olduğunu onlar çok yüksek seviyede yazılı olmasıdır. Bunun gibi bir program yazabileceğinizi varsayalım:

function MaximumWindow(A, n, w):
    using a sliding window, calculate (in O(n)) the sums of all length-w windows
    return the maximum sum (be smart and use only O(1) memory)

O zamandan bu yana, bu şekilde programlarken ters gitmeye çok zor olurdu şartname programının çok daha özlü onun daha uygulanması . Aslında, sözde kodu koda, özellikle verimli koda dönüştürmeye çalışan her programcı , bir algoritma fikri ile uygulama detayları arasındaki bu büyük uçurumla karşılaşır . Matematiksel kanıtlar fikirlere daha fazla ve detaylara daha az odaklanır.

Matematiksel kanıtlar için kodun gerçek karşılığı bilgisayar destekli kanıtlardır . Bunlar, olağan metinsel kanıtlardan daha zordur ve genellikle okuyucuya "açık" olan (genellikle onları bile fark etmeyen), ancak bilgisayar için belirgin olmayan çeşitli gizli köşeleri keşfeder. Ayrıca, bilgisayar şu anda sadece nispeten küçük boşlukları doldurabildiğinden, kanıtlar, okuyan bir insanın ağaçlar için ormanı özleyeceği bir seviyeye hazırlanmalıdır.

Önemli bir yanılgı , matematiksel kanıtların genellikle doğru olduğu yönündedir. Aslında, bu muhtemelen oldukça iyimser. Hatalı karmaşık ispatlar yazmak çok zordur ve yazılar sıklıkla hatalar içerir. Belki de en ünlü son durumlar bazı 1000+ sayfalar dahil basit sonlu grupların sınıflandırılması halinde Wiles' ilk başta girişimi (bir özel durum) (Fermat'ın son teoremini ima) modülerlik teoremi ve çeşitli boşluklar vardır quasithin gruplar vardı Sınıflandırma bittikten 20 yıl sonra yazıldı.

Voevodsky'nin bir metnindeki bir hata, yazılı kanıtlardan o kadar çok şüphe uyandırdı ki , Homotopi tip teorisini , Homotopi teorisini resmi olarak geliştirmek için faydalı bir mantıksal çerçeve geliştirmeye başladı ve bundan sonra tüm çalışmalarını doğrulamak için bir bilgisayar kullandı. giriş). Bu aşırı (ve şu anda pratik olmayan) bir konum olsa da, sonuç kullanıldığında, bir kanıtı gözden geçirip doğru olup olmadığını kontrol etmesi gereken bir durumdur. Benim bölgemde, yanlış olduğu bilinen ancak asla geri çekilmemiş, uzmanlar arasında durumu ağızdan kulağa ileten birkaç makale var.


Yorumlar uzun tartışmalar için değildir; bu konuşma sohbete taşındı .
DW

1
Gelecekte, hem kodunuzu hem de kanıtınızı kontrol etmek için kanıt yardımcılarının kullanılması mümkün olabilir mi? Belki sana bir Agda öğrenmenin zamanı gelmiştir ? (üzgünüm ...)
Alex Vong

3
@AlexVong Bununla ilgili bir sorun, önemsiz olmayan kod için resmi bir özellik yazmanın (kodun gerçekten belirtimi yerine getirdiğini doğrulayabilmeniz için) hemen hemen imkansız olmasıdır. Örneğin, bir tarayıcı için resmi bir spesifikasyonun ne kadar karmaşık olacağını hayal edebiliyor musunuz (tüm kullanıcı etkileşimi, tüm desteklenen dosya formatları ve protokoller vb. Dahil)?
svick

2
@svick Haklısınız, kullanıcı etkileşimi için, doğru davranışın ne olması gerektiği net değildir. Bu yüzden kendimizi uygun bir resmi spesifikasyona sahip bir şeye odaklamalıyız (örn. İspat, derleyici).
Alex Vong,

1
Aslında. Bu aynı zamanda birçok insanın neden düşük seviyeli dillerdeki kodlamayı, yüksek seviyeli soyut dillere göre kodlamaktan daha sıkıcı ve daha az eğlenceli bulduğu konusunda bir açıklama olabilir. Tabii ki bu kişi tarafından da farklılık gösterse de (Bazıları üzerinde çalışan yazılım yazmaktan çok daha düşük seviyeli donanım / elektronik devreler kurmaktan zevk alabilir mi? Ayrıca, daha düşük seviyeli kod birçok durumda hala yeri doldurulamaz ve iyi yazabilir) tek başına takdir etmeye değer kıt bir beceri / başarı olabilir).
xji

77

(Muhtemelen, burada doğru bir cevap yapmak için zamanım / ilgim olmadığı için, birkaç öneriyi riske atıyorum, ancak yazılanlar dikkate alındığında, aşağıda belirtilen metni (ve alıntı yapılan makalenin geri kalanını) oldukça anlayışlı buluyorum. tanınmış bir matematikçi tarafından. Belki de cevabı daha sonra geliştirebilirim.)

Tahmin ettiğim fikir, mevcut cevaptan özellikle farklı değil, bir "kanıt" veya argümanın, amacı, onları (sıkıcı) ayrıntıların ilke olarak doldurulabileceğine ikna etmek olduğu bir matematik topluluğuna ilettiğidir. tam olarak tanımlanmış bir resmi kanıt elde etmek - sık sık hiç yapmadan. Bunun kritik bir örneği, mevcut teoremleri basitçe belirterek kullanabilmenizdir, ancak kodun yeniden kullanımı genel olarak çok daha zordur. Ayrıca, tamamen bir kod parçasını tamamen işe yaramaz hale getirebilecek (örneğin, SEGFAULT'lar) olan ancak "matematiksel bir argümanı bozulmadan bırakabilirse (yani, argüman çökmeden ortaya çıkarsa)" küçük hatalar düşünün.

Bir bilgisayar programının çalışabilmesi için gerekli olan doğruluk ve bütünlük standardı, matematik topluluğunun geçerli ispat standartlarından daha büyük bir kaç derece emridir. Bununla birlikte, büyük bilgisayar programları, çok dikkatli bir şekilde yazılmış ve çok dikkatli bir şekilde test edilmiş olsalar bile, her zaman hata yapmış gibi görünmektedir. [...] Matematiği uyguladıkça, diğer bilimlerden çok daha resmi olarak eksiksiz ve kesindir, ancak içeriği için bilgisayar programlarından daha az resmi olarak eksiksiz ve kesindir. Aradaki fark, sadece çaba ile değil, aynı çaba ile niteliksel olarak farklı. Büyük bilgisayar programlarında, sayısız uyumluluk meselesine muazzam bir çaba harcanması gerekir: tüm tanımların tutarlı olmasını sağlayarak "iyi" geliştirme Faydalı ancak hantal olmayan bir genelliğe sahip, fonksiyonlar için "doğru" genelliğe karar veren vb. veri yapıları, büyük bir programın çalışma bölümünde harcanan enerjinin, defter tutma bölümünden ayırt edildiği gibi şaşırtıcı bir şekilde küçüktür. Genel olarak ve işlevsellik eklenirken “doğru” tanımların değiştiğinden, kaçınılmaz bir şekilde elden çıkmaya başlayan uyumluluk sorunları nedeniyle, bilgisayar programlarının genellikle sık sık sıfırdan yazılması gerekir.

MATEMATİKTE KANIT VE İYİLEŞME HAKKINDA (sf. 9-10), WILLIAM P. THURSTON tarafından https://arxiv.org/pdf/math/9404236.pdf


3
"Yeniden kod kullanımı" ile ilgili nokta oldukça apropos. Rusça'dan İngilizceye uzun bir ispatı tercüme etmek çok fazla yazmayı gerektirir ; fakat C ++ 'dan Java'ya büyük bir bilgisayar programını çevirmek oldukça fazla düşünmeyi gerektirir . Ayrıca, Eski Yunanca'da 3000 yıllık bir kanıtı diriltmek de bu kadar kolay; PL / 1’de 30 yıllık bir programı yeniden diriltmek neredeyse zor ya da daha zor.
Quuxplusone

2
Antik Yunan örnek de fark etmemi sağladı: Bilgisayar programcıları bir kullanmak ton yerel argo ve bu şekilde konuşma diline ait (void*)1ve open('/dev/null')hatta hedef dile çevrilebilir dursun, farklı alt kültürleri arasındaki taşınabilir olmayabilir, hangi. (Okuyucunun sadece yaklaşık anlambilimlerini uzun bir deneyimle hayal kırıklığına uğratması gerekiyor.) Bence matematiksel kanıtlar bu tür "argo" dan daha az içeriyor. Eğer bir ispat bir kelimeyi kullanıyorsa, gerçek evrensel anlamının bir şekilde okuyucu tarafından indirilebileceği farz edilir. Bilgisayar programlarının evrensel anlamları bile yok !
Quuxplusone

1
+1, çünkü bir yapılandırmacı olarak , keyfi bir şekilde büyük bir değerden farklı bir yaygın varsayımı beni deli ediyor. Bu, matematikçilerin sonsuz serilerden bahsetmeye başladıkları ve daha sonra bu serilere dayanarak argümanlar yaptıkları ve bir gizli- 0 ile eşitlik yaptıkları zaman değer düzeyinde bir yanlışlıktan mantıksal bir yanlışlığa yükselir yanlışlık. 00
Nat

@Nat detaylandırabilir misiniz? Anlamadım.
Gregory Magarshak

@GregoryMagarshak Bu cevap serisi yapımında o sonsuzluk en geçerli ben gibi varlık olarak açıklayan bir safsata neden olmakta ve bunun varsayarak bir vakayı göstermiştir bu hidden- hatalı00(Wikipedia bölümünde"gizlenmiş" sürüm daha düşük). Klasik bir matematikçi, hatanın sonsuz bir dizinin yakınsayacağını varsaydığını söylese de, bir yapılandırmacı yanlışlığı, niteliksiz bir sonsuzluk varsayımı olarak tanımlayacaktır.
Nat

55

EW Dijkstra'dan alıntı yaparak başlamama izin verin:

“Programlama, uygulamalı matematiğin en zor dallarından biridir; daha fakir matematikçiler daha iyi matematikçiler olmaya devam etmişlerdir.” (EWD498’den)

Her ne kadar Dijkstra’nın “programlama” ile ne anlama geldiği mevcut kullanımdan biraz farklı olsa da, bu alıntıda hala bir miktar hak var. Diğer cevaplar, matematikteki soyutlama seviyesinin programlamadan çok daha yüksek olmasına izin verdiğinden bahsetti, bu da eğer istersen bazı zor kısımları görmezden gelebiliriz.

Ancak, bu sadece bir kanıtı ve onların olan bir bilgisayar programı, arasında daha temel bir farkın bir sonucu olduğuna inanıyoruz amaç .

Matematiksel bir ispatın asıl amacı, diğerlerinin yanı sıra, kendini matematiksel bir iddianın doğru ve belki de daha önemli, anlayışı başardığına ikna etmektir . Bu nedenle, sadece matematik dünyasında çalışmayı seçebilirsiniz; her şey tasarımın kavrayabileceği şekilde yaratılır (bazı öğrenciler farklı olsa da dilenir). (neredeyse) yalnızca matematiksel gerçeklerle ve özelliklerini anlamada kendilerini ilgilendirir.

Bu nedenle, doğru ispatlar üretmenin, hataya dayanıklı olduğuna şaşırmamalısınız: bu, tüm "alıştırmanın" noktasıdır. (Yine de bu, hataların var olmadığı ya da zorlukla var olduğu anlamına gelmez, der ki, sadece insandır, derler)

Şimdi, programlamayı düşünürsek, amacımız ne? Gerçekten anlamayı istemiyoruz, işe yarayan bir şey istiyoruz . Ama ne zaman bir şey "işe yarıyor"? Bazı garip makinelerin yapmasını istediğimiz görevi tamamlamasını ve tercihen de oldukça hızlı bir şekilde yapmasını sağlayan bir şey başarıyla yarattığımızda bir şeyler işe yarıyor.

Bu, temel farkın, amacımızın programımızın "kanıtladığı" bir teorem olarak ifade edilemeyeceği anlamına geldiğine inanıyorum, gerçek dünyada bir şeyi arzu ediyoruz (bir şey değil), bazı matematiksel bir eser değil. Bu, makineye hitap etmemiz gerektiği için (Dijkstra'nın bunu dengesizce denemenize rağmen) amacımıza tamamen teorik olarak ulaşamayacağımız anlamına gelir, aslında hangi görevi yapmak istediğimizi bildiğimizi ve aynı zamanda dikkate alınmayan şeylerin farkında olduğumuzu umuyoruz. bir şekilde.

Dolayısıyla, sonuçta, sadece denemenin ve muhtemelen başarısız olmanın, düzeltmenin, başarısız olmanın ve sonuçtan biraz memnun kalana kadar tekrar denemenin başka yolu yoktur.


Hatasız kanıt yazma hipotezinizin, hatasız programların ( @Ariel'in işaret ettiği gibi farklı ifadelerdir) daha basit olduğunu, kanıtların sıklıkla deneme ve yanılma yoluyla bir seviyede yapıldığı gerçeğine dikkat edin. Yine de, bunun ima edilen soruya biraz ışık tuttuğunu umuyorum: “Bazı teoremleri ispatlamak ile bir program yazmak arasındaki fark nedir?” ( Curry-Howard yazışmalarında dikkatsiz bir gözlemci şöyle diyebilir: “Hiç bir şey yok!”)


Yorumlarda @wvxvw'nin belirttiği gibi, 'Yapısal Programlama Üzerine Notlar'dan (EWD249, sayfa 21) aşağıdaki paragraflar çok önemlidir:

(...) Bir program hiçbir zaman kendi içinde bir amaç değildir; Bir programın amacı hesaplamaları uyarmak ve hesapların amacı istenilen etkiyi oluşturmaktır. Program, programcı tarafından yapılan son ürün olmasına rağmen, onun tarafından uyandıran muhtemel hesaplamalar - "yapımı" makineye bırakıldı! - ticaretinin asıl konusu. Örneğin, bir programcı programının doğru olduğunu söylediğinde, gerçekten uyandırabileceği hesaplamalar hakkında bir iddiada bulunur.

(...) Bir anlamda bir programın yapılması matematiksel bir teori yapmaktan daha zordur: hem program hem de teori yapılandırılmış, zamansız nesnelerdir. Ancak matematik teorisi olduğu gibi mantıklı olsa da, program sadece yürütülmesi ile anlamlıdır.


2
Ben sadece bir meslekten değilim; Dijkstra gerçekten "programlama" ile neyi kastetti?
Ovi

2
@Ovi Kesin olarak emin değilim, ancak asıl fark, 'genel' programlama görevlerinden daha fazlasını çözen (önemsiz) algoritmik bir problem hakkında konuştuğu, yani bazılarını bağlaması gereken bazı CRUD programlarından bahsetmediğidir. mimarileri veya diğer bileşenleri vb Daha programlama Dijkstra'nın görüşüne görülebilir mevcut bu cevap
Ayrık kertenkele

3
Dijkstra'dan alıntı yapmak için oy verin, ama yanlış yeri seçtiniz! Yapısal Programlamanın ilk paragraflarında bu konuda çok şey yazmıştır. Farklı bir teklif göndererek cevabınızı değiştirmek istemem, ama cevabınıza bu makaleden daha fazlasını eklemek isteyeceğinizi umuyorum!
wvxvw

@Ovi, soruma dair tahminim, Dijkstra'nın zamanındaki programlamanın, daha yüksek seviyeli dillerin modern çağına karşı montaj kodu yazmak anlamına geldiğidir. Benzer şekilde, 1974 tarihli Mythical Man-Month kitabını okuyorum, kavramlar hala geçerli fakat teknik referanslar sistem düzeyinde bir montajcı veya PL / I, çoğu insanın bugün programlama olarak düşündüklerinden çok farklı
JimLohse

46

Lamport, Kanıtın nasıl yazıldığına dair kanıtlardaki hataların yaygınlığına dair bir anlaşmazlık sağlar (sayfa 8-9) :

Yaklaşık yirmi yıl önce, giriş matematik dersi için Schroeder-Bernstein teoreminin bir kanıtını yazmaya karar verdim. Bulabileceğim en basit kanıt Kelley'in klasik genel topoloji metninde. Kelley daha sofistike bir izleyici kitlesi için yazdığından, yarım sayfalık kanıtına çok fazla açıklama eklemeliydim. Kelley'nin ispatının yanlış olduğunu anladığımda beş sayfa yazmıştım. Son zamanlarda, ispat stilimle ilgili ikna edici bir yanlış ispatla ilgili bir konferans göstermek istedim, bu yüzden Kelley'ye döndüm. Kanıtında yanlış bir şey bulamadım; Açıkçası doğru görünüyordu! Kanıtın okunması ve yeniden okunması beni ya hafızamın başarısız olduğuna ya da yirmi yıl önce çok aptal olduğuma ikna etti. Yine de, Kelley'in kanıtı kısaydı ve güzel bir örnek olurdu, bu yüzden yapılandırılmış bir kanıt olarak yeniden yazmaya başladım.

... Stil ilk önce Martin Abadi ile yazdığım bir makalede sıradan teoremlerin ispatlarına uygulandı. Çoktan geleneksel ispatlar yazmıştı - bizi ve muhtemelen hakemleri ikna etmeye yetecek kadar iyi kanıtlar. İspatları yapılandırılmış bir tarzda yeniden yazarken, teoremlerin doğru olmasına rağmen neredeyse her birinin ciddi hatalar olduğunu keşfettik. Yanlış ispatların yanlış teoremlere yol açmayacağına dair herhangi bir umut, bir sonraki işbirliğimizde yıkıldı. Zaman zaman tekrar düşünürsek, tahtaya bir ispat taslak hazırlardık - kolayca ikna edici bir geleneksel ispat haline getirilmiş bir taslak - sadece yapılandırılmış bir kanıt yazmayı deneyerek, yanlışlığın yanlış olduğunu keşfediyoruz. O zamandan beri, dikkatli ve yapılandırılmış bir kanıt olmadan sonuçlara hiç inanmadım.


6
Aynı makale: "Anekdot kanıt, matematik dergilerinde yayınlanan makalelerin üçte birinin hata içerdiğini göstermektedir - sadece küçük hatalar değil, aynı zamanda yanlış teoremler ve ispatlar". Bu 90'lı yıllarda oldu, ama bugün o kadar farklı mı? Muhtemelen o günlerde mevcut olan kağıtlar hala var ve her şey birikiyor ... Bu yüzden, kağıtlarda verilen matematiksel kanıtların daha az hata içerdiğine tam olarak ikna olmadım.
MarkokraM

Büyüleyici fıkra, ancak doğrudan soruya cevap verdiğini veya ilgisini çektiğini görmüyorum. Sorunuzu daha doğrudan cevaplamak için cevabınızı düzenlemek ister misiniz? Matematiksel kanıtların tıpkı bilgisayar kodu yazmak kadar hatalı olduğunu mı iddia ediyorsunuz? Sağlayabileceğine dair bir kanıtın var mı? Bir ya da iki fıkra gerçekten bunu göstermez, değil mi?
DW

@DW Leslie için bir e-posta mesajı gönderirsek, talep için daha fazla kanıt verebilirse.
MarkokraM

3
@DW Leslie, samimi cevabında, meslektaşının o sırada Math Review'de yayınlanan 51 kanıtla bir soruşturma yaptığını söyledi. Ona göre, anekdottan daha fazlasıdır, ancak bazı gerçekler nedeniyle güçlü kanıtlara uygun değildir. Dava daha karmaşıktı çünkü ispatlar üzerinde bazı hatalar vardı, çünkü daha önce yayınlanmış makalelerin yanısıra yanlış ispatlar kullandılar. Matematiksel kanıtların programlı olarak nasıl doğrulanacağı yine de büyük bir sorundur. Etkileşimli prova yardımı için yapılan uygulamalar çok erken aşamalardadır. En azından onların arayüzü.
MarkokraM

@DW Fıkra veya iki, matematiksel bir kanıtın nasıl “doğru” göründüğünü ancak gerçekte sağlam olmadığını gösterir. Hem karmaşık bir bilgisayar algoritması yazmış, hem de matematiksel bir ispat yapmış, matematiksel bir kanıt gibi bir bilgisayar algoritması yazmış ve daha sonra yüksek seviyede "algoritmanın" nasıl ihanet edildiğini keşfetmiş, sonuçta hiç şaşırtıcı değil.
Yakk

39

Büyük bir fark, programların girdiler üzerinde çalışmak üzere yazılmasıdır, oysa matematiksel kanıtlar genellikle bir aksiyom dizisinden ve önceden bilinen teoremlerden başlar. Bazen yeterince genel bir kanıt elde etmek için birden fazla köşe vakasını ele almanız gerekir, ancak davalar ve kararları açıkça sıralanır ve sonucun kapsamı kapsanan davalarla örtülü olarak sınırlandırılır.

Bunu, bir dizi olası giriş için 'doğru' çıktı sağlamak zorunda olan bir bilgisayar programı ile karşılaştırın. Tüm girdileri numaralandırmak ve hepsini denemek nadiren mümkündür. Daha kötüsü, programın bir insanla etkileşime girdiğini ve girdilerinin işleyişini değiştirmesine izin verdiğini varsayalım. İnsanoğlunun bildiği gibi öngörülemez ve insan etkileşimi ile oldukça büyük bir program için olası girdiler olağanüstü bir oranda büyür. Bir programın kullanılabileceği tüm farklı yolları öngörmeyi denemeli ve tüm bu kullanım durumlarını çalışabilir ya da en azından makul bir şekilde, başarısızlık tek seçenek olduğunda başarısız kılmaya çalışmalısınız. Ve bu bile nasıl olduğunu farz ediyor sözde tüm bu karanlık köşe durumlarda çalışmak.

Son olarak, büyük bir program gerçekten tek bir kanıtla, hatta karmaşık bir programla karşılaştırılamaz. Büyük bir program, muhtemelen üzerinde çalışmanız gereken bazı hataları olan küçük bir edebiyat kütüphanesini toplamaya ve incelemeye daha yakındır. Küçük bir algoritma uygulaması olabilecek tek bir ispat ölçeğindeki programlar için diyelim ki, deneyimli yazılım mühendisleri, özellikle yaygın önemsiz hataları önleyen / çözen modern araçlar kullanırken (yazım hatalarını andıran) ) prova okumasında çözeceğiniz erken konulara eşdeğerdir.


14
Son paragrafınız için +1. Matematiksel ispatlar ilke olarak birbirinin üzerine inşa edilmiş olsa da, genellikle temeller iyi anlaşılır, bilgisayar kütüphanelerinin analoğu (aynı zamanda hataları da vardır ...) ve gerçek ispat çok uzun değildir. Buna karşılık, tüketici yazılımı uzun ve karmaşık ve bu yüzden başarısız olmak için daha birçok fırsat var.
Yuval Filmus

6
Uygulamada, tüketici yazılımıyla ilgili diğer sorun, 'doğru' davranışın genellikle çok önceden tanımlanmamış olması ve bu nedenle daha sonra doğru olması gerekenlerin yanlış hale gelmesidir. Sadece insanların aksiyomları değiştirmeye karar verdiklerini bulmak için bir kanıt yazmaya çalışmak gibi olurdu. Bunu gösterimde düzeltebilirsin, değil mi?
Dan Bryant

2
@DanBryant Bu durum matematikte olur. Özellikle terimlerin tanımları zaman içinde değişmektedir ve sıklıkla kullanıldığı gibi doğru bile belirsizdir. Imre Lakatos'un "Kanıtlar ve Reddedilmeler", bunu "çokgen" terimiyle açıklar. Benzer bir şey "işlev" ve daha az bir ölçüde "integral" ile de oldu. Bugün bile, "kategori" açık değildir ve tam olarak ne demek istediğinizi temel alarak ispatlar ve teoremler başarısız olabilir.
Derek Elkins

25

Bilgisayarlardaki problemin, tam olarak söylediklerini yapmaları olduğunu söylüyorlar.

Bunun birçok nedenden biri olabileceğini düşünüyorum.

Bir bilgisayar programında, yazıcının (siz) akıllı, ancak okuyucunun (CPU) aptal olduğuna dikkat edin.
Ancak matematiksel bir kanıtla, yazar (siz) akıllısınız ve okuyucu (eleştirmen) de akıllıdır.

Bu, bir bilgisayarla asla " demek istediğimi biliyorsun " durumuna giremeyeceğin anlamına gelir . Bu, niyetini bilmeden tam olarak ne söylediğini yapar.

Örneğin, bunun bir kanıt olarak atılmış bir adım olduğunu varsayalım:

x2+4x+3x+3=(x+1)(x+3)x+3=x+1

x2+4x+3x+3x=3


3
Mükemmel cevap! bunun dışında bilgisayar olarak, "gereksiz yere" kelimesini kullanımınıza itiraz ediyorum. ;) [Bunun -x, kompozit olduğunu kanıtlamayı amaçlayan daha büyük bir kanıtlamada sadece bir adım olduğunu varsayalım . Bu adımın yanlış olduğu gerçeği -x = 3, tamamlanmış kanıtın doğruluğuyla büyük ölçüde ilgilidir!]
Quuxplusone

@Quuxplusone: = P
Mehrdad,

Bilgisayarlar sembolik matematik ve deterministik olmayan yeniden yazma kurallarını da kullanabilirler; sadece C ++ gibi kullandığımız dillerin hepsi çok düşük seviyededir ve eski teknolojiye dayanmaktadır (C, örneğin Algol 60'dan daha az özelliklere sahiptir). Bunun tek istisnası, sembolik çözücülerle ve Mathematica ile İdris / Ağda, Lisp gibi ispat / kontrol dilleridir. ja.wolframalpha.com/input/…
aoeu256

23

Yuval'ın cevabında değinmediğimi düşündüğüm bir konu, farklı hayvanları karşılaştırıyormuşsunuz gibi görünüyor.

nn!

Programların anlamsal özelliklerinin doğrulanması kararsızdır (Rice teoremi) ve benzer şekilde, birinci sıradaki bir mantık ifadesinin mantığının doğru olup olmadığını kontrol etmek de aynı şekilde mümkün değildir. Mesele şu ki, sorunlara bakış açınızdan sertlikte hiçbir fark yoktur. Öte yandan, programların (derleyiciler) sözdizimsel özellikleri hakkında düşünebiliriz ve bu da kanıtları doğrulayabileceğimiz gerçeğine benzer. Hatalar (kod istediğimi yapmıyor) anlamlıdır, bu yüzden onları doğru karşıtlarıyla karşılaştırmalısınız.

Yuval'ı güçlendireceğim ve tüm alanların bazı resmi sistemlerde yazılabilecek ve doğrulanabilecek matematiksel kanıtlar yazma motivasyonuyla büyüdüğünü söyleyeceğim, bu yüzden doğrulama süreci hiç de önemsiz değildir.


18

Kusursuz matematiksel ispatlar yazmanın ve hatasız bilgisayar kodunu yazmanın, eskisinden çok daha izlenebilir olmasını sağlayacak kadar farklı olan şey nedir?

Öncelikli nedenlerin önemsizlik (aynı girdiler için aynı sonuçları verir) ve değişmezlik ( değişmez ) olduğuna inanıyorum .

Peki ya bir matematik kanıtı Salı günü ya da 1999'dan 2000 yılına kadar olan bir yıl okunduğunda farklı sonuçlar verebilirse? Peki ya matematiksel bir ispatın parçası birkaç sayfaya geri gitmek, birkaç satırı yeniden yazmak ve sonra bu noktadan tekrar başlamaksa?

Bu tür bir kanıtın neredeyse bilgisayar kodunun normal bir parçası gibi hatalara eğilimli olacağına eminim.

Diğer ikincil faktörleri de görüyorum:

  1. Matematikçiler genellikle önemli / açıklanabilir bir kanıt yazmaya başlamadan önce çok daha eğitimlidirler. Kendi adını taşıyan profesyonel geliştiricilerin 1 / 4'ü 6 yıldan daha az bir süre önce kodlamaya başladı (bkz. SO anketi 2017 ), ancak çoğu matematikçinin on yıldan fazla resmi matematik eğitimine sahip olduğunu varsayıyorum.
  2. Matematiksel kanıtlar nadiren bilgisayar kodu ile aynı seviyededir. Tek bir yazım hatası bir programı bozabilir / kırabilir, ancak bir kanıtın değerini (sadece okunabilirliğini) yok etmek için düzinelerce yazım hatası yeterli olmayabilir.
  3. Şeytanın detayları ve bilgisayar kodları detayları geçemez. Kanıtlar basit / rutin sayılan adımları atlamakta serbesttir. Modern dillerde bazı hoş sözdizimsel şekerler var, ancak bunlar çok kodlanmış ve kıyaslandığında oldukça sınırlı.
  4. Matematik eski ve daha sağlam bir temele / çekirdeğe sahiptir. Kesinlikle matematikte yeni ve parlak alt alanların bir bolluğu vardır, ancak temel ilkelerin çoğu on yıllardır kullanılmaktadır. Bu stabiliteye yol açar. Diğer taraftan, programcılar hala temel kodlama metodolojisine katılmamaktadırlar (sadece Çevik gelişim ve benimseme oranı hakkında bilgi isteyin).

Programlamanın 'indempotency' eşdeğerinin, Haskell gibi bazı dillerde tanınan ve desteklenen fonksiyonel saflık olduğunu söylemeye değer olabilir .
Pharap

12

Yuval'ın yazdıklarına katılıyorum. Ama aynı zamanda çok daha basit bir cevabı da var: Uygulama yazılımları mühendisleri tipik olarak programlarının doğruluğunu kontrol etmeye bile çalışmazlar, basitçe yapmazlar, genellikle programın ne zaman doğru olduğunu tanımlayan koşulları bile yazmazlar.

Bunun çeşitli nedenleri var. Birincisi, çoğu yazılım mühendisinin problemleri matematiksel olarak açık bir şekilde formüle etme becerisine sahip olmadığı veya doğruluk kanıtları yazmayı bilmedikleridir.

Bir diğeri ise, karmaşık bir yazılım sistemi (özellikle dağınık olan) için doğruluk koşullarını tanımlamanın çok zor ve zaman alıcı bir iştir. Haftalar içerisinde işe yarayacak bir şeye sahip olmaları bekleniyor.

Başka bir neden, bir programın doğruluğunun, başkaları tarafından yazılan ve bu nedenle tekrar net bir anlam ifade etmeyen birçok sisteme bağlı olmasıdır. Bir kütüphanenin / hizmetinizin gözlenebilir bir davranışı varsa (sözleşmesinin bir parçası değil) birisinin nihayet buna bağlı olacağını söyleyen bir Hyrum yasası vardır. Bu, temel olarak, matematikte lemmalar gibi açık sözleşmelerle, modüler formda yazılım geliştirme fikri, pratikte çalışmadığı anlamına gelir. Yansımanın kullanıldığı dillerde daha da kötüleşiyor. Bugün bir program doğru olsa bile, birileri bağımlılıklarından birinde önemsiz yeniden yapılanmalar yaptığında yarın bozulabilir.

Uygulamada tipik olan şey, testlere sahip olmalarıdır. Testler programdan bekleneni yapar. Her yeni bir hata bulunduğunda, onu yakalamak için testler eklerler. Bir dereceye kadar çalışır, ancak bir doğruluk kanıtı değildir.

İnsanların doğruluğu belirleme, doğru programlar yazma becerileri veya ne yapmaları beklendiği ve bunu yapması beklenmeyen beceriler olmadığı zaman, yazılımların doğru olmaması şaşırtıcı değildir.

Ama aynı zamanda daha iyi yerlerde yazılım mühendisliğinin kod incelemesiyle yapıldığını unutmayın. Programın yazarı, programın doğru çalıştığını en az bir kişiyi ikna etmek zorundadır. Bazı gayri resmi üst düzey tartışmaların yapıldığı nokta budur. Fakat yine de tipik olarak net bir doğruluk tanımına yakın bir şey yoktur veya doğruluk kanıtı ortaya çıkar.

Matematikte insanlar doğruluk üzerine odaklanmıştır. Yazılım geliştirmede, bir programcının ilgilenmesi gereken pek çok şey vardır ve bunlar arasında takaslar vardır. Sorunsuz bir yazılıma veya hatta zaman içinde değişen gereksinimlere göre iyi bir doğruluk tanımına sahip olmak bir idealdir, ancak diğer faktörlere karşı işlem görmesi gerekir ve bunlar arasında en önemlilerinden biri mevcut tarafından geliştirilmesinde harcanan zamandır. geliştiricileri. Bu yüzden pratikte daha iyi yerlerde amaç ve süreçler, yazılımı hatasız yapmaktan ziyade böcek riskini mümkün olduğu kadar azaltmaktadır.


Programcılar ve matematikçiler arasında kimin resmen (yani makineyle kontrol edilen bir şekilde) doğruluk spesifikasyonları belirlediğini ve örneğin bir 10KLOC veya daha büyük bir program için doğru kodu ispatladığından kimsenin daha kötü durumda olduğundan emin değilim . Bir yandan, çoğu programcının gelişmiş teorem kanıtlama becerisine sahip olmadığı konusunda tamamen haklısınız. Öte yandan, büyük resmi kanıtlar büyük programlar gibidir ve esas olarak yönetilmesi için yazılım mühendisliği becerileri gerektirir. Böyle bir program için herhangi bir gayrı resmi doğruluk kanıtının haklı olma umuduna sahip olmadığından tamamen eminim.
Derek Elkins,

Olabilir. Her durumda ve açıklığa kavuşturmak için cevabımdaki resmi ispatları almıyorum, algoritma belgelerinde söylediğimiz seviyedeki gayrı resmi ispatları almıyorum.
Kaveh

11

Halihazırda pek çok iyi cevap var ama matematik ve programlamanın aynı olmama nedenleri daha var.

1 Matematiksel kanıtlar, bilgisayar programlarından çok daha basit olma eğilimindedir. Varsayımsal bir kanıtın ilk adımlarını göz önünde bulundurun:

Bir tamsayı olsun

B bir tamsayı olsun

C = a + b olsun

Şimdiye kadar kanıt iyidir. Bunu benzer bir programın ilk adımlarına çevirelim:

A = input ();

B = giriş ();

C = a + b;

Zaten sayısız sorunumuz var. Kullanıcının gerçekten bir tamsayı girdiğini varsayarsak, sınırları kontrol etmemiz gerekir. Mı bir daha büyük -32768 (sisteminizde ya da her türlü dk int)? Mı bir 32767 daha az? Şimdi aynı şeyi b için de kontrol etmeliyiz . Ve a ve b eklediğimiz için program a + b olmadığı sürece doğru değildir.-32768'den büyük ve 32767'den küçük. Programcının bir matematikçinin görmezden gelebileceği konusunda endişelenmesi gereken 5 ayrı şart. Programcının sadece onlar için endişelenmesi gerekmiyor, bu şartlardan biri karşılanmadığında ne yapacağını bulmak zorunda ve karar vermiş olsa bile yapmak için kod yazması gerekiyor. Matematik basit. Programlama zor.

2 Sorgulayıcı, derleme zamanı hatalarına mı yoksa çalışma zamanı hatalarına mı atıfta bulunduğunu söylemiyor, ancak programcılar genellikle derleme zamanı hatalarını umursamıyor. Derleyici onları bulur ve düzeltmeleri kolaydır. Tipo gibiler. İnsanlar ilk defa hatasız olarak birkaç paragrafı ne sıklıkla yazarlar?

3 Eğitim.Çok küçük yaşlardan itibaren matematik yapmamız öğretilir ve küçük hataların tekrar tekrar sonuçlarına katlanırız. Eğitimli bir matematikçi, genellikle ortaokulda çok adımlı cebir problemlerini çözmeye başlamalı ve bir yıl boyunca her hafta düzinelerce (veya daha fazla) böyle problemler yapmalıydı. Tek bir bırakılan negatif işaret tüm sorunun yanlış olmasına neden oldu. Cebirden sonra problemler daha da uzuyordu. Diğer taraftan, programcılar genellikle daha az resmi eğitime sahiptir. Birçoğu kendi kendini eğitiyor (en azından başlangıçta) ve üniversiteye kadar resmi bir eğitim alamadı. Üniversite düzeyinde bile, programcılar bir kaç matematik dersi alırken, matematikçiler muhtemelen bir veya iki programlama dersi aldı.


10

Yuval'ın cevabını beğendim, ama bir süreliğine bunu mahvetmek istedim. Matematik kanıtları yazmayı daha kolay bulabilmenizin bir nedeni, Platonik Matematik ontolojisinin ne kadar olduğuna bağlı olabilir. Ne demek istediğimi görmek için aşağıdakileri göz önünde bulundurun:

  • Matematik'teki işlevler saftır (bir işlev çağrmanın sonucu, tamamen deterministik olan ve giriş değerinden tamamen hesaplanan dönüş değerinde tamamen kapsüllenmiştir).
  • Matematik mutasyon veya yeniden atama yoktur (bu tür şeyleri modellemeniz gerektiğinde, işlevler ve diziler kullanılır).
  • Matematik, referans olarak saydamdır (örn. İşaretçiler yok, isim-by-call-by-call-no-by-nos- yonu yok) kavramı ve Matematiksel nesneler, uzamsal eşitlik semantiğine sahiptir (eğer "iki" şey her gözlemlenebilir şekilde aynı ise, o zaman aslında aynı şey).

Yukarıdaki kısıtlamaların bir program yazmayı kolaylaştırıp kolaylaştırmayacağı tartışılabilir olsa da, yukarıdaki kısıtlamaların bir program hakkında mantıklı olmayı kolaylaştıracağı konusunda geniş bir anlaşma olduğunu düşünüyorum . Bir Matematik kanıtı yazarken yaptığınız en önemli şey şu anda yazmakta olduğunuz kanıtla ilgili bir sebeptir (çünkü programlamadakilerin aksine, matematikte soyutlamalar ücretsiz olduğu için çabayı hiçbir zaman çoğaltmanıza gerek kalmaz), bu yüzden genellikle bunun için ısrar etmeye değer yukarıdaki kısıtlamaların üstünde.


7

Temel matematiksel kanıtlar, canlı insanların ihtiyaçlarını karşılamak için tasarlanmış gerçek bir dünya uygulaması anlamına gelmez.

İnsanlar, bilgisayar programları alanında günlük olarak neyin temeli olduğu konusundaki isteklerini, ihtiyaçlarını ve gereksinimlerini değiştireceklerdir.

Kusursuz matematiksel ispatlar yazmanın ve hatasız bilgisayar kodunu yazmanın, eskisinden çok daha izlenebilir olmasını sağlayacak kadar farklı olan şey nedir?

Matematiksel bir problem kadar açık bir gereksinim olduğu gibi kusursuz bir program yazılabilir. Dijkstra'nın algoritmasının bir grafikteki iki nokta arasındaki en kısa yolu bulabildiğini kanıtlamak, rastgele girdileri kabul eden ve içindeki iki nokta arasındaki en kısa noktaları bulan programla aynı değildir.

Yönetilmesi gereken bellek, performans ve donanım endişeleri var. Algoritmalar yazarken, bunları yönetmek için saf ve işlevsel yapılar kullanabileceğimizi düşünmemeyi, bilgisayar programları “gerçek” donanım dünyasında yaşarken, matematiksel kanıtların “teoride” yer almasını isterdim.


Veya daha özlü olmak için :

görüntü tanımını buraya girin


4

Başka bir açıdan bakıldığında, akademik olmayan bir ortamda çoğu zaman paraya düşer.

Diğer yayınlar da açıkça belirtildiği gibi, Math tek bir soyut şartnamedir, bu yüzden bir kanıtın sadece kanıtlanmış olan şartnamede tutarlı bir şekilde çalışması gerekir. Bir bilgisayar programı, matematiğin soyut spesifikasyonunun birçok uygulaması üzerinde çalışabilir - yani bir dilin veya donanım üreticisinin kayan nokta matematiğini uygulanma şekli, sonuçlarda hafif dalgalanmalara neden olabilecek şekilde biraz farklı olabilir.

Bu nedenle, yazmadan önce bir bilgisayar programını 'ispatlamak', daha sonra programın donanımın olası her bir kombinasyonu için donanım düzeyinde, işletim sistemi düzeyinde, sürücü düzeyinde, programlama dili, derleyici, belki tercüman vb. akla gelebilecek şekilde çalıştırılabilir ve akla gelebilecek akla gelebilecek tüm veriler. Muhtemelen başarısızlığın milyarlarca dolarlık dolar ve potansiyel olarak pek çok kaybedilen hayat anlamına geldiği uzay görevlerinde, silah sistemlerinde veya nükleer güç kontrol sistemlerinde bu hazırlık ve anlayış seviyesini bulacaksınız.

'Her gün' programcınız ve / veya işiniz için, çoğunlukla doğru kodda belirli bir doğruluk seviyesini kabul etmek ve kullanılabilir bir ürün satmak, çok daha düşük maliyetlidir ve geliştiriciler, hatalar sırasında ortaya çıktıkları zaman geriye dönük olarak düzeltebilirler. kullanımı.


3
Matematiğin ne olduğuna dair dar bir görüşe ve bir bilgisayar programının neyi kanıtladığına dair çok geniş bir görüşe sahip görünüyorsunuz. Bir programın doğru olduğunu kanıtlamak için tüm sistemin doğru olduğunu kanıtlamanıza gerek yoktur, sadece diğer bileşenlerin özelliklerine uygun olduğunu varsaymanın doğru olduğunu kanıtlamanız gerekir . Olmazlarsa, programın hatası değildir. Öte yandan, eğer programınız bozulursa, söz konusu bileşenlerin özelliklerinin bir parçası olmayan ayrıntılara, örneğin IEEE754 uygulamalarının varyasyonlarına bağlı olması durumunda , bu sizin suçunuzdur.
Derek Elkins

Adil yorum. Muhtemelen bazı terminolojileri akademik geçmişim olarak yanlış kullanıyorum. Her ne kadar diğer bileşenlerin kusursuz olduğunu farz edersek, önceki yorumlarımdan dolayı yapılacak akıllıca bir şey değil.
navigator_

4

Mantığınızın geçerli olduğunu düşünüyorum, ancak girişiniz geçerli değil. Her ikisi de insanlar tarafından yazılmışsa, matematiksel kanıtlar programlardan daha fazla hataya dayanıklı değildir. Dijkstra zaten burada alıntı yapıldı, ancak ek bir teklif sunacağım.

Ancak, hesaplamaları, sınırlı yetkilerimizin, hesaplamanın istenen etkiyi oluşturacağını garanti etmek için yeterli olacak şekilde düzenlemeliyiz. Bu düzenleme programın kompozisyonunu içerir ve orada bir sonraki büyüklük problemi ile karşı karşıya kaldık, viz. program metninin uzunluğu ve bu sorunu açıkça belirtmemiz gerekir. Bir metni okuyabilmemiz veya yazabilmemizin boyutuna büyük ölçüde bağlı olduğunun farkında olmalıyız. [...]

Aynı ruh hali içinde, okuyucunun dikkatini “açıklık” ın nicel yönleri olduğunu, pek çok matematiğin merakla yeterince habersiz göründüğü gerçeğine vurgulamak istemem gerektiği şeklindedir. Koşulların tam olduğu 10 sayfa yerine getirildiğinde sonucun geçerliliğini belirten bir teorem, teoriye itiraz edildiğinde her koşulun doğrulanması gerektiği için pek uygun bir araçtır. Öklid geometrisinde, Pythagoras Teoremi, A, B ve C olmak üzere üç nokta için geçerlidir; öyle ki, A ve C aracılığıyla düz bir çizgi B ve C boyunca düz bir çizgiye dik olarak çizilebilir. veya A, B ve C noktalarının tümü çakışıyor mu? Yine de bu, Pisagor Teoreminin kullanılabileceği kolaylıktan büyük ölçüde sorumlu görünüyor.

Özetleme: yavaş çalışan bir insan olarak çok küçük bir kafam var ve onunla yaşamayı ve sınırlamalarıma saygı duymayı ve onları görmezden gelmeyi denemekten ziyade tam kredi vermeyi daha iyi öğrendim; başarısızlıkla cezalandırılır.

Bu, Dijkstra'nın Yapısal Programcılığının birinci bölümünden son üç paragrafta biraz düzenlenmiştir.

Bunu tekrar ifade etmek için, sorunuza daha iyi uygulamak için: doğruluk büyük ölçüde ispatınızın bir fonksiyonudur. Uzun matematiksel kanıtların doğruluğunu tespit etmek çok zordur (çok sayıda yayınlanmış “kanıt”, belirsizlik sınırında yaşar, çünkü kimse bunları doğrulamaz). Ancak, önemsiz programların doğruluğunu önemsiz kanıtlarla karşılaştırırsanız, muhtemelen gözle görülür bir fark yoktur. Bununla birlikte, otomatik prova asistanları (daha geniş anlamda, Java derleyiciniz de prova asistanıdır), programların çok sayıda temel çalışmayı otomatikleştirerek kazanmasını sağlar.


"Uzun matematiksel kanıtlar" ile neyi kastediyorsunuz? Grafik minör teoreminin ispatı oldukça uzundur, ancak kimse tarafından tartışılmaz. Feit-Thompson teoreminin oldukça uzun bir kanıtı var, ancak hiçbir zaman gerçekten limbo olmadı. Provaların ve programların uzunluklarını nasıl karşılaştırırsınız? Kelime sayısı? Benzer karmaşıklıktaki (uzunluk) provaları ve programları karşılaştırırken provalar ve programlar arasında gözle görülür bir fark yok mu?
Yuval Filmus

Tıpkı alıntıdaki gibi @YuvalFilmus: on sayfa iddiası insanlar için uzun. Bir programın uzunluğunu nasıl yargılayabilirim? Peki, Dikstra bir metrik sundu: metnin uzunluğu. Bunun çok basit olabileceğini düşünüyorum, ancak yine de iyi bir sezgisel. Örneğin, döngüsel karmaşıklık
wvxvw

3

Diğer cevapların cevaplarında değinildiği gibi (ayrıntılandırmak istiyorum), ancak sorunun büyük bir kısmı kütüphane kullanımıdır. Mükemmel belgelerle (hatasız kod kadar yaygın) bile, bir kütüphane hakkındaki tüm bilgileri kitaplığı kullanan her programcıya aktarmak mümkün değildir. Programcı kütüphanesini tam olarak anlamıyorsa, onu kullanırken hata yapabilir. Bazen bunlar, kod çalışmadığında keşfedilen kritik hatalara neden olabilir. Ancak küçük hatalar için bunlar farkedilmeyebilir.

Benzer bir durum, eğer bir matematikçinin var olan delilleri ve lemmaları tam olarak anlamadan kullanması; kendi kanıtları büyük olasılıkla hatalı olacaktır. Bu bir çözüm önerisi olsa da, kullandığı her kütüphaneyi mükemmel bir şekilde öğrenmek; bu pratikte çok zaman alıcıdır ve programcının sahip olmadığı alan bilgisini gerektirebilir. (DNA dizilimi / protein sentezi hakkında çok az şey biliyorum; ancak kütüphaneler kullanarak bu kavramlarla çalışabilirim).

Daha kısaca ifade etmek gerekirse, yazılım mühendisliği (genel olarak mühendislik) insanların uzmanlık alanlarındaki problemlerin daha küçük alanlarına odaklanmalarına izin vermek için farklı soyutlama seviyelerini kapsamaya dayanmaktadır. Her katman arasında. Bu iletişim mükemmel olmadığında sorunlara yol açar.


3
Bekle, sizi matematikçilerin kullandıkları delilleri ve lemmaları “tamamen anladığını” düşündüren nedir? Burada göstermeye çalıştığınız matematikçiler ve programcılar arasındaki farkın ne olduğundan emin değilim.
Derek Elkins,

3

Tüm bu harika cevaplardan sonra orjinal olmaya çalışacağım.

Programlar olan deliller

Curry-Howard İzomorfizma programınızda türleri teoremleri ve gerçek kod onların kanıtıdır, söyler.

Kuşkusuz, bu çok soyut ve üst düzey bir görüş. Muhtemelen, demek istediğim, tipik bir kod yazmanın zor olması çünkü çok düşük seviyeli oluyor. Çoğu durumda "makineye ne yapacağını söylemeniz gerekir". Veya buna başka bir yoldan bakmak için: matematikçiler soyutlamada gerçekten iyidirler.

Bir yan not olarak: "Akışların müziği" , ikisi arasındaki en güzel köprülerden biridir. Temelde "İstediğim söylemek mümkün kümeleri şeyler bu yer o şekilde" ve makine sihirli yapar bu istendiği gibi aynen.


Bu sorunun çözülüp çözülmediğini tam olarak göremiyorum. OP, güçlü tip sistemlerle programlama dilleri hakkında konuştuklarına dair herhangi bir gösterge vermedi ve bence daha genel tip sistemler anlamına geliyor. Yani Curry-Howard bu durumda biraz önemsiz.
6005

C ya da benzeri şeyler için biraz uzak olduğunu biliyorum. Ama benim açımdan: matematik tipik bir CS acemi düşünen daha yakın!
Oleg Lobachev

1
Sanırım cevabımı verdiğim Curry-Howards izomorfizminin “dikkatsiz bir gözlemcisi” gibi görünüyorsunuz. Programlar ve provalar arasında bir izomorfizme olsa bile, program yazma ve prova yazma eyleminin hiçbir şekilde benzer olduğu söylenemez. Aslında, tüm 'ilginç' veya 'tipik' programların tipik bir ispat ile uyuşmadığı ve bunun tersi geçerli olabilir.
Ayrık kertenkele

@Discretelizard Açıkçası, "ilginç" programların "tipik bir kanıt" ile uyuşmadığı durum değil. İşte birisinin "tipik kanıtını" aldığım ve inkar edilemez derecede ilginç bir programın (Gauss elemeli ile yakından ilgili bir şey) oluşturduğu bir örnek. Uygun şekilde kesin tiplerle donatılmış, çoğu "ilginç" programın faydalı lemmalar veya teoremler olacağını düşünüyorum, ancak birçok (yapıcı) ispatın gerçek bir hesaplama öneme sahip olmadığını - ancak çoğu zaman yan koşulları doğruladıklarını - sanıyorum.
Derek Elkins

3

Diğer birçok cevapların hiçbiri aşağıdakilere dikkat çekmiyor. Matematiksel kanıtlar, sonsuz belleğe ve sonsuz bilgi işlem gücüne sahip hayali bilgi işlem sistemlerinde çalışır. Bu nedenle, sınırsız hassasiyet için keyfi olarak büyük sayıları tutabilirler ve herhangi bir hesaplamada hassasiyetini kaybedebilirler.

π


2
"Matematiksel kanıtlar, sonsuz belleğe ve sonsuz bilgi işlem gücüne sahip hayali bilgi işlem sistemlerinde çalışır." Çoğu matematiksel kanıtlar, resmi cebirsel sistemler üzerinde “işlemektedir”, örneğin gerçek sayılar ('sonsuz hassasiyete sahibiz'). Bu programlarda da yapılabilir: tam olarak bunu yapan bilgisayar cebir sistemleri (CAS) var! Ayrıca, matematiğin tüm alanları, tüm gerçek sayıları tam olarak sonlu kayan nokta sayıları olarak temsil edemememiz olgusuyla ilgilidir. Bence matematik ile programlama olmadığı yerde bir ayrım yapıyorsunuz.
Ayrık kertenkele

1
@Discretelizard, evet, isteğe bağlı hassasiyetle özel paketler var, ancak o zaman bile mevcut bellek gerçek ulaşılabilir doğruluğu sınırlayacak. Ayrıca onlar özel paketlerdir. Bu tür paketlerle ve çoğunlukla akademik bir ortamda sadece küçük bir programlama oranı yapılır.
Crobar

π

@Discretelizard, benim açımdan hala geçerli olduğunu düşünüyorum, çoğu programcı bu CAS sistemlerini kullanmıyor. Gerçek dünyadaki programlama için çok yavaşlar. Çoğu programlama temelde sınırlı hassasiyetli sayılarla yapılan işlemleri içerir. En iyi diller C, C ++, Python, Java vb. Hiçbiri varsayılan olarak CAS stili gösterimini kullanmaz (bunun için paketler bunlarda oluşturulmuş olabilir). Örnek örneğiniz bilgisayar dillerinin / sistemlerinin küçük bir niş alt kümesidir.
15'te

2
@crobar Cevabınızdaki sorun, tespit edilen hataların büyük çoğunluğunun kayan nokta hataları veya tamsayı taşmalarından kaynaklanmamasıdır (bunlar iyi bir sayıya katkıda bulunur ve bu özellikler kesinlikle bir programın tam doğruluğunu çok daha olası hale getirmez). Bununla birlikte, matematikçilerin performans, pazara çıkma süresi, bakım kolaylığı ve çok zorlayıcı olduklarında gereksinimleri değiştirme konusunda sınırlı bir yetenek gibi programcıların kaygılarının pek çoğundan yoksun olduğunu daha genel iddiada bulunabilirsiniz.
Derek Elkins

3

Değil. Matematiksel kanıtlar tam olarak doğası gereği taşınır, sadece okuyucuları bir derleyiciden daha müsaade eder. Benzer şekilde, bir bilgisayar programının okuyucuları, en azından çalıştırmayı deneyene kadar, doğru olduğuna inanmaya kolayca kandırılır.

Örneğin, matematiksel bir kanıtı ZFC gibi resmi bir dile çevirmeye çalışırsak, aynı zamanda hataları da içerecektir. Çünkü bu ispatlar çok uzun sürebilir, bu yüzden ispatı oluşturmak için bir program yazmak zorunda kalıyoruz. Temel kanıtları resmileştirme konusunda aktif bir araştırma olmasına rağmen, çok az insan tehlikeye düşüyor.

Ve gerçekten, matematik BSOD alabilir! İlk defa olmazdı!

görüntü tanımını buraya girin

Yeterince doğrulanmış tüm matematiksel kanıtların temelde doğru olduğu veya doğru yapılabildiği bu ortodoks düşünce, işinizde yazılım projenizi motive eden aynıdır: özellikleri tamamlandı - kesin bir nihai ürüne götüren yinelemeli bir süreç.

İşte kapak tarafı. Bakın, biz zaten finanse ettik, işletme kavramını doğruladık, tüm belgeler okumanız için burada. Sadece yürütmeni istiyoruz ve bu kesin bir şey!

Hilbert için de üzülmeyelim , neye bulaştığını biliyordu. Bu sadece iş.

Gerçekten emin olmak istiyorsan, her şeyi duruma göre al ve kendi sonuçlarını çıkar!


3

Programların matematik kanıtlarından daha fazla hataya eğilimli olmasının iki önemli sebebi görüyorum:

1: Programlar, zaman içinde değişen değişkenler veya dinamik nesneler içerirken, provalardaki matematiksel nesneler normalde statiktir. Bu nedenle, matematikteki gösterim, programlarda işe yaramadığı yerlerde doğrudan muhakeme desteği olarak kullanılabilir (ve eğer a = b ise durum böyle kalır). Ayrıca, programların paralel olduğu veya birden fazla iş parçacığı olduğu durumlarda bu sorun daha da kötüleşir.

2: Matematik genellikle nispeten düzgün tanımlanmış nesneler (grafikler, manifoldlar, halkalar, gruplar, vb.) Varsaymaktadır; programlama ise çok dağınık ve oldukça düzensiz nesnelerle ilgilidir: sonlu hassas aritmetik, sonlu yığınlar, karakter-tamsayı dönüşümleri, işaretçiler, toplanması gereken çöpler , vb ... Doğrulukla ilgili koşulların toplanmasının akılda tutulması çok zordur.


3

İki farklı "kategoriyi" ayırt etmelisiniz:

  • sözde provalar (veya sözde kod) - kitaplarda gördüğünüz budur. Doğal dilde yazılmıştır (örneğin İngilizce). Matematik (veya Algoritmalar) öğrenmek için kullanmanız gereken şey budur.
  • resmi kanıtlar (veya resmi kod) - mekanik olarak doğrulanabilir (veya çalıştırılabilir) olması için kanıtınıza (veya koduna) ihtiyacınız olduğunda yazabilirsiniz. Bu temsil herhangi bir "insan zekası" gerektirmez. Önceden tanımlanmış bazı adımları izleyerek (genellikle bugün bilgisayarlar tarafından yapılır) mekanik olarak doğrulanabilir (veya çalıştırılabilir).

Binlerce yıldır sahte kod kullanıyoruz (örneğin, Euclids algoritması). Resmi kodların yazılması (C veya Java gibi resmi dillerde), bilgisayarların icadından sonra oldukça popüler ve faydalı oldu. Ancak, ne yazık ki, resmi ispatlar (Principia Mathematica veya Metamath gibi resmi dillerde) çok popüler değildir. Ve bugün herkes sözde ispatlar yazdığından, insanlar genellikle yeni ispatlar hakkında tartışırlar. Onları yanlışlar gerçek "kanıt" sonra yıllar, on yıl ya da hatta yüzyıllar bulunabilir.


3

Referansı bulamıyorum, ancak Tony Hoare'nin bir zamanlar aşağıdaki satırlar boyunca bir şeyler söylediğini düşünüyorum: Bir programı kontrol etmek ve bir kanıtı kontrol etmek arasındaki fark, bir kanıtın aynı anda iki satır kontrol edilebileceğidir.

Bir kelimeyle: yerellik.

Provalar kolayca kontrol edilebilmeleri için yazılmıştır. Programlar yürütülebilmeleri için yazılmıştır. Bu nedenle, programcılar genellikle programı kontrol eden biri için faydalı olacak bilgileri bırakır.

X'in salt okunur olduğu bu programı göz önünde bulundurun

    assume x >= 0
    p := 0 ;
    var pp := 0 ;
    while( x >= pp + 2*p + 1 ) 
    {
        var q := 1 ;
        var qq := q ;
        var pq := p ;
        while(  pp + 4*pq + 4*qq <= x )
        {
            q, pq, qq := 2*q, 2*pq, 4*qq ;
        }
        p, pp := p + q, pp + 2*pq + qq ;
    }
    assert  p*p <= x < (p+1)*(p+1)

Uygulaması kolaydır, ancak kontrol edilmesi zordur.

Ancak, eksik iddiaları tekrar eklersem, programı yerel olarak sadece her bir görev sırasının kendi ön ve son koşullarına göre doğru olup olmadığını kontrol ederek yerel olarak kontrol edebilirsiniz; değişmez ve döngü korumasının ihmali.

    assume x >= 0
    p := 0 ;
    var pp := 0 ; 
    while( x >= pp + 2*p + 1 ) 
        invariant p*p <= x 
        invariant pp == p*p
        decreases x-p*p 
    {
        var q := 1 ;
        var qq := q ; 
        var pq := p ; 
        while(  pp + 4*pq + 4*qq <= x )
            invariant (p+q)*(p+q) <= x
            invariant q > 0 
            invariant qq == q*q 
            invariant pq == p*q 
            decreases x-(p+q)*(p+q)
        {
            q, pq, qq := 2*q, 2*pq, 4*qq ;
        }
        assert (p+q)*(p+q) <= x and pp==p*p and pq==p*q and qq==q*q and q>0
        p, pp := p + q, pp + 2*pq + qq ;
    }
    assert  p*p <= x < (p+1)*(p+1)

Asıl soruya dönersek: Neden matematiksel kanıtları yazmak bilgisayar kodunu yazmaktan daha hatasızdır? Kanıtlar okurları tarafından kolayca kontrol edilmek üzere tasarlandığından, yazarlar tarafından kolayca kontrol edilir ve bu nedenle uyarıcı yazarlar, kanıtlarında mantıksal hatalar yapma (veya en azından tutma) eğilimindedir. Programladığımız zaman, kodumuzun doğru olmasının nedenini sık sık yazamıyoruz; Sonuç, hem okuyucuların hem de programın yazarının kodu kontrol etmesinin zor olması; Sonuç, yazarların hata yaptıkları (ve sonra sakladıkları).

Ama umut var. Bir program yazdığımızda, programın doğru olduğunu düşündüğümüz nedenini de yazarsak, kodu yazarken kontrol edebilir ve daha az hata kodu yazabiliriz. Bu aynı zamanda başkalarının kodumuzu okuyabilmesi ve kendileri için kontrol edebilmesi avantajına sahiptir.


2

Biz de daha zor olup olmadığını sorabilirsiniz pratikte , ya da ilke , kanıtları yazmak veya kod yazmak.

Uygulamada, kanıtlama kodlamadan daha zordur. İki yıl üniversite düzeyinde matematik almış olan çok az kişi ispat yazabilir, hatta önemsiz olanlar bile. İki yıl üniversite düzeyinde CS alan kişiler arasında, muhtemelen en az% 30'u FizzBuzz'ı çözebilir .

Fakat prensipte , bunun tersi olmasının temel nedenleri var. Kanıtlar, en azından prensipte, herhangi bir yargılama veya herhangi bir anlama gerektirmeyen bir süreç aracılığıyla doğruluk açısından kontrol edilebilir. Programlar yapamaz - önceden belirlenmiş bir işlemle bir programın durup durmayacağını bile söyleyemeyiz.


3
Üniversite düzeyinde matematik İki yıl provaları yazma (veya harcama odaklanmış iki yıl anlamına gelmez herhangi kanıtları yazma süresi). Yani, benim izlenimim orta / erken lise geometri sınıfları provalar vardır için ortak olmasıdır, böylece görünüşte biz olabilir hatta 13 yaşındakiler üzerinde eğitimin az bir öğretim yılı ile basit kanıtları yazabilmek için bekliyoruz konu. Adım adım cebirsel hesaplamalar da esasen kanıtıdır. Bence programlama için çok düşük ve çok yüksek olduğunu kanıtlamak için "önemsiz" için çıtayı yerleştiriyorsunuz.
Derek Elkins

3
Programları aynı şekilde yazabiliriz. Yazdığınız her fonksiyonun / prosedürün resmi bir spesifikasyon sağlaması ve şartnameyi karşıladığına dair bir kanıt (Coq, örneğin) sunması şartını hayal edebilirsiniz. Bu doğruluğu kanıtlamak için yargılama veya herhangi bir anlama gerektirmeyen bir şekilde kontrol etmenin yolları vardır.
DW

@DW: (1) İstenilen davranışın her durumda tam olarak belirtilebileceğini varsayıyorsunuz, (2) gerekli kanıtın mevcut olduğunu (yani, sorun tespit edilemez değil) ve (3) kanıt varsa onu bulabilirim. Bence, bu varsayımların üçünün de en azından bazı durumlarda (muhtemelen hemen hemen tüm vakalarda) yanlış olduğunu düşünüyorum. Re 3, bazı kanıtların kolay olmasına rağmen, birçok kanıtın bulunmasının çok zor olduğunu unutmayın.
Ben Crowell,

@DerekElkins: Çok az üniversite öğrencisinin önemsiz deliller bile yazabileceği iddiası, öğrencilerimle olan deneyimlerime dayanıyor. Burası bir topluluk kolejinde, yani YMMV. Bazı lise geometrisi sınıflarının ağır dozda kanıt yazma içermesi gerçeği, tüm üniversite öğrencilerinin kanıt yazabileceği gerçeğine dönüşmez. Ayrıca, temel cebir yapmayı da bilmeleri gerekiyor, ama benim okulumda kabaca birinci sınıf öğrencisi öğrencilerin yarısı bunu yapamıyor - bu da çoğu kişinin neden başarısız olduğunu açıklamaya yardımcı oluyor.
Ben Crowell,

Bu, cevabı eklemek, programın doğruluğunu kontrol etmek için neden aynı yaklaşımı yapamayacağınızı açıklamak için iyi bir açıklama olacaktır. Genellikle (2) ve (3) nadiren bir sorun (eğer kadar farklı bir şekilde yazma, program doğru ispat edemez ise antrenmanlarda veya prensipte ya edebilirsiniz doğru kanıtlamak). Ancak sizin (1) olan önemli bir nokta, ve bunun biz provaları için olduğu gibi zor programlar için aynı şeyi yapmak için yapar niçin cevabını güçlendirecektir düşünüyorum.
DW

2

Doğru olan matematiksel ifadelerin sadece küçük bir kısmı pratik olarak kanıtlanabilir. Daha da önemlisi, tüm gerçek ifadelerin kanıtlanmasına izin verecek önemsiz (*) bir matematiksel aksiyom dizisi oluşturmak imkansız olurdu. Bilgisayarlarla yapılabilecek şeylerin çok küçük bir kısmını yapmak için programlar yazması gerekirse, kesin olarak doğru bir yazılım yazmak mümkün olabilir, ancak bilgisayarlar genellikle doğru olarak doğru olanın ötesinde şeyler yapmak için çağrılır. yazılımı başarabilir.

(*) Tüm gerçek ifadelerin numaralandırılmasına ve böylece ispatlanmasına izin verecek bir aksiyom tanımlamak mümkündür, ancak bunlar genellikle çok ilginç değildir. Aksiyom gruplarını, göreceli olarak konuşmayan, önemsiz olanlara biçimsel olarak kategorize etmek mümkün olsa da, kilit nokta, doğru olan ancak kanıtlanamayan ifadelerin kanıtlanabilir varlığının bir küme içindeki kusur olmadığıdır. Aksiyomların Var olan gerçek ancak kanıtlanamayan tüm ifadeleri kanıtlanabilir kılmak için aksiyom eklemek, diğer ifadelerin gerçek olmasına neden olur, ancak kanıtlanamaz.


1
“Doğru olan matematiksel ifadelerin sadece küçük bir kısmı pratikte kanıtlanabilir.” - "Porsiyon" u nasıl ölçüyorsun? Bu bir olasılık dağılımı altında mı? Bu açıklamayı destekleyecek kanıtın var mı?
DW

“Bilgisayarlar genellikle doğru olarak doğru olan yazılımların yapabilecekleri aralığının ötesinde şeyler yapmaya çağrılır.” - Bunun için bir kanıtın var mı? Bir örnek var mı "Prensipte doğru olarak neyin kanıtlanabileceğinin ötesinde" veya "pratikte kanıtlamayı makul bir şekilde hayal edebileceğimizin ötesinde" mi iddia ediyorsunuz?
DW

@DW: Eğer X ve Y, doğru ancak ispatlanamayan ortogonal ifadeler ise, ispatlanabilir her P ifadesi için, en az iki ortogonal ifade (P ve X) ve (P ve Y) doğru olan ancak olmayan -provable. Sonsuz kümelerle uğraşırken, bu tür bir mantık mutlaka bir şey kanıtlamaz, çünkü tek bir tamsayıdan iki kat daha fazla tamsayı bulunduğunu göstermek için benzer bir mantık kullanabilir, çünkü her tek tamsayı için iki çift tamsayı tanımlayabilir (4x) ve (4x + 2) diğer garip tam sayılarla ilişkili değil, fakat elbette ve garip tam sayıların eşit derecede önemli olduğu bile.
supercat

@DW: "Küçük porsiyon" ibaresi bu nedenle, pratik olarak kanıtlanabilecek gerçek ifadelerin kesirini tarif etmede yalnızca gerçekten anlamlı olabilir, ancak tüm gerçek ifadelerin ispatlanamamasının "kusur" olmadığını anlamanın faydalı olduğunu düşünüyorum. Bilgisayarlara gelince, birçok alan rutin olarak son derece küçük, ancak sıfır olmayan bir başarısızlık olasılığı olan algoritmaları kullanır ve ardından bunları olasılık olarak kabul edilebilir şekilde düşük olacak şekilde ayarlar (örneğin bir meteor tarafından kullanılan ekipmanın altında). Birçok durumda, çeşitli arıza modları bağımsız değildir, bu yüzden esasen imkansız olabilir ...
supercat

... farklı başarısızlık kombinasyonlarının olasılıklarını belirlemek. Eğer bir dakikalık isteğe bağlı bir hata sırasındaki başarısızlık olasılığını 10 ^ -500'de bir olarak tahmin ederse, biri yüzlerce büyüklük sırasına göre kapatılabilir ve yine de güvenilir bir sisteme sahip olabilir, ancak biri 494 büyüklük sırasına düşerse Sistem her birkaç yılda bir başarısızlıkla sonuçlanır.
supercat

2
  1. Bilgisayar programları gerçek dünyada test edilir. Sadece sınırlı sayıda insanın anlayabildiği, uzun bir matematiksel kanıtla ilgili zor bir teknik hata, tespit edilmeden kalma şansına sahiptir. Bir yazılım ürününde aynı türde bir hata olması, sıradan kullanıcıların farkettiği garip davranışlar yaratır. Öyleyse öncül doğru olmayabilir.

  2. Bilgisayar programları faydalı gerçek dünya fonksiyonlarını yerine getirir. Bunu yapmak için% 100 doğru olmaları gerekmez ve yüksek doğruluk standartları oldukça pahalıdır. Kanıtlar yalnızca bir şeyi ispatlarsa faydalıdır, bu nedenle '% 100 doğru' kısmını atlamak matematikçiler için bir seçenek değildir.

  3. Matematiksel kanıtlar açıkça tanımlanmıştır. Bir kanıtın hatalı olması durumunda, yazar bir hata yapmıştır. Gereksinimler doğru bir şekilde iletilmediğinden veya programcının hiç duymadığı bir şeyle uyumluluk sorunu olduğu için bilgisayar programlarındaki birçok hata ortaya çıkar.

  4. Birçok bilgisayar programının doğru olduğu kanıtlanamaz. Yüzleri tanımak gibi gayri resmi olarak tanımlanan sorunları çözebilirler. Ya da borsa tahmin yazılımı gibi olabilirler ve resmi olarak tanımlanmış bir hedefleri olabilir ama çok fazla gerçek dünya değişkenini içerirler.


2

Bir insan etkinliği olarak matematiğin büyük bir kısmı, kanıtların doğrulanmasının bir insan için yapması kolay olan alana özgü dillerin geliştirilmesi olmuştur.

Bir ispatın kalitesi, uzunluğu ve karmaşıklığı ile ters orantılıdır. Uzunluk ve karmaşıklık, ele aldığımız durumu açıklamak için iyi bir gösterim geliştirerek ve söz konusu kanıtla etkileşim içinde olan yardımcı kavramlarla birlikte, genellikle azalır.

Bu kolay bir süreç değildir ve araştırmanın ön planından çıkarılmış kişilerin şahit olduğu kanıtların çoğu, binlerce yıl olmasa da, o alanın gösteriminin yapıldığı matematiksel alanlarda (cebir ve analiz gibi) gerçekleşir. kanıtları bir yere yazma eyleminin bir esinti gibi hissettirdiği noktaya getirildi.

Yine de araştırmanın ön saflarında, özellikle iyi kurulmuş veya iyi tanımlanmış notalara sahip alanlarda olmayan problemler üzerinde çalışıyorsanız, doğru bir kanıt yazmanın bile doğru bir program yazma zorluğuna yaklaştığını iddia ediyorum. Bunun nedeni aynı zamanda bir programlama dili tasarımının analoğunu yazmanız, sinir ağınızı doğru bir şekilde derlemesi için eğitmeniz, bunun ispatını yazmayı denemeniz, hafızanızın tükenmesi, dili iyileştirmeye çalışmanızdır. beyninizi dili öğrenerek yineleyin, ispatı tekrar yazın, vb.

Yinelemek gerekirse, doğru kanıtlar yazmanın, matematiğin belirli alanlarına doğru programlar yazmanın zorluğuna yaklaşabileceğini düşünüyorum, ancak matematiğin ilerleyişi kavramı, kanıtlamanın kolaylığına yakından bağlı olduğu için mutlaka genç ve az gelişmişlerdir. doğrulama.

Yapmak istediğim noktayı ifade etmenin bir başka yolu da, hem programlama dillerinin hem de matematiğin tasarlanan günün sonunda olması ve böylece bilgisayar programlarının ve ispatlarının derlenmesi mümkün olması. Sadece bir bilgisayar programını derlemek bir bilgisayarda yapılır ve genellikle programın doğruluğu ile ilgisi çok az olan sözdizimsel doğruluğu sağlarken, "derlemek" bir kanıtı bir insan tarafından yapılır ve aynı şey olan sözdizimsel doğruluğu sağlar. ispatın doğruluğu.


1

Dürüst olmak gerekirse, burada elma ve portakalları karşılaştırıyorsunuz. Hataya dayanıklı ve hatasız aynı şey değil.

Bir program numaralarını karşılaştırır ederse 2ve 3ve diyor 2 is greater than 3, o zaman çünkü bir arabası uygulamasının olabilir:

# Buggy implementation
function is_a_greater_than_b(a,b):
  return b > a

Program yine de hatasız. İki sayıyı karşılaştırarak ave b, her zaman b, büyük olandan büyük olup olmadığını size söyleyebilecek a. Bu, sizden (programlayıcı) bilgisayardan yapmasını istemeniz gereken şey değil.


2
O zaman bir programdaki "hata" tanımınız nedir?
user56834

0

a) Çünkü bilgisayar programları matematik kanıtlarından daha büyüktür.

a.1) Karmaşık bilgisayar programı yazarken matematik kanıt yazmadan daha fazla insanın kullanıldığına inanıyorum. Bu, hata payının daha yüksek olduğu anlamına gelir.

b) CEO'lar / Hissedarlar küçük hataları düzeltmekten çok paraya önem verdiğinden, bu arada (geliştirici olarak) bazı gereksinimleri / son teslim tarihlerini / demolarını yerine getirmek için görevlerinizi yapmanız gerekir.

c) Çünkü, bilgisayar bilimlerinde "derin" bilgiye sahip olmadan programcı olabilirsiniz, bu arada matematikte yapmak zor olurdu (inanıyorum)

Bunlara ek olarak:

NASA:

Bu yazılım hatasızdır. Mükemmeldir, insanların elde ettiği kadar mükemmel. Bu istatistikleri göz önünde bulundurun: Programın son üç versiyonu - her biri 420.000 satır uzunluğunda - her biri yalnızca bir hatayla karşılaştı. Bu yazılımın son 11 sürümü toplam 17 hata vardı.

Mekiğin, programın yalnızca% 1,5'ini veya 6,366 kod satırını içeren bir Global Konumlandırma Uydularında gezinmesine izin vermek için yazılımı yükseltin. Bu değişikliğin teknik özellikleri, bir telefon rehberinden daha kalın olan 2.500 sayfadır. Mevcut programın teknik özellikleri 30 cilt dolduruyor ve 40.000 sayfa yayınlıyor.

https://www.fastcompany.com/28121/they-write-right-stuff


“bilgisayar programları matematik provalarından daha büyüktür” Bu programa ve ispata bağlıdır. Ve bunların çoğu spekülatif görünüyor.
David Richerby

@DavidRicherby peki Son fermat teoremi ve NASA'nın Apollo'su Apollo github.com/chrislgarry/Apollo-11 math.wisc.edu/~boston/869.pdf gibi şeyler aklımdaydı ve hatta işletim sistemleri hakkında konuşmuyoruz.
Exeus

0

Temel Seviyeler:

Her şeye en basit ve en temel düzeyde bakalım.

Matematik için biz var:
2 + 3 = 5

Bunu çok çok gençken öğrendim. En temel öğelere bakabilirim: iki nesne ve üç nesne. Harika.

Bilgisayar programlaması için çoğu insan yüksek seviyede bir dil kullanma eğilimindedir. Bazı yüksek seviyeli diller, C gibi daha düşük üst seviyeli dillerden birine "derlenebilir", daha sonra C, daha sonra Assembly diline çevrilebilir. Assembly dili daha sonra makine koduna dönüştürülür. Pek çok insan, karmaşıklığın orada biteceğini düşünüyor, ancak yapmıyor: Modern CPU'lar makine kodunu talimat olarak alıyor, ancak daha sonra bu talimatları uygulamak için "mikro kodu" çalıştırıyor.

Bunun anlamı, en temel seviyede (en basit yapılarla uğraşıyoruz), şimdi donanıma gömülü olan ve çoğu programcının doğrudan kullanmadığı ya da güncellemediği mikro-kod ile uğraşıyoruz. Aslında, çoğu programcı mikro koda (mikro koddan 0 seviyeden yüksek) dokunmaz, çoğu programcı makine koduna (mikro koddan 1 seviyeden yüksek) ve hatta Meclis'e (mikro koddan 2 seviyeden yüksek) dokunmaz. (belki de, kolej sırasında bir miktar örgün eğitim hariç). Çoğu programcı sadece 3 veya daha fazla seviye için zaman harcar.

Dahası, eğer Meclis'e bakarsanız (ki insanlar genelde normalde olduğu kadar düşük), her bir adım genellikle eğitilmiş ve bu adımı yorumlayacak kaynaklara sahip kişilerce anlaşılabilir. Bu anlamda, Meclis, üst düzey bir dilden çok daha basittir. Bununla birlikte, Meclis o kadar basittir ki, karmaşık görevlerin ve hatta vasat görevlerin yerine getirilmesi çok zahmetlidir. Üst seviye diller bizi ondan kurtarıyor.

"Tersine mühendislik" ile ilgili bir yasada, bir yargıç, teorik olarak her defasında bir bayt ele alınsa bile, modern programların milyonlarca bayt içerdiğini, bu nedenle bazı kayıtlar (kod kopyaları gibi) yapılması gerektiğini açıkladı. uygulanabilir olma çabası. (Bu nedenle, içsel gelişme, genelleştirilmiş "kopya çıkarmamak" telif hakkı yasası kuralına aykırı sayılmadı.) (Muhtemelen izinsiz Sega Genesis kartuşları yapmayı düşünüyorum, ancak Game Genie davasında söylenen bir şeyi düşünüyor olabilirim. )

modernizasyon:

286'lara yönelik kodlar kullanıyor musunuz? Yoksa 64 bit kod mu çalıştırıyorsunuz?

Matematik binlerce yıllara kadar uzanan temelleri kullanır. Bilgisayarlarla, insanlar genellikle yirmi yıllık bir işe yatırım yapmayı düşüncesizce boşa harcarlar. Bu, Matematik'in çok daha ayrıntılı bir şekilde test edilebileceği anlamına gelir.

Kullanılan Araçlar Standartları:

Bana (benden daha resmi bilgisayar programlama eğitimi almış bir arkadaş tarafından) C spesifikasyonlarını karşılayan hatasız bir C derleyicisi diye bir şeyin olmadığı öğretildi. Bunun nedeni, C dilinin temel olarak bir yığın amacı için sonsuz bellek kullanma olasılığını varsaymasıdır. Açıkçası, böyle imkansız bir gereklilik, insanlar doğada biraz daha sınırlı olan gerçek makinelerle çalışan kullanılabilir derleyicileri yapmaya çalıştıklarında sapmak zorunda kaldılar.

Uygulamada, Windows Komut Dosyası Sistemi'ndeki JScript ile nesneleri kullanarak çok iyi şeyler başarabildiğimi öğrendim. (Yeni kod denemek için gereken araç seti Microsoft Windows'un modern sürümlerine yerleştirildiği için çevreyi seviyorum.) Bu ortamı kullanırken, bazen nesnenin nasıl çalıştığıyla ilgili kolayca ulaşılabilecek bir belge bulunmadığını gördüm. Ancak, nesneyi kullanmak o kadar faydalı ki, yine de yapıyorum. Öyleyse benim yaptığım şey, eşek arısı yuvası gibi görünen bir kod yazıp, etkilerini görebileceğim ve nesnenin etkileşime girerken nesnenin davranışları hakkında bilgi edebileceğim güzel bir sanal alanda.

Diğer durumlarda, bazen yalnızca bir nesnenin nasıl davrandığını belirledikten sonra, nesnenin (işletim sistemi ile birlikte gelen) bir hata olduğunu ve Microsoft'un kasıtlı olarak düzeltilmemeye karar verdiğinin bilinen bir sorun olduğunu buldum. .

Bu gibi senaryolarda, programlı olarak yeni sürümler yaratan usta programcılar tarafından yaratılan OpenBSD'ye (yılda iki kez) düzenli olarak (yılda iki kez), 10+ yıldaki "sadece iki uzak delik" ünlü bir güvenlik kaydıyla güveniyor muyum? (Hatta daha az ciddi sorunlar için hatalı yamaları var.) Hayır, hiçbir şekilde. Bu kadar yüksek kalitede böyle bir ürüne güvenmiyorum, çünkü insanlara Microsoft Windows kullanan makineler tedarik eden işletmelere destek veren bir işletme için çalışıyorum, bu yüzden kodumun üzerinde çalışması gerekiyor.

Uygulanabilirlik / kullanılabilirlik, insanların yararlı bulduğu platformlar üzerinde çalışmamı gerektiriyor ve bu, güvenlik açısından son derece kötü bir platform (aynı şirketin ürünlerinin çok daha kötü olduğu bin yılın başlarında büyük gelişmeler olsa bile) .

özet

Bilgisayar programlamanın hataya daha yatkın olmasının ve bilgisayar kullanıcıları topluluğu tarafından kabul edilmesinin sayısız nedeni vardır. Aslında, çoğu kod, hatasız çabalara tolerans göstermeyecek ortamlarda yazılmıştır. (Güvenlik protokolleri geliştirmek gibi bazı istisnalar, bu konuda biraz daha fazla çaba gösterebilir.) Daha fazla para yatırmak istemeyen işletmelerin ve müşterileri mutlu etmek için suni son başvuru tarihlerini kaçırmanın sebeplerinin genel olarak düşünüldüğü gibi, bunun etkisi de vardır. Çok fazla zaman harcıyorsanız, eski bir platformda çalışacağınızı söyleyen teknoloji yürüyüşü, çünkü işler on yıl içinde önemli ölçüde değişiyor.

Sonuç olarak, strlen ve strcpy için bazı kaynak kodları gördüğümde, bazı çok kullanışlı ve popüler fonksiyonların ne kadar kısa olduğuna şaşırdığımı hatırlayabilirim. Örneğin, strlen "int strlen (char * x) {char y = x; while ( (y ++)); return (yx) -1;}" gibi bir şey olabilirdi

Ancak, tipik bilgisayar programları bundan daha uzundur. Ayrıca, pek çok modern programlama, daha az kapsamlı bir şekilde test edilebilecek, hatta buggy olarak bilinen başka bir kod kullanacaktır. Günümüzün sistemleri, kolayca düşünülebileceklerinden çok daha ayrıntılıdır, ancak daha düşük seviyelerde ele alınan ayrıntılar gibi çok sayıda minutinin el sallanması dışında.

Bu zorunlu karmaşıklık ve karmaşık ve hatta yanlış sistemlerle çalışmanın kesinliği, bilgisayar programlamasını, işlerin çok daha basit seviyelere düşme eğiliminde olduğu birçok matematikten daha doğrulamak için çok fazla donanım yapar.

Matematiğin içindeki şeyleri parçaladığınızda, çocukların anlayabileceği bireysel parçalara ulaşırsınız. Çoğu insan matematiğe güvenir; en azından temel aritmetik (veya en azından sayma).

Başlık altında neler olup bittiğini görmek için bilgisayar programlamayı gerçekten parçaladığınızda, sonuçta elektronik olarak yürütülen standartların ve kodların kırılmış uygulamalarına son verirsiniz ve bu fiziksel uygulama, üniversite eğitimi almış çoğu bilgisayar bilimcisinin sahip olduğu mikro kodun sadece bir adım altındadır. dokunmaya cesaret edemiyorsanız (eğer farkındalarsa bile).

Üniversitedeki bazı programcılar veya son zamanlarda mezun olan öğrencilerle, hatasız kodun yazılabileceği fikrine itiraz ediyorum. Olasılığı yazdılar ve bazı etkileyici örneklerin (gösterebildiğim) bazı ikna edici argümanlar olduğunu kabul etseler de, bu tür örneklerin temsili nadir rastgele şanslar olduğunu düşünüyorlar ve yine de sayma ihtimalini reddettiler böyle yüksek standartlara sahip üzerinde. (Matematikte gördüğümüz çok daha güvenilir bir temelden çok, çok farklı bir tutum.)


1
Programlamanın karmaşıklığı için iyi bir durum olsa da, matematiği zar zor düşünürsünüz! Aslında, resmi matematiğin içerdiği karmaşıklığı hafife alıyor gibi görünüyorsunuz: "Matematiği parçaladığınızda, çocukların anlayabileceği bireysel parçalara ulaşıyorsunuz", gerçekten ? Bunun yanında, yeterince 'üst düzey' programlama için de söylenebilir (örn. Scratch çocuklar için tasarlanmıştır). Ayrıca, tüm C spesifikasyonlarının uygulanamasına rağmen, önemli bir altkümeyi destekleyen bir derleyicinin bilgisayar destekli provaları kullanarak resmen doğru olduğunu göstermiştir.
Ayrık kertenkele

2+3=5

Meta not: eğer bir konuda uzmansanız ve bir başkasında uzman bir acemi (veya daha düşük) iseniz , ikisini karşılaştırmak için mümkün olan en kötü durumdasınız.
Raphael

Ayrık kertenkele - bu, Computer Science SE'dir. Ayrıca, göndermeden önce diğer cevapları okuduktan sonra, matematikten bilgisayarlardan çok daha fazla etki ettiklerini hissettim. Cevabımın, başka bir yerde yazılmış olanlara büyük ölçüde gereksiz olacak sözcükler eklemeyi daha uzun sürmeyerek daha iyi olduğunu hissettim. /// Scratch'a gelince, yüksek seviye daha karmaşık, daha basit değil (tüm hareketli parçaları tam olarak anlama perspektifine bakarken). Yazdığım bu bakış açısı ile Meclis, diğer katmanların üstündeki Scratch'ten daha basit (henüz elektronik NAND kapıları daha basit)
TOOGAM

0

Matematiksel kanıtlar “ne” bilgisini ve programlarını “nasıl“ bilgiyi ”tarif eder.

Program yazmak, programcının ortaya çıkabilecek farklı durumları ve programın davranışının sonuç olarak nasıl değiştiğini düşünmesi gerektiğinden daha karmaşıktır. Kanıtlar, diğer tanımlamalar hakkında bir şeyler kanıtlamak için formül veya kategorik akıl yürütmeyi kullanır.

Hataların çoğu, programcının öngörmediği durumlara giren süreçlerden kaynaklanır. Bir programda genellikle binlerce veya büyük bir sistemde, statik veri olmayan, ancak aslında programın çalışma şeklini değiştiren milyonlarca olası değişken vardır. Bütün bunlar birlikte etkileşim, özellikle altınızda değişen soyutlama katmanlarının olduğu modern bir bilgisayarda önceden görülmesi imkansız olan davranışlar yaratır.

Bir kanıt olarak, değişen bir durum yoktur. Tartışmanın tanımları ve nesneleri sabittir. Kanıtlamak genel olarak problemi düşünmeyi ve birçok vakayı dikkate almayı gerektirir, ancak bu davalar tanımlarla belirlenir.


2
Matematiksel kanıtların “ne” bilgisini tanımlayabildiğini söyleyebilirim: örneğin, varlığını kanıtlamak için bir örnek ya da bir değeri hesaplamak için bir yöntem oluşturan herhangi bir kanıtı alın. Yine de, devletin, yazarın (ya da okuyucunun!) Açıkça tanımlamasından başka bir devlet olmadığı anlamında, ispatlarda bulunmayan bir şey olduğuna katılıyorum. Tam da bu, bir programın okuyucunun / yazarın haberi olmadığı bir şeyi yapmasına izin verirken, bunun kanıtı imkansız olduğu durumdur. (elbette, kanıtların istenmeyen özellikleri veya sonuçları olabilir, ancak bunları almak için hala gerekli olan bazı aktif düşünce vardır)
Ayrık kertenkele

@Discretelizard Bu yararlı bir yorumdur. "Ne" ile "Nasıl" arasındaki çizginin kesinlikle bulanık olduğunu düşünüyorum. Bir algoritmayı kanıtlamak, düşündüğünüzü yapar, gerçekten aklımda "nasıl yapıldığını" tanımlamaz, onun sadece belirli özelliklere sahip olduğunu garanti eder. Felsefi bir bakış açısıyla, bilginin “nasıl yapılır” olduğunu dünyayla yazışma gerektirdiğini düşünüyorum. Programlar her zaman onlara söylediklerinizi yapar. Bir böceğiniz olduğunda, söylediğiniz şey dünya ile uyuşmuyordu (modellediğiniz şey). Matematik, bir uygulamadan bağımsız (fizik problemleri gibi) hepsi tutarlılığa bağlı görünüyor.
Justin Meiners,
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.