Curry-Howard Yazışmaları'nın çok yaygın bir şekilde yayıldığı / genişletildiği göz önüne alındığında, ispatlar ve programlar arasında (veya önermeler ve türler) herhangi bir fark var mı? Onları gerçekten tanımlayabilir miyiz?
Curry-Howard Yazışmaları'nın çok yaygın bir şekilde yayıldığı / genişletildiği göz önüne alındığında, ispatlar ve programlar arasında (veya önermeler ve türler) herhangi bir fark var mı? Onları gerçekten tanımlayabilir miyiz?
Yanıtlar:
İnsanların günden güne kullandığı programlama dilleri, Curry-Howard yazışmalarına o kadar uymuyor çünkü tür sistemleri çok zayıf. Zorunlu programlar için Curry-Howard'ın kullanımıyla ilgili ilginç bir şey söylemek için, daha sofistike bir tür sisteme sahip olmak gerekir. Proofs-as-programlarını uyarlama kitabı , zorunlu programları sentezlemek amacıyla bu açıyı zorlamaktadır. Bağımlı tipler gittikçe daha popüler hale geldiğinde, kesinlikle araştırma fonksiyonel dillerinde ( Agda , Epigram ), ayrım bulanıklaşıyor . Elbette , tabii ki Curry-Howard'a dayanan Coq teoremi prover'i (ve muhtemelen diğerleri) içinde program sentezi / çıkarımı yapabilirsiniz .
Curry-Howard yazışmaları, provaların programlara açıkça uymadığı durumlarda da kullanılabilir (ya da hiç kimsenin çalıştıracağı programlar değildir). Buna bir örnek Kanıt taşıma izni verilmiştir . Önerme, kimin ne yapmaya yetkili olduğu hakkındaki ifadelere karşılık gelir. Kanıtlar, bir teklifin tutulduğuna dair gerekli kanıtları sağlar, böylece bir yetkilendirme talebine izin verilir. İspatları kodlamak için ispat terimleri getirilir (Curry-Howard aracılığıyla). İspat şartları, taraflar arasında yetkilendirme taleplerinin geçerliliğine dair kanıtların temsili olarak gönderilir, ancak program olarak kabul edilmezler.
Coq'da 2 tip vardır (Prop ve Set), programcı tarafından gerçek kod üretmeyecek kanıtları ve çalışan kodu çıkarmak için kullanılacak kanıtın bir kısmını (programınız) ayırmak için kullanılır.
Bu, sorduğunuz sorun için, makine kodu (program) oluşturmak için neyin tanımlandığını ve teklifin (veya türün) kanıtını tamamlamak için neyin mevcut olduğunu belirlemek için güzel bir çözümdür.
AFAIK, her ikisini de ayırt etmenin otomatik bir yolu yok. Bu araştırma için ilginç bir şey olabilir mi? Ya da belki birileri açıkça imkansız olduğunu işaret edebilir?
Bağımlı türlerle, yalnızca deliller ve programlar arasında net bir ayrım yoktur, aynı zamanda programlar ve türler arasında da bir ayrım yoktur! Tek ayrım, türün (veya programın) göründüğü yer olacak ve onu “program” yerinin veya belirli bir terimin “tür” yerinin bir parçası yapacaktır.
Bir örnek daha açık hale getirecek umuyorum:
Kimlik fonksiyonunu bağımlı tiplerde kullandığınızda, fonksiyonu kullanacağınız tipi geçmeniz gerekir! Bu tür "programınız" da bir değer olarak kullanılıyor!
Türlenmemiş Lambda Hesabı:
Bağımlı Tiplerle:
id: (A: Ayarla) -> A -> A
Bu işlevi kullanıyorsanız, bu örnekte olduğu gibi yaparsınız:
id Naturals 1
Bir değer olarak iletilen "tip" in (bu durumda Natural of Set) atıldığından ve asla hesaplanamayacağına dikkat edin, ancak yine de terimin "program" bölümündedir. “Kanıt” kısımlarında da olacaklar, tip kontrolünün yapılması için orada olmaları gerekiyor, ancak hesaplama sırasında atılacaklar.
Burada uzuvların üstüne çıkacağım ve biraz şaşıracaksanız ispatların ve sonlandırma programlarının tanımlanabileceğini söyleyeceğim .
Herhangi bir sonlandırma programı, girişini aldığınız ve çıktısını üretebileceğinizin bir kanıtıdır. Bu çok temel bir ima kanıtıdır.
Tabii ki, bu imaların bilgiyi açıkça ifade etmekten daha anlamlı hale getirmek için, programın mantıksal bir anlamı olan bir sınıftan çizilen herhangi bir girdi örneği için çalıştığını göstermeniz gerekir. (Ve çıkış için de öyle.)
Diğer yönden, sonlu çıkarım adımlarına sahip herhangi bir kanıt, bazı mantıksal sistemlerdeki nesneleri manipüle eden sembolik bir programdır. (Mantıksal sembollerin ve kuralların hesaplama açısından ne anlama geldiği konusunda çok fazla endişe duymazsak.)
Bu oldukça basit, ama bence fikrin sağlamlığını gösteriyor. (Bazı insanlar bundan hoşlanmazlarsa bile; ;-))
Kanıt ilgisizlik?
Bir program yazdığınızda performansı, hafıza tüketimi vb.
İle ilgileniyorsunuz. Örneğin, uygulamaları aynı tipte olsa bile (bağımlı tip ayarında), baloncuk sıralama yerine bazı akıllı sıralama algoritması kullanmak daha iyidir.
Fakat bazı teoremleri kanıtladığınızda, sadece ilgilendiğiniz bir kanıtın varlığı vardır.
Tabii ki, estetik bakış açısından, bazı ispatlar daha basit / güzel / ilham verici / vb (örn. Kitaptan ispatlar).
Curry-Howard yazışmalarını kabul ederseniz, soru esas olarak felsefidir. “Kanıtlar ve programlar farklı mı? Elbette. Nasıl? Peki, kanıtlar 'kanıtlar' diyoruz ve programlar 'programlar' diyoruz.”
Veya deliller ve programlar arasında izomorfizm varsa - açıkça göründüğü gibi - daha az yanlış söylemek gerekirse, o zaman sorunuz o zaman ikisini ayırt edebilecek kabil olup olmadığını sormaktır. İnsanlar onları farklı olarak sınıflandırır (çoğunlukla), bu nedenle böyle bir kehanetin var olduğu tartışılabilir. O zaman önemli soru, aralarında felsefi tartışmalar için anlamlı bir fark olup olmadığıdır . "Kanıt" nedir? Kanıt teşkil eden şeyin resmi bir tanımı yoktur; Kilise-Turing tezinde "etkili bir şekilde hesaplanabilir" kavramı gibi. Bu nedenle, "program" da resmi bir tanımı yoktur.
Bunlar matematiksel sorgulamanın farklı alanlarını sınıflandırmak için kullanılan doğal dilin kelimeleridir. Curry ve Howard'ın gözlemlediği şey, aslında aynı şeyi inceleyen bu iki farklı alan. Bu bağlantının farkına varmak önemlidir çünkü farklı araştırmacıların birbirleriyle konuşması gerektiğini söyler. Fakat başka bir düzeyde, bağlantının farkına varmak, aralarındaki farka inanmaktır. Bir problemle uğraşırken, bazen bunu bir programlama problemi olarak düşünmek daha faydalı olurken, diğer zamanlarda bunu mantıklı bir problem olarak düşünmek daha faydalı olur. Perspektifteki bu fark bence, aralarındaki önemli fark. Fakat perspektif farkının bir kimlik farkı yaratıp yaratmadığı, en azından Frege’ninki kadar geriye araştırılan derin bir felsefi sorudur.Ueber Sinn ve Bedeutung .