Özetle : Algoritma, verilen bir sorunun çözümü olduğunu gösteren yapıcı bir kanıtın yapıcı parçasıdır. Bu tanımın motivasyonu, bir programın yalnızca bir sorunu çözdüğü, ancak kanıtlanabileceği şekilde bir ilgisinin olduğunu göz önünde bulundurarak, programlar ve kanıt arasındaki Curry-Howard izomorfizmidir. Bu tanım daha fazla soyutlamaya izin verir ve endişe duyabileceğiniz alanların türüne ilişkin bazı kapıları açık bırakır, örneğin sonluk özellikleri gibi.
Uyarı . Soruyu cevaplamak için uygun resmi bir yaklaşım bulmaya çalışıyorum. Gerekli olduğunu düşünüyorum, ancak şimdiye kadar cevap veren kullanıcıların hiçbiri (kendim dahil ve bazıları diğer yayınlarda bu konuda az ya da çok açık), düzgün bir şekilde ilgili sorunları geliştirmek için doğru arka plana sahip gibi görünüyor. yapıcı matematik, ispat teorisi, tip teorisi ve ispat ve programlar arasındaki Curry-Howard izomorfizmi gibi sonuçlar . Burada elimden gelenin en iyisini yapıyorum, sahip olduğum (inandığım) bilgi parçacıklarıyla ve bu cevabın sınırlamalarının çok farkındayım. Sadece cevabın nasıl görünmesi gerektiğini düşündüğüm hakkında bazı ipuçları vermeyi umuyorum. Resmi olarak (muhtemelen) açıkça yanlış olan herhangi bir nokta görürseniz, lütfen bana bir yorumda veya e-posta ile bildirin.
Bazı sorunları belirleme
Bir algoritmayı dikkate almanın standart bir yolu, bir algoritmanın bellekte hiçbir sınırlaması olmayanlar da dahil olmak üzere bazı bilgi işlem aygıtları için rasgele, sonlu bir program olduğunu belirtmektir. Dil, bilgisayar makine dili de olabilir. Aslında bir Turing tam bilgi işlem cihazı için tüm programları göz önünde bulundurmak yeterlidir (bu, bellek sınırlaması olmadığı anlamına gelir). Her şeyin bazı kodlamaya kadar tanımlandığı için, algoritmaların yorum bağlamındaki ayrıntılarına bağımlı bir biçimde ifade edilmesi gerektiği için, tüm algoritmalar sunumlarını vermeyebilir. Ancak, hesaplanacak her şeyi hesaplayacağı için, kodlamaya kadar bir şekilde tüm algoritmaları içerecektir.
π
πMuhtemelen neredeyse hepsinin matematiksel anlamında. Ancak bu, tanımlarda daha fazla hassasiyet gerektirecektir.
Yani asıl soru anlamlı algoritmaların ne olduğunu bilmek. Cevap, anlamlı algoritmaları bir problemi çözenlerdir, adım adım “çözüm”, “cevap” bu problemi hesaplarlar. Bir algoritma çözdüğü bir sorunla ilişkiliyse ilginçtir.
Bu yüzden resmi bir problem verildiğinde problemi çözen bir algoritma nasıl elde edilir. Açık ya da dolaylı olarak, algoritmalar, soruna doğru olarak kanıtlanabilecek bir çözüm olduğu fikri ile ilişkilidir. İspat tekniklerimizin doğru olup olmadığı başka bir konudur, ancak en azından kendimizi ikna etmeye çalışıyoruz. Kendinizi yapmamız gereken matematik olan yapıcı matematikle sınırlandırırsanız (ve matematiğin çoğu için çok kabul edilebilir bir aksiyomatik kısıtlama), bir çözümün varlığını kanıtlamanın yolu, aslında bir yapı sergileyen kanıt adımlarından geçmektir. çözümü doğrulayan diğer adımlar da dahil olmak üzere çözümü temsil eder.
Tüm programcılar şöyle bir şey düşünür: Verilerle böyle ve böyle bir şekilde uğraşırsam, Susam teoremi nedeniyle sadece doğru özelliklere sahip olan bu widget'ı alıyorum ve bu foo-koruyucu dönüşümü çalıştırarak istenen cevabı alıyorum . Ancak kanıt genellikle gayri resmi ve tüm ayrıntılar üzerinde çalışmıyoruz, bu da bir uydunun neden Mars'ın yeraltında yörüngesinde kalmaya çalıştığını açıklıyor (diğer şeylerin yanı sıra). Akıl yürütmenin çoğunu yapıyoruz, ancak aslında sadece çözümü oluşturan yapıcı kısmı koruyoruz ve bunu bilgisayar dilinde sorunu çözen algoritma olarak tanımlıyoruz.
İlginç algoritmalar (veya programlar)
Bütün bunlar, şu anki araştırmanın konusu olan (uzman olmadığım) aşağıdaki fikirleri tanıtmaktı. Burada kullanılan " ilginç algoritma " kavramı benimkidir, daha doğru tanımlar için gayri resmi bir yer tutucu olarak tanıtılmıştır.
İlginç bir algoritma, verilen bir sorunun bir çözümü olduğuna dair yapıcı bir kanıtın yapıcı parçasıdır . Bu, kanıtın varlığını kanıtlamaktan ziyade, örneğin çelişkiyle çözümü sergilemesi gerektiği anlamına gelir. Daha fazla ayrıntı için bkz . Matematikte Sezgisel Mantık ve Yapılandırmacılık .
Bu, elbette, yalnızca ilginç algoritmalar dediğim şeyi dikkate alan çok kısıtlayıcı bir tanımdır. Yani neredeyse hepsini görmezden geliyor. Ancak algoritma üzerine tüm ders kitaplarımız da öyle. Sadece ilginç olanlardan bazılarını öğretmeye çalışıyorlar.
Sorunun tüm parametreleri (giriş verileri) göz önüne alındığında, belirli bir sonucun adım adım nasıl elde edileceğini anlatır. Tipik bir örnek denklemlerin çözümlenmesidir (isim algoritması aslında bazı denklemlerin çözümlemesini inceleyen Farsça bir matematikçi Muḥammad ibn Mūsā al-Khwārizmī'in adından türetilmiştir ). İspatın bölümleri, algoritmada hesaplanan bazı değerlerin bazı özelliklere sahip olduğunu saptamak için kullanılır, ancak bu parçaların algoritmanın kendisinde tutulması gerekmez.
Elbette bu, hesaplanan verilerin ne olduğunu, izin verilen temel hesaplama adımlarının neler olduğunu ve kullanılan aksiyomların ne olduğunu belirleyen resmi bir mantıksal çerçeve içinde gerçekleşmelidir.
Faktöriyel örneğinize geri dönersek, önemsiz de olsa bir algoritma olarak yorumlanabilir. Normal faktöriyel fonksiyon, bazı aritmetik çerçeve verildiğinde ve n tamsayısı verildiğinde, ilk n tamsayıların çarpımı olan bir sayı olduğu kanıtına karşılık gelir. Faktöriyel hesaplama gibi bu oldukça basittir. Diğer işlevler için daha karmaşık olabilir.
Şimdi, faktöriyeli tablolamaya karar verirseniz, yapabileceğinizi varsayarsak, bu tüm tamsayılar için doğru değildir (ancak bazı sınırlı değerler alanı için doğru olabilir), yaptığınız tek şey, aksiyomlarınıza bir yeni aksiyom değerini her tamsayı için değiştirir, böylece artık hiçbir şeyi kanıtlamanıza (dolayısıyla hesaplamanıza) gerek kalmaz.
Ancak bir aksiyom sisteminin sonlu (veya en azından sonlu olarak tanımlanmış) olması gerekir. Ve faktöriyel için tamsayı başına bir sonsuz değer vardır. Eğer sonsuz bir işlevi aksiyomatize ederseniz, yani sonsuz bir alanda tanımlanmışsanız, sonlu aksiyom sisteminiz için sorun yaşarsınız. Bu, tabloya bakmanızın tüm tamsayılar için uygulanamaması gerçeğiyle hesaplanır. Bu, algoritmalar için olağan sonluluk gereksinimini öldürür (ancak sık sık sunulduğu kadar katı mıdır?).
Tüm vakaları ele almak için son derece tanımlanmış bir aksiyom jeneratörüne sahip olmaya karar verebilirsiniz. Bu, diziyi gerektiği gibi başlatmak için algoritmanıza standart faktöriyel programı dahil etmek anlamına gelir. Yani denir memoization programcılar tarafından. Bu aslında önceden hesaplanmış bir tablonun eşdeğerine en yakın olanıdır. Gerektiğinde , tablonun aslında tembel değerlendirme modunda oluşturulmuş olması dışında, önceden hesaplanmış bir tabloya sahip olduğu anlaşılabilir . Bu tartışma muhtemelen biraz daha resmi bakıma ihtiyaç duyacaktır.
İlkel işlemlerinizi istediğiniz gibi tanımlayabilirsiniz (biçimsel sisteminizle tutarlılık içinde) ve karmaşıklık veya performans analizi yapmak için bir algoritmada kullanıldığında seçtiğiniz herhangi bir maliyeti atayabilirsiniz. Ancak, algoritmanızı gerçekten uygulayan somut sistemler (örneğin bir bilgisayar veya bir beyin) bu maliyet özelliklerine saygı gösteremezse, analiziniz entelektüel olarak ilginç olabilir, ancak gerçek dünyada gerçek kullanım için değersizdir.
21000
Hangi programlar ilginç
Bu tartışma, programlar ve kanıtlar arasındaki Curry-Howard izomorfizmi gibi sonuçlarla daha doğru bir şekilde ilişkilendirilmelidir
. Herhangi bir program aslında bir şeyin kanıtıysa, herhangi bir program yukarıdaki tanım anlamında ilginç bir program olarak yorumlanabilir.
Ancak, benim (sınırlı) anlayışımla, bu izomorfizm, tiplerin aksiyomatik teorinin önermelerine karşılık geldiği bazı uygun yazım sistemlerinde iyi yazılabilen programlarla sınırlıdır. Bu nedenle, tüm programlar ilginç programlar olarak nitelendirilemez. Benim tahminim, bu anlamda bir algoritmanın bir problemi çözmesi gerekiyor.
Bu muhtemelen "rastgele üretilen" programların çoğunu hariç tutar.
Aynı zamanda "ilginç bir algoritma" nın ne olduğunun biraz açık bir tanımıdır. İlginç olarak görülebilen herhangi bir program kesinlikle öyle, çünkü onu ilginç kılan tanımlanmış bir tip sistemi var. Ancak şimdiye kadar yazılamayan bir program, daha gelişmiş bir yazı sistemiyle yazılabilir hale gelebilir ve böylece ilginç hale gelebilir. Daha doğrusu, her zaman ilginçti, ancak uygun tip sistemi hakkında bilgi eksikliği nedeniyle, bunu bilmiyorduk.
Ancak, tür uygulama olarak bazı lambda ifadesi, bilindiğinden tüm programlar tipi belirsiz olduğu bilinmektedir Y bağdaştırıcının , bir ses tipi sistemde yazılan edilemez .
Bu görüş yalnızca bazı aksiyomatik kanıt sistemiyle doğrudan ilişkilendirilebilen programlama formalizmleri için geçerlidir. Turing Makinesi gibi düşük seviyeli hesaplama formalizmlerine nasıl genişletilebileceğini bilmiyorum. Bununla birlikte, algoritmalar ve hesaplanabilirlik genellikle problemlerin ve çözümlerin kodlanması oyunu olduğundan ( lambda hesabında kodlanmış aritmetikleri düşünün ), bir algoritmanın kodlaması olarak gösterilebilecek resmi olarak tanımlanan herhangi bir hesaplamanın da bir algoritma olduğu düşünülebilir. Bu tür kodlamalar muhtemelen Turing Makineleri gibi düşük seviyeli formalizmde ifade edilebilecek şeylerin sadece çok küçük bir kısmını kullanır.
Bu yaklaşımın bir ilgisi, gerçek kodlama, hesaplama alanının "fiziksel temsil edilebilirliği" konularından daha soyut ve bağımsız bir algoritma kavramı vermesidir. Böylece, örneğin, hesaplamada sağlam bir kullanım yolu olduğu sürece sonsuz nesnelerle etki alanları düşünülebilir.