Curry-Howard İzomorfizminden doğan en ilginç eşdeğerler nelerdir?


98

Ben üzerine geldi Curry-Howard İzomorfizma benim programlama hayatta nispeten geç ve benim tamamen kendisine hayran olmanın belki de bu katkıda bulunur. Bu, her programlama kavramı için biçimsel mantıkta kesin bir analogun bulunduğunu ve bunun tersi olduğunu ima eder. İşte aklıma gelen bu tür benzetmelerin "temel" bir listesi:

program/definition        | proof
type/declaration          | proposition
inhabited type            | theorem/lemma
function                  | implication
function argument         | hypothesis/antecedent
function result           | conclusion/consequent
function application      | modus ponens
recursion                 | induction
identity function         | tautology
non-terminating function  | absurdity/contradiction
tuple                     | conjunction (and)
disjoint union            | disjunction (or)          -- corrected by Antal S-Z
parametric polymorphism   | universal quantification

Öyleyse, soruma göre: Bu izomorfizmin daha ilginç / belirsiz çıkarımlarından bazıları nelerdir? Mantıkçı değilim, bu yüzden sadece bu listeyle yüzeyi çizdiğime eminim.

Örneğin, mantıkta özlü adların farkında olmadığım bazı programlama kavramları:

currying                  | "((a & b) => c) iff (a => (b => c))"
scope                     | "known theory + hypotheses"

Ve işte programlama terimlerine tam olarak sabitlemediğim bazı mantıksal kavramlar:

primitive type?           | axiom
set of valid programs?    | theory

Düzenle:

Yanıtlardan toplanan bazı eşdeğerler şunlardır:

function composition      | syllogism                -- from Apocalisp
continuation-passing      | double negation          -- from camccann

kapanış ~ = aksiyomlar kümesi
Apocalisp

+1 Bu soru ve tüm kaliteli cevaplar ve yorumlar bana CHI hakkında internetten öğrenebileceklerimden daha fazlasını öğretti.
Alexandre C.

25
@Paul Nathan:goto | jumping to conclusions
Joey Adams

Tüm geçerli programların bir model
Daniil

1
fst / snd | birleşik eliminasyon, Sol / Sağ | ayrılık tanıtımı
Tony Morris

Yanıtlar:


34

En ilginç ve belirsiz olanları açıkça istediğiniz için:

Gerçekten çok çeşitli yazışmalar elde etmek için CH'yi birçok ilginç mantık ve mantık formülasyonuna genişletebilirsiniz. Burada, belirsiz olanlardan ziyade daha ilginç olanlara, artı henüz ortaya çıkmamış birkaç temel konuya odaklanmaya çalıştım.

evaluation             | proof normalisation/cut-elimination
variable               | assumption
S K combinators        | axiomatic formulation of logic   
pattern matching       | left-sequent rules 
subtyping              | implicit entailment (not reflected in expressions)
intersection types     | implicit conjunction
union types            | implicit disjunction
open code              | temporal next
closed code            | necessity
effects                | possibility
reachable state        | possible world
monadic metalanguage   | lax logic
non-termination        | truth in an unobservable possible world
distributed programs   | modal logic S5/Hybrid logic
meta variables         | modal assumptions
explicit substitutions | contextual modal necessity
pi-calculus            | linear logic

DÜZENLEME: CH'nin uzantıları hakkında daha fazla bilgi edinmek isteyen herkese tavsiye edeceğim bir referans:

"Modal Mantığın Yargısal Bir Yeniden İnşası" http://www.cs.cmu.edu/~fp/papers/mscs00.pdf - bu başlamak için harika bir yerdir çünkü ilk ilkelerden başlar ve çoğu mantıkçı olmayanlar / dil teorisyenleri tarafından erişilebilir. (Yine de ikinci yazar benim, bu yüzden önyargılıyım.)


Bazı daha az önemsiz örnekler verdiğiniz için teşekkürler (bu gerçekten ilk sorunun ruhuydu), ancak bunların birçoğunun kafamın üzerinde olduğunu kabul etmeme rağmen ... "gereklilik" ve "olasılık" terimleri mantıkta tam olarak tanımlanmış mı? hesaplama eşdeğerlerine nasıl tercüme ederler?
Tom Crockett

2
Bunların her biri için yayınlanmış makalelere işaret edebilirim, böylece tam olarak tanımlanmışlardır. Modal mantık çok incelenmiştir (Aristoteles'ten beri) ve farklı hakikat tarzlarıyla ilişkilendirilir - "A zorunlu olarak doğrudur", "her olası dünyada A doğrudur" anlamına gelirken, "A muhtemelen doğrudur", "A olası bir dünyada doğrudur" anlamına gelir. . "(Zorunlu olarak (A -> B) ve muhtemelen A) -> muhtemelen B" gibi şeyleri kanıtlayabilirsiniz. Modal çıkarım kuralları, CH'de her zaman olduğu gibi, doğrudan ifade yapılarını, yazmayı ve indirgeme kurallarını verir. Bakınız: en.wikipedia.org/wiki/Modal_logic ve cs.cmu.edu/~fp/papers/mscs00.pdf
RD1

2
@pelotom: Diğer mantık türleri hakkında biraz okumak isteyebilirsiniz . Düz klasik mantık genellikle bu bağlamda yararlı değildir - cevabımda sezgisel mantıktan bahsetmiştim, ancak modal ve doğrusal mantık "daha tuhaf", ama aynı zamanda gerçekten harika.
CA McCann

1
Öneriler için teşekkürler, sanki okumam gereken şeyler var!
Tom Crockett

2
@ RD1: Bunun kötü olduğunu düşünüyorsunuz, Haskell'de o kadar çok zaman harcadım ki yüklem mantığının formüllerini mantıklı hale gelmeden önce yazı tipi imzalarına zihinsel olarak çevirmem gerekiyor. :( Dışarıda bırakılan orta ve bu tür yasaların gerçekten kafa karıştırıcı ve belki de şüpheli görünmeye başladığından bahsetmiyorum bile.
CA McCann

26

Sonlandırmama konusunda işleri biraz karıştırıyorsun. Yanlışlık, tanım gereği sona ermeyen türler tarafından temsil edilir , çünkü ilk etapta değerlendirilecek bu türden hiçbir şey yoktur.

Sonlandırmama çelişkiyi, tutarsız bir mantığı temsil eder . Tutarsız bir mantık, elbette , yanlışlık da dahil olmak üzere her şeyi kanıtlamanıza izin verecektir .

Tutarsızlıkları göz ardı ederek, tip sistemleri tipik olarak sezgisel bir mantığa karşılık gelir ve zorunlu olarak yapılandırmacıdır , bu da klasik mantığın belirli parçalarının doğrudan ifade edilemeyeceği anlamına gelir. Öte yandan bu yararlıdır, çünkü eğer bir tip geçerli bir yapıcı kanıtsa, o türden bir terim , varlığını kanıtladığınız her şeyi inşa etmenin bir yoludur .

Yapılandırmacı lezzetin önemli bir özelliği, çifte olumsuzlamanın olumsuz olmama ile eşdeğer olmamasıdır. Aslında, bir tip sistemde olumsuzlama nadiren ilkeldir, bu yüzden onun yerine yanlışlığı ima ediyormuş gibi gösterebiliriz, örneğin not Polur P -> Falsity. Çifte olumsuzlama, bu nedenle tipli bir işlev olacaktır ve (P -> Falsity) -> Falsitybu açıkça türden bir şeye eşdeğer değildir P.

Ancak, bunda ilginç bir değişiklik var! Parametrik çok biçimliliğe sahip bir dilde, tür değişkenleri, ıssız olanlar da dahil olmak üzere olası tüm türler üzerinde değişir, bu nedenle, bir ∀a. aanlamda neredeyse yanlış gibi tamamen polimorfik bir tür . Peki ya polimorfizm kullanarak çifte neredeyse olumsuz yazarsak? Biz bakışlar böyle bir tür olsun: ∀a. (P -> a) -> a. Bu türden bir şeye eşdeğer Pmi? Aslında öyledir, onu yalnızca kimlik işlevine uygulayın.

Ama ne anlamı var? Neden böyle bir tip yazasın? Programlama açısından bir şey ifade ediyor mu ? Pekala, bunu zaten bir Pyerde bir tür bir şeye sahip olan ve ona Pbir argüman olarak alan bir işlev vermenizi gerektiren bir işlev olarak düşünebilirsiniz , her şey son sonuç türünde polimorfiktir. Bir anlamda, geri kalanının sağlanmasını bekleyen, askıya alınmış bir hesabı temsil eder . Bu anlamda, askıya alınan bu hesaplamalar birlikte oluşturulabilir, etrafta dolaştırılabilir, çağrılabilir, ne olursa olsun. Bu, Scheme veya Ruby gibi bazı dillerin hayranlarına tanıdık gelmeye başlamalıdır - çünkü bunun anlamı, çifte olumsuzlamanın sürekli geçiş stiline karşılık gelmesidir.ve aslında yukarıda verdiğim tip tam olarak Haskell'deki devamı monad.


Düzeltme için teşekkürler, "sahteliği" sonlandırmama ile eşanlamlı olarak kaldırdım. Çifte olumsuzlama için +1 <=> CPS!
Tom Crockett

¬p'yi olarak temsil etmenin arkasındaki sezgiyi tam olarak anlayamıyorum P -> Falsity. Neden çalıştığını anlıyorum (¬p ≡ p → ⊥), ancak kod sürümünü alamıyorum. P -> ⊥tam olarak ne zaman yaşanmalıdır P, değil mi? Ancak bu işlev her zaman yerleşik hale gelmemeli mi? Ya da mümkün değil, aslında, bir örneğini geri dönemezsiniz diye ? Bunun koşulluluğunu pek göremiyorum. Buradaki sezgi nedir?
Antal Spector-Zabusky

1
@Antal SZ: Sezgi elbette sezgisel mantıktır! Ama evet, aslında böyle bir işlevi yazmak zordur. Profilinizde Haskell'i tanıdığınızı görüyorum, bu yüzden belki cebirsel veri türleri ve örüntü eşleştirmeyi düşünüyorsunuz? Yerleşik olmayan bir türün kurucularının olmaması ve dolayısıyla modelle eşleşecek hiçbir şeyin olmaması gerektiğini düşünün . Yasal Haskell olmayan, gövdesi olmayan bir "işlev" yazmanız gerekir. Aslında, bildiğim kadarıyla, Haskell'de çalışma zamanı istisnaları veya sonlandırmama kullanmadan reddedilmiş türden bir terim yazmanın bir yolu yok.
CA McCann

1
@Antal SZ: Öte yandan, eşdeğer mantık tutarlıysa, tüm işlevler toplam olmalıdır, örneğin, tüm örüntü eşleştirmeleri kapsamlı olmalıdır. Bu nedenle, örüntü içermeyen bir işlev yazmak için, parametre türünün kurucuları olmamalıdır, örneğin, ıssız olmalıdır. Bu nedenle, böyle bir işlev yasal olacaktır - ve dolayısıyla kendi türünde yerleşiktir - tam olarak ve yalnızca argümanı ıssız olduğunda. Bu nedenle, bir işlev yanlış P -> Falsityolmaya eşdeğerdir P.
CA McCann

Aha, sanırım anladım. Eğlendirdiğim versiyon şöyle bir şeydi , ancak bu durum f x = xdenenebilirdi P = ⊥, ancak bu yeterince genel değildi. Yani fikir şu ki, değersiz bir tipe geri dönmek için vücuda ihtiyacınız yok; ama işlevin tanımlanabilir ve toplam olması için hiçbir vakaya ihtiyacınız yok ve eğer Pıssızsa, her şey yolunda mı? Bu biraz riskli ama sanırım anlıyorum. Bu benim Xortür tanımımla oldukça tuhaf bir şekilde etkileşime giriyor gibi görünüyor … Bunu düşünmem gerekecek. Teşekkürler!
Antal Spector-Zabusky

15

Grafiğiniz pek doğru değil; çoğu durumda türleri terimlerle karıştırmışsınızdır.

function type              implication
function                   proof of implication
function argument          proof of hypothesis
function result            proof of conclusion
function application RULE  modus ponens
recursion                  n/a [1]
structural induction       fold (foldr for lists)
mathematical induction     fold for naturals (data N = Z | S N)
identity function          proof of A -> A, for all A
non-terminating function   n/a [2]
tuple                      normal proof of conjunction
sum                        disjunction
n/a [3]                    first-order universal quantification
parametric polymorphism    second-order universal quantification
currying                   (A,B) -> C -||- A -> (B -> C), for all A,B,C
primitive type             axiom
types of typeable terms    theory
function composition       syllogism
substitution               cut rule
value                      normal proof

[1] Turing-complete işlevsel dilinin mantığı tutarsızdır. Yinelemenin tutarlı teorilerde karşılığı yoktur. Tutarsız bir mantık / sağlam olmayan ispat teorisinde, buna tutarsızlığa / yanlışlığa neden olan bir kural diyebilirsiniz.

[2] Yine, bu tamlığın bir sonucudur. Mantık tutarlı olsaydı, bu bir anti-teoremin bir kanıtı olurdu - bu nedenle var olamaz.

[3] Birinci dereceden mantıksal özellikleri ortadan kaldırdıkları için işlevsel dillerde mevcut değildir: tüm niceleme ve parametrelendirme formüller üzerinden yapılır. Eğer birinci dereceden özellikleri olsaydı, daha nazik başka olurdu *, * -> *vb .; söylem alanının tür öğeleri. Örneğin, Father(X,Y) :- Parent(X,Y), Male(X), Xve Ysöylem (çağrı etki üzerinde aralığında Dom), ve Male :: Dom -> *.


[1] - evet, daha spesifik olmalıydım. Kısıtlanmamış özyineleme yerine "yapısal özyineleme" yi kastetmiştim, sanırım "katlama" ile aynıdır. [3] - bağımlı olarak yazılmış dillerde mevcut
Tom Crockett

[1] Gerçek şu ki, eğer bir özyineleme fonksiyonu çağrısı (modus ponens) programın sonlanmamasına neden olmazsa, çağrıya veya ortama verilen parametreler (hipotezler) bu çağrılar arasında farklı OLMALIDIR. Yani özyineleme, aynı teoremi birden çok kez uygulamaktır. Özel bir şey varsa, bu genellikle sayıları arttırmak / azaltmaktır (endüktif adım) ve mevcut bir durumla (temel durum) kontrol etmektir, bu da - Mantıkta Matematiksel Tümevarıma karşılık gelir.
Earth Engine

Bu çizelgeyi gerçekten beğendim, ancak "n / a" demem, çünkü tutarlı mantık tek mantık türü değildir, tıpkı programları sonlandırmanın tek program türü olmaması gibi. Sonlandırmayan bir işlev "dairesel bir argümana" karşılık gelir ve Curry-Howard izomorfizminin mükemmel bir örneğidir: Dairesel bir argümanı "takip etmek" sizi sonsuz bir döngüye sokar.
Joey Adams


13

Bu soruyu gerçekten beğendim. Çok şey bilmiyorum, ama birkaç şeyim var ( bazı düzgün tabloları ve benzeri olan Wikipedia makalesi yardımıyla ):

  1. Toplam türlerin / birleşim türlerinin ( örneğin data Either a b = Left a | Right b ) kapsayıcı ayrışmaya eşdeğer olduğunu düşünüyorum . Ve Curry-Howard'ı çok iyi tanımamama rağmen, bunun bunu gösterdiğini düşünüyorum. Aşağıdaki işlevi düşünün:

    andImpliesOr :: (a,b) -> Either a b
    andImpliesOr (a,_) = Left a
    

    Bir şeyleri doğru  anlarsam , tür ( a ∧  b ) → ( a  ★  b ) diyor ve tanım bunun doğru olduğunu söylüyor, burada ★ kapsayıcı veya dışlayıcıdır veya hangisini Eithertemsil ederse . Sen var Either⊕, münhasır temsil veya; ancak, ( a  ∧  b ) ↛ ( a  ⊕  b ). Örneğin, ⊤ ∧ ⊤ ≡ ⊤, ama ⊤ ⊕ ⊥ ≡ ⊥ ve ⊤ ↛ ⊥. Başka bir deyişle, her iki takdirde, bir ve b doğruysa, o zaman hipotez doğrudur ama sonuç yanlış olduğunu ve bu ima böylece false olmalıdır. Ancak, açıkça, ( a  ∧  b ) → ( a  ∨ b hem de varsa), çünkü bir ve b doğruysa, o zaman en az bir doğrudur. Bu nedenle, ayrımcılığa uğramış sendikalar bir çeşit kopukluk ise, kapsayıcı bir çeşitlilik olmalıdır. Bunun bir kanıtı olduğunu düşünüyorum, ancak beni bu kavramdan uzaklaştırmakta özgürsünüz.

  2. Benzer şekilde, sırasıyla özdeşlik işlevi ve sonlandırmayan işlevler olarak totoloji ve saçmalık için tanımlarınız biraz yanlış. Gerçek formül, yalnızca bir öğeye sahip ( genellikle hecelenen ve / veya işlevsel programlama dillerinde) tür olan birim türü ile temsil edilir . Bu mantıklı: bu tipte yerleşim olması garantili olduğundan ve yalnızca bir olası sakin olduğu için bu doğru olmalıdır. Özdeşlik işlevi sadece a  →  a olan belirli totolojiyi temsil eder .data ⊤ = ⊤()Unit

    Sonlandırmayan işlevler hakkındaki yorumunuz, tam olarak ne demek istediğinize bağlı olarak, daha kapalıdır. Curry-Howard, tip sistemi üzerinde çalışır, ancak sonlandırmama burada kodlanmamıştır. Göre Wikipedia olmayan fesih ile ilgili tutarsız mantığı üretir ekleme gibi, bir konudur ( örneğin , ben tanımlayabilirsiniz wrong :: a -> btarafından wrong x = wrong x“kanıtlamak” dolayısıyla ve bu bir  →  b herhangi a ve b ). Eğer "saçmalık" derken kastettiğin buysa, o zaman kesinlikle haklısın. Bunun yerine yanlış ifade demekse, o zaman ne yerine istediğiniz herhangi ıssız türü vardır mesela tarafından tanımlanan bir şeydata ⊥—Yani, onu inşa etmenin herhangi bir yolu olmayan bir veri türü. Bu, hiçbir değerinin olmamasını sağlar ve bu nedenle, yanlışa eşdeğer olan ıssız olması gerekir. Sanırım muhtemelen kullanabilirsiniz a -> b, çünkü sonlandırmayan fonksiyonları yasaklıyorsak, o zaman bu da ıssızdır, ancak% 100 emin değilim.

  3. Wikipedia , aksiyomların Curry-Howard'ı nasıl yorumladığınıza bağlı olarak iki farklı şekilde kodlandığını söylüyor: ya birleştiricilerde ya da değişkenlerde. Bence birleştirici görüş, bize verilen ilkel işlevlerin varsayılan olarak söyleyebileceğimiz şeyleri kodladığı anlamına geliyor (işlev uygulaması ilkel olduğundan modus ponens'in bir aksiyom olmasına benzer). Ve bence değişken görünüm aslında aynı anlama gelebilir - ne de olsa birleştiriciler, yalnızca belirli fonksiyonlar olan küresel değişkenlerdir. İlkel türlere gelince: Bunu doğru düşünüyorsam, o zaman ilkel türlerin varlıklar olduğunu düşünüyorum - hakkında bir şeyler kanıtlamaya çalıştığımız ilkel nesneler.

  4. Mantık ve anlambilim  sınıfıma göre , ( a ∧  b ) →  c  ≡  a  → ( b  →  c ) (ve ayrıca b  → ( a  →  c )), en azından doğal tümdengelimde ihracat denklik yasası olarak adlandırılır. kanıtlar. O zaman sadece kördüğünü fark etmemiştim - keşke olsaydı, çünkü bu harika!

  5. Şimdi kapsayıcı ayrışmayı temsil etmenin bir yolunu bulsak da, özel çeşitliliği temsil etmenin bir yolu yok. Bunu temsil etmek için dışlayıcı ayrılma tanımını kullanabilmeliyiz: a  ⊕  b  ≡ ( a  ∨  b ) ∧ ¬ ( a  ∧  b ). Olumsuzlamayı nasıl yazacağımı bilmiyorum, ama ¬ p  ≡  p  → ⊥ olduğunu ve hem ima hem de yanlışlığın kolay olduğunu biliyorum . Bu nedenle, aşağıdakileri yaparak münhasır ayrılığı temsil edebilmeliyiz:

    data ⊥
    data Xor a b = Xor (Either a b) ((a,b) -> ⊥)
    

    Bu, yanlışlığa karşılık gelen değer içermeyen boş tür olarak tanımlar ; Xordaha sonra hem ( ve ) Eitherbir a veya a b ( veya ) hem de (a, b) ( ve ) 'den alt türe ( yanlış ) bir işlevi ( ima ) içerecek şekilde tanımlanır . Ancak bunun ne anlama geldiğine dair hiçbir fikrim yok . ( Düzenleme 1: Şimdi anlıyorum, bir sonraki paragrafa bakın!) Tip değeri olmadığından (var mı?), Bunun bir programda ne anlama geleceğini anlayamıyorum. Bu tanım veya başka bir tanım hakkında düşünmenin daha iyi bir yolunu bilen var mı?(a,b) -> ⊥ ( Düzenleme 1: Evet, camccann .)

    Düzenleme 1: sayesinde camccann cevabı (özellikle, o sol yorumlar bana yardım etmek), Ben burada neler olduğunu görüyorum. Bir tür değeri Xor a boluşturmak için iki şey sağlamanız gerekir. Birincisi, ilk argümanlardan birinin aveya bu unsurun bir unsurunun varlığına tanıklık b; yani, a Left aveya a Right b. Ve ikincisi, her iki tipte elemanlar olmadığı şeklinde bir kanıtı ave b-in Bir başka deyişle, bir kanıt (a,b)ıssız-olarak ikinci argüman. Yalnızca bir işlev yazmak mümkün olacak yana (a,b) -> ⊥eğer (a,b)ıssız olan bu durumda olması için, bunun anlamı nedir? Bu, türdeki bir nesnenin bir kısmının(a,b)inşa edilemedi; başka bir deyişle, muhtemelen en az birinin ve her ikisi de, bu ave bsıra ıssız edilmektedir! Bu durumda, örüntü eşleştirmeyi düşünüyorsak, böyle bir dizide örüntü eşleştirme yapamazsınız: bunun bıssız olduğunu varsayarsak, bu dizinin ikinci kısmıyla eşleşebilecek ne yazabiliriz? Bu nedenle, onunla eşleşmeyi modelleyemiyoruz, bu da onu neden ıssız hale getirdiğini anlamanıza yardımcı olabilir. Şimdi, hiçbir argüman içermeyen bir toplam işleve sahip olmanın tek yolu (bu zorunlu (a,b)olduğu için, ıssız olduğu için) sonucun da ıssız bir tip olmasıdır - eğer bunu bir kalıp eşleştirme perspektifinden düşünüyorsak, bu, işlevin durumu olmasa bile, olası bir gövde olmadığı anlamına gelir. ikisine de sahip olabilir ve bu yüzden her şey yolunda.

Bunların çoğu, yüksek sesle düşünmek / olayları anında kanıtlamak (umarım), ama umarım yararlıdır. Wikipedia makalesini gerçekten tavsiye ederim ; Herhangi bir ayrıntıyla okumadım, ancak tabloları gerçekten güzel bir özet ve çok kapsamlı.


1
+1, Her ikisinin de kapsayıcı olduğunu ya da. (Her iki aa) nın bir teorem olduğuna dikkat edin (tüm a için).
Apocalisp

Yeniden soru. 2 (b): Tek sakini sonlanmayan bir işlev türü ile ıssız bir işlev türü arasındaki fark nedir? Örneğin, yapıcı içermeyen bir B tipi tanımladıysam, o zaman şöyle bir A-> B işlevi tanımladıysam: fun (a: A): B: = f (a) bu, pek çok dilde yazım denetimi yapacaktır, B'yi geri döndürmek imkansız. Yani işlev bir anlamda "yerleşiktir", ancak "yerleşik" saçmadır ... yani gerçekten yerleşik değildir. Umarım bu bir anlam ifade eder :)
Tom Crockett 03

3
Dipler kanıt değildir. "Bilinmeyen ve belirsiz olanın kapsayıp belirlemesi gerektiğini varsaymak saçmadır ve imkansızdır." - Aristoteles
Apocalisp

2
@Tom: Sonlandırmama konusunu eve götürmek için , mantık tutarlıysa, tüm programlar sona erer . Sonlandırmama yalnızca tutarsız mantıkları temsil eden tür sistemlerinde veya eşdeğer olarak Turing-complete dilleri için tür sistemlerinde oluşur.
CA McCann

1
Apocalisp: Either a a tam olarak bir teorem olmamalı: Either ⊥ ⊥hala ıssız. Tom: Camccann'ın dediği gibi, tutarlılık fesih anlamına gelir. Bu nedenle, tutarlı bir tür sistemi ifade etmenize izin vermez f :: a -> bve bu nedenle tür ıssız olur; tutarsız bir tip sistemi , tip için bir sakini olacaktır , ancak bu, sona ermeyecektir. camccann: Turing tamamlamayan, hiyerarşide bazı ara noktaları işgal eden tutarsız tip sistemler var mı? Ya da bu son adım (genel özyineleme veya her neyse ekleyerek) tam olarak tutarsızlığa eşdeğer mi?
Antal Spector-Zabusky

12

Daha önce ortaya konulmamasına şaşırdığım biraz anlaşılması güç olan bir tanesi: "klasik" işlevsel reaktif programlama, zamansal mantığa karşılık gelir.

Elbette, bir filozof, matematikçi veya saplantılı bir işlevsel programcı değilseniz, bu muhtemelen birkaç soru daha ortaya çıkarır.

Öyleyse, ilk olarak: fonksiyonel reaktif programlama nedir? Zamanla değişen değerlerle çalışmanın açıklayıcı bir yoludur . Bu, kullanıcı arayüzleri gibi şeyler yazmak için kullanışlıdır çünkü kullanıcıdan gelen girdiler zamanla değişen değerlerdir. "Klasik" FRP'nin iki temel veri türü vardır: olaylar ve davranışlar.

Olaylar, yalnızca belirli zamanlarda var olan değerleri temsil eder. Tuş vuruşları harika bir örnektir: klavyeden gelen girdileri belirli bir zamandaki bir karakter olarak düşünebilirsiniz. Her tuşa basma, o zaman sadece tuşun karakteri ve basıldığı zaman ile bir çifttir.

Davranışlar, sürekli var olan ancak sürekli değişen değerlerdir. Fare konumu harika bir örnektir: sadece x, y koordinatlarının bir davranışıdır. Sonuçta, farenin her zaman bir konumu vardır ve bu konum , fareyi hareket ettirdikçe kavramsal olarak sürekli değişir . Sonuçta, fareyi hareket ettirmek bir grup ayrı adım değil, tek bir uzun süreli eylemdir.

Ve zamansal mantık nedir? Yeterince uygun bir şekilde, zamanla ölçülen önermelerle başa çıkmak için bir dizi mantıksal kural. Esasen, normal birinci dereceden mantığı iki niceleyici ile genişletir: □ ve ◇. İlki "her zaman" anlamına gelir: □ φ'yi "φ her zaman tutar" olarak okuyun. İkincisi "eninde sonunda" dır: ◇ φ, "φ sonunda tutulacak" anlamına gelir. Bu, belirli bir tür modal mantıktır . Aşağıdaki iki yasa, niceleyicileri ilişkilendirir:

□φ ⇔ ¬◇¬φ
◇φ ⇔ ¬□¬φ

Yani □ ve ◇, ∀ ve ∃ ile aynı şekilde birbirlerine çifttir.

Bu iki niceleyici, FRP'deki iki türe karşılık gelir. Özellikle, □ davranışlara karşılık gelir ve ◇ olaylara karşılık gelir. Bu türlerin nasıl yaşadıklarını düşünürsek, bunun mantıklı olması gerekir: Bir davranış, mümkün olan her zaman yerleşiktir, bir olay ise yalnızca bir kez olur.


8

Sürdürmeler ve çifte olumsuzlama arasındaki ilişkiyle ilgili olarak, çağrı / cc türü Peirce yasasıdır http://en.wikipedia.org/wiki/Call-with-current-continuation

CH genellikle sezgisel mantık ve programlar arasındaki yazışma olarak ifade edilir. Ancak devam eden çağrı (callCC) operatörünü eklersek (türü Peirce yasasına karşılık gelir), klasik mantık ve callCC'li programlar arasında bir yazışma elde ederiz.


4

Basit bir izomorfizm olmasa da, bu yapıcı LEM tartışması çok ilginç bir sonuçtur. Özellikle sonuç bölümünde Oleg Kiselyov, yapıcı bir mantıkta çift olumsuzlama eliminasyonu elde etmek için monadların kullanımının, hesaplamalı olarak karar verilebilir önermeleri (yapıcı bir ortamda LEM'in geçerli olduğu) tüm önermelerden ayırt etmeye nasıl benzediğini tartışır. Monadların bilgisayımsal etkileri yakaladığı fikri eskidir, ancak bu Curry - Howard izomorfizmi örneği, onu perspektife oturtmaya yardımcı olur ve çifte olumsuzlamanın gerçekte ne anlama geldiğini anlamaya yardımcı olur.



4
2-continuation           | Sheffer stoke
n-continuation language  | Existential graph
Recursion                | Mathematical Induction

Önemli olan, ancak henüz araştırılmayan bir şey, 2-devam (2 parametre alan devamlar) ve Sheffer inme arasındaki ilişkidir . Klasik mantıkta, Sheffer stroku kendi başına tam bir mantık sistemi oluşturabilir (artı bazı operatör dışı konseptler). Tanıdık demek oluyor ki and, or, notsadece Sheffer stoke veya kullanılarak uygulanabilir nand.

Bu, programlama türü yazışmasının önemli bir gerçeğidir çünkü diğer tüm türleri oluşturmak için tek bir tür birleştiricinin kullanılabileceğini belirtir.

2-devamın tip imzası (a,b) -> Void. Bu uygulama ile 1-devamı (normal devamları) (a,a)-> Void, ürün tipi as ((a,b)->Void,(a,b)->Void)->Void, toplam tipi olarak tanımlayabiliriz ((a,a)->Void,(b,b)->Void)->Void. Bu, bize ifade gücünün etkileyici bir özelliğini verir.

Daha fazla kazarsak, Piece'in varoluşsal grafiğinin tek veri türü n-continuation olan bir dile eşdeğer olduğunu öğreneceğiz , ancak bu formda mevcut herhangi bir dil görmedim. Yani bir tane icat etmek ilginç olabilir bence.

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.