Cebirsel veri türlerinin cebirini kötüye kullanmak - bu neden işe yarıyor?


289

Cebirsel veri türleri için 'cebirsel' ifade, matematikte geçmişi olan birine çok düşündürücü görünmektedir. Ne demek istediğimi açıklamaya çalışayım.

Temel türleri tanımlamak

  • Ürün
  • Birlik +
  • Singleton X
  • birim 1

ve kısaltmalar kullanarak için X•Xve 2Xiçin X+Xve saire, o zaman bağlantılı listeleri, örneğin için ön ifadeleri tanımlayabilir

data List a = Nil | Cons a (List a)L = 1 + X • L

ve ikili ağaçlar:

data Tree a = Nil | Branch a (Tree a) (Tree a)T = 1 + X • T²

Şimdi, bir matematikçi olarak benim ilk içgüdüsü bu ifadelerle fındık gidin ve için çözmeye çalışmaktır Lve T. Bunu tekrarlanan ikame ile yapabilirdim, ancak gösterimi korkunç bir şekilde kötüye kullanmak ve isteyerek yeniden düzenleyebileceğimi iddia etmek çok daha kolay görünüyor. Örneğin, bağlantılı bir liste için:

L = 1 + X • L

(1 - X) • L = 1

L = 1 / (1 - X) = 1 + X + X² + X³ + ...

Burada 1 / (1 - X)ilginç bir sonuç elde etmek için kuvvet serisinin genişlemesini tamamen haksız bir şekilde kullandım, yani bir Ltür ya Nilda 1 öğe içeriyor ya da 2 öğe ya da 3, vb.

İkili ağaçlar için yaparsak daha ilginç olur:

T = 1 + X • T²

X • T² - T + 1 = 0

T = (1 - √(1 - 4 • X)) / (2 • X)

T = 1 + X + 2 • X² + 5 • X³ + 14 • X⁴ + ...

yine, güç serisi genişletmesini kullanarak ( Wolfram Alpha ile yapılır ). Bu, 1 elementli sadece bir ikili ağaç, iki elementli 2 ikili ağaç (ikinci element sol veya sağ dalda olabilir), üç elementli 5 ikili ağaç vb. .

Benim sorum şu - burada ne yapıyorum? Bu işlemler haksız görünüyor (zaten bir cebirsel veri türünün karekökü tam olarak nedir?) Ama mantıklı sonuçlara yol açıyorlar. iki cebirsel veri türünün bölümünün bilgisayar biliminde bir anlamı var mıdır, yoksa sadece gösterimsel hile midir?

Ve belki de daha ilginç bir şekilde, bu fikirleri genişletmek mümkün mü? Örneğin, türler üzerinde keyfi işlevlere izin veren türler cebiri hakkında bir teori var mıdır veya türler bir güç serisi gösterimi gerektiriyor mu? Bir işlev sınıfı tanımlayabiliyorsanız, işlevlerin bileşiminin bir anlamı var mı?


19
Bunu ilginç / alakalı bulabilirsiniz: blog.lab49.com/archives/3011
shang

4
Verileri her düğümde saklıyorsa olmaz. Ya benziyor Branch x (Branch y Nil Nil) Nilya da benziyor Branch x Nil (Branch y Nil Nil).
Chris Taylor

4
@nlucaroni: alt, bir tür değil, bir değerdir. Gerçek bir sıfır türünün, bu türden hiçbir değeri olmayacaktır; bu, dipleri yoksaymadıkça Haskell'de mümkün değildir. Alt değerleri hesaba katarsanız, yalnızca altları içeren türler, çoğu zaman yardımcı olmayan birim türü haline gelir ve diğer birçok şey de kırılır.
CA McCann

3
Haskell pratiğinin yaygın olduğunu kabul ediyorum, hala saçma. Yani, "alt" ı farklı kullandığımız anlamına gelir, o zaman benim için kötü dikişler yapan mantık ve tip teorisinde yaparlar. Saf koddan aynı şekilde bakmak onları aynı yapmaz: "Garip Kadroyla Mücadele Etme", Haskell'in anlambiliminin, sonsuza kadar döngü ve bir istisna atmanın açıkça aynı olmadığı bir dizi "kötü değer" olduğunu açıkça ortaya koyuyor . Birini diğeriyle değiştirmek geçerli denklemsel akıl yürütme değildir. Haskell bu kötü değerleri tanımlamak için bir kelime dağarcığı var undefined, throwvb Biz bunu kullanmalıdır.
Philip JF

17
Aklım bu soru tarafından üflendi
TheIronKnuckle

Yanıtlar:


138

Feragatname: ⊥ 'yı hesaba kattığınızda bunun pek çoğu doğru çalışmaz, bu yüzden basitlik uğruna bunu açıkça göz ardı edeceğim.

Birkaç başlangıç ​​noktası:

  • Özellikle bulunuyor - Not o "birlik" Muhtemelen burada A + B için en iyi terim değildir bir ayrık sendikası iki taraf da kendi türleri aynı olsa bile ayırt edilir çünkü iki tip. Değer için, daha yaygın terim basitçe "toplam türü" dür.

  • Singleton tipleri etkili bir şekilde tüm birim tipleridir. Cebirsel manipülasyonlar altında özdeş davranırlar ve daha da önemlisi, mevcut bilgi miktarı hala korunur.

  • Muhtemelen sıfır türü de istiyorsunuz. Haskell bunu sağlar Void. Türü sıfır olan hiçbir değer yoktur, tıpkı türü bir olan bir değer olduğu gibi.

Burada hala büyük bir operasyon eksik ama birazdan buna geri döneceğim.

Muhtemelen fark ettiğiniz gibi, Haskell, Kategori Teorisinden kavramlar ödünç alma eğilimindedir ve yukarıdakilerin hepsinin çok basit bir yorumu vardır:

  • A ve B nesneleri göz önüne alındığında HASK iki uzantı sağlar türü (izomorfizm kadar), ürün A x B benzersizdir, FST A x B → A ve: snd : A x B → B, herhangi bir tip C ve fonksiyonlar verilmiş f : C → A, g : C → B f &&& g : C → A × B eşleşmesini fst ∘ (f &&& g) = f ve benzer şekilde g için tanımlayabilirsiniz . Parametriklik, evrensel özellikleri otomatik olarak garanti eder ve ince isimlerden daha az olan seçimim size fikir vermelidir. (&&&)Operatör tanımlanır Control.Arrow, bu arada.

  • Yukarıda çift enjeksiyonları ile üretilen, koku A + B inl : A → A + B ve INR : B → A + B, herhangi bir tip C ve fonksiyonlar verilmiş f : A → C, g : B → C, olabildiğince copairing'i tanımlar f ||| g : A + B → C, bariz denklikler geçerli olacak şekilde. Parametriklik, zor kısımların çoğunu otomatik olarak garanti eder. Bu durumda, standart enjeksiyonlar basittir Leftve Rightbirlikte çalışma işlevdir either.

Ürün ve toplam tür özelliklerinin birçoğu yukarıdan türetilebilir. Herhangi bir singleton türünün Hask'ın bir terminal nesnesi ve herhangi bir boş türün bir başlangıç ​​nesnesi olduğunu unutmayın.

Bir de, yukarıda sözü edilen eksik operasyona dönersek kartezyen kapalı kategorisine sahip üstel nesneleri tekabül o kategoriye ait oklar. Oklarımız eden nesneleri tür türleri, fonksiyonlar *ve türü A -> Baslında B gibi davranır A tiplerinin cebirsel manipülasyon bağlamında. Bunun neden tutulması gerektiği belli değilse, türü düşünün Bool -> A. Sadece iki olası girişle, bu tipteki bir fonksiyon, tipteki iki değere A, yani izomorfiktir (A, A). Çünkü Maybe Bool -> Aüç olası girdimiz var vb. Ayrıca, cebirsel notasyonu kullanmak için yukarıdaki copairing tanımını yeniden ifade edersek C A × C B = C kimliğini elde ettiğimizi gözlemleyin.A + B .

Gelince neden ve özellikle güç serisi genişleme kullanımınız haklı neden - - Yukarıdaki çoğunu bir tür "sakinlerine" (yani, bu tür sahip ayrı değer) sırayla başvurduğu notu bu her mantıklı Cebirsel davranışı göstermek. Bu perspektifi açık yapmak için:

  • Ürün tipi (A, B), her biri için bağımsız olarak alınan Ave Balınan bir değeri temsil eder . Yani herhangi bir sabit değer için, her bir sakin için bir a :: Atür değer vardır . Bu elbette kartezyen üründür ve ürün tipinde yaşayanların sayısı, faktörlerin sakinlerinin sayısının ürünüdür.(A, B)B

  • Toplama türü Either A B, ya sol ya Ada Bsağ dallar birbirinden ayırt edilen bir değeri temsil eder . Daha önce de belirtildiği gibi, bu ayrık bir birliktir ve toplam türünün sakinlerinin sayısı, summandların sakinlerinin toplamıdır.

  • Üstel tür B -> A, tür Bdeğerlerinden tür değerlerine eşlemeyi temsil eder A. Herhangi bir sabit argüman için herhangi b :: Bbir değeri Aona atanabilir; bir tür değeri, B -> Aher bir giriş için böyle bir eşlemeyi seçer; bu, sakinleri Aolduğu kadar çok kopyasının bir ürününe B, dolayısıyla üslüğe eşdeğerdir .

İlk başta tiplere setler gibi davranmak cazip gelse de, bu bağlamda gerçekten iyi çalışmaz - standart setler birliği yerine ayrık birliğe sahibiz, kavşak veya diğer birçok set operasyonunun açık bir yorumu yok ve genellikle üyelik ayarını önemsemeyin (bunu tür denetleyicisine bırakarak).

Öte yandan, yukarıdaki yapılar sakinleri saymaktan çok zaman harcıyor ve bir türün olası değerlerini numaralandırmak burada yararlı bir kavram. Bu bizi hızlı bir şekilde numaralandırıcı kombinatoriklere götürür ve bağlantılı Wikipedia makalesine bakarsanız, yaptığı ilk şeylerden birinin "çiftler" ve "sendikalar" ı tam olarak ürün ve toplam türleriyle aynı anlamda tanımlamak olduğunu göreceksiniz. işlevler oluşturduktan sonra, aynısını yaptığınız tekniği kullanarak Haskell'in listelerine özdeş olan "diziler" için de aynısını yapar.


Edit: Oh, ve işte çarpıcı bir şekilde noktayı gösteren hızlı bir bonus. Bir yorumda, bir ağaç türü T = 1 + T^2için kimliğin türetilebileceğini belirttiniz T^6 = 1, ki bu açıkça yanlış. Bununla birlikte, T^7 = T yapar tutma, ve ağaç ve ağaç yedi dizilerini arasında bir bijection doğrudan cf. yapılabilir Andreas Blass'ın "Birinde Yedi Ağaç" .

Düzenle × 2: Diğer cevaplarda bahsedilen "bir tür türevi" inşaatı konusunda, bu yazıyı, bölüm ve diğer ilginç kavramlar da dahil olmak üzere, fikri daha da geliştiren aynı yazardan da yararlanabilirsiniz .


3
Bu, büyük bir açıklamadır, özellikle de kesinlikle kesinlikle bir
şüphe

26
@acfoltzer: Teşekkürler! :] Ve evet, bu fikirleri geliştiren harika bir makale. Biliyor musun, SO'daki saygınlığımın en az% 5'inin "insanların Conor McBride'ın gazetelerinden birini anlamasına yardımcı olmak" ile ilişkilendirilebileceğini düşünüyorum ...
CA McCann

45

İkili ağaçlar, T=1+XT^2tiplerin dönemindeki denklem ile tanımlanır . Yapım T=(1-sqrt(1-4X))/(2X)gereği, karmaşık sayıların hesaplanmasında aynı denklem ile tanımlanır. Aynı denklemi aynı cebirsel yapı sınıfında çözdüğümüz göz önüne alındığında, aslında bazı benzerlikler görmemiz şaşırtıcı olmamalı.

Yakalama şudur ki, karmaşık sayıların ortaya çıkmasında polinomları düşündüğümüzde, tipik olarak karmaşık sayıların bir halka ya da bir alan oluşturması gerçeğini kullanırız, bu yüzden kendimizi, yarılanmalar için geçerli olmayan çıkarma gibi işlemleri kullanarak buluruz. Ancak, bir denklemin her iki tarafından da iptal etmemize izin veren bir kuralımız varsa, argümanlarımızdan çıkarmaları çoğu zaman ortadan kaldırabiliriz. Fiore ve Leinster tarafından kanıtlanmış bir şey , halkalarla ilgili birçok argümanın semirlere aktarılabileceğini gösteriyor.

Bu, halkalar hakkındaki matematiksel bilgilerinizin çoğunun türlere güvenilir bir şekilde aktarılabileceği anlamına gelir. Sonuç olarak, karmaşık sayıları veya kuvvet serilerini (resmi kuvvet serisinin halkasında) içeren bazı argümanlar, türlere tamamen titiz bir şekilde geçebilir.

Ancak hikayede bundan daha fazlası var. İki güç serisinin eşit olduğunu göstererek iki türün eşit olduğunu kanıtlamak bir şeydir. Ancak, güç serisindeki terimleri inceleyerek türler hakkında bilgi de çıkarabilirsiniz. Buradaki resmi ifadenin ne olması gerektiğinden emin değilim. (Ben Brent Yorgey en tavsiye kağıdı üzerine kombinatoryal türler yakından ilgili fakat türlerdir yerlerden biraz iş için değil türleri aynıdır.)

Tamamen zihin üfleme bulduğum şey, keşfettiğiniz şeyin analize kadar genişletilebileceği. Analiz hakkındaki teoremler türlerin dönemine aktarılabilir. Aslında, sonlu farklarla ilgili argümanlar bile aktarılabilir ve sayısal analizden klasik teoremlerin tip teorisinde yorumları olduğunu görürsünüz.

İyi eğlenceler!


Bu farklılaşma / tek delikli içerik oldukça güzel. Bakalım bu doğru mu? Cebirsel temsili bir çiftin P = X^2türevi vardır dP = X + X, Eitherçiftin tek delikli içeriği de. Bu oldukça havalı. Biz de Eitherbir çift almak için 'entegre' olabilir . Fakat ' Maybetip ile ' bütünleşmeye çalışırsak, M = 1 + Xo zaman \int M = X + X^2 / 2saçma olana (yarım tip nedir?) Sahip olmamız gerekir, bu başka bir türün Maybetek delikli bağlamı olmadığı anlamına mı geliyor ?
Chris Taylor

6
@ChrisTaylor: Tek delikli bağlamlar, ürünlerin içindeki konumla ilgili bilgileri korur, yani içindeki (A,A)bir delik Ave deliğin hangi tarafında olduğunu biraz söyler. Bir Ayalnız bunu "entegre" olamaz, bu yüzden de doldurmak için hiçbir seçkin bir delik var. Bu durumda eksik bilgilerin türü elbette 2.
CA McCann


@ user207442, bir ağaçla yedi ağaç arasındaki bağlantı hakkında bir şey yapmadınız mı? Cevabımda bununla ilgili bir makaleye bağlandım ama yemin ederim ki blogunuzda ilk olarak bunu okuduğumu hatırlıyorum.
CA McCann

1
@ChrisTaylor Sonlu (aslında "bölünmüş") farklar üzerinde şu vardır: kesinlikle , bu noktada Conor farklılıkları tarif ettiğini fark etmedi. Bunu yazmak zor olsa da yazdım: blog.sigfpe.com/2010/08/… Bir makale yazardım ama bitirmede çok iyi değilim.
sigfpe

22

Görünüşe göre tek yaptığınız nüks ilişkisini genişletmek.

L = 1 + X  L
L = 1 + X  (1 + X  (1 + X  (1 + X  ...)))
  = 1 + X + X^2 + X^3 + X^4 ...

T = 1 + X  T^2
L = 1 + X  (1 + X  (1 + X  (1 + X  ...^2)^2)^2)^2
  = 1 + X + 2  X^2 + 5  X^3 + 14  X^4 + ...

Ve türler üzerindeki işlemlere ilişkin kurallar aritmetik işlemler için kurallar gibi çalıştığından, yineleme ilişkisini nasıl genişleteceğinizi anlamanıza yardımcı olması için cebirsel araçlar kullanabilirsiniz (açık olmadığı için).


1
"Tipler üzerinde operasyonlar için kurallar aritmetik işlemler için kurallar gibi çalıştığı için ..." - ama, onlar değil. Bölünme ve karekökler hariç, türlerin çıkarılması fikri yoktur. Yani sanırım sorum şu: cebirsel bir manipülasyondan ne zaman Xgerçek sayıların bir türü olduğunu varsayarak türler hakkında gerçek bir ifadeye geçebilirsin ve üstelik, yazışmaların ( nderece terim katsayısı) nerede olduğu <=> (sayı tutan nelemanların türleri )?
Chris Taylor

1
Örneğin, bir Tree ( T = 1 + T^2) ifadesinden türetebilirim T^6 = 1(yani çözümlerin x^2 - x + 1 = 0altıncı birlik kökleridir), ancak altı ikili ağaçtan oluşan bir ürün tipinin üniteye eşdeğer olduğu açık değildir() .
Chris Taylor

3
Orada olarak @ChrisTaylor, ama orada bir şeyler oluyor, orada olduğu arasına bir izomorfizması T^7ve T. bakınız arxiv.org/abs/math/9405205
luqui

7
@ChrisTaylor, düşünülecek bir şey var. Yeni cebirsel işlemler eklediğinizde, mevcut olanların özelliklerini kırmamayı umuyorsunuz. Aynı cevaba iki farklı yoldan gelebilirseniz, aynı fikirde olmalıdırlar. Bu nedenle, orada sağlayarak olan hiç bir temsili için L = 1 + X * L, bu vardı daha iyi serisi ne zaman genişlettiğini tutarlılık tarafından, olsun aynı biri. Aksi takdirde, gerçeklerle ilgili yanlış bir şey elde etmek için sonucu geriye doğru çalıştırabilirsiniz.
luqui

2
@ChrisTaylor Gerçekten türlerin bölünmesi kavramı vardır, daha fazla bilgi için "Bölüm Türleri" ni arayın. Polinom bölünmesine iyi karşılık gelip gelmediğini bilmiyorum. Oldukça pratik değil, imho, ama orada.
Doug McClean

18

Tam bir cevabım yok, ama bu manipülasyonlar 'sadece işe yarıyor'. İlgili bir makale Fiore ve Leinster'ın Karmaşık Sayılar Olarak Kategorilerin Nesneleri olabilir - ben bununla ilgili bir konuya sigfpe blogunu okurken rastladım ; bu blogun geri kalanı benzer fikirler için bir altın madeni ve kontrol etmeye değer!

Bu arada veri tiplerini de ayırt edebilirsiniz - bu size veri tipi için uygun Fermuar sağlayacaktır!


12
Fermuar hile müthiş. Keşke anlasaydım.
Şubat'ta spraff

Ayrıca , genel olarak türetmenize izin veren sınırlandırılmış süreklilikleri kullanarak Şema'da fermuarlar da yapabilirsiniz .
Jon Purdy

10

İletişim Süreçleri Cebiri (ACP), süreçler için benzer türde ifadelerle ilgilenir. İlişkili nötr elemanlarla seçim ve sıralama operatörleri olarak toplama ve çarpma sunar. Bunlara dayanarak, paralellik ve bozulma gibi diğer yapılar için operatörler vardır. Bkz. Http://en.wikipedia.org/wiki/Algebra_of_Communicating_Processes . Ayrıca çevrimiçi olarak "Süreç Cebirinin Kısa Tarihi" adlı bir makale de bulunmaktadır.

ACP ile programlama dillerini genişletmeye çalışıyorum. Geçen Nisan ayında Scala Days 2012'de http://code.google.com/p/subscript/ adresinden bir araştırma makalesi sundum.

Konferansta, bir çantanın paralel özyinelemeli bir özelliğini çalıştıran bir hata ayıklayıcı gösterdim:

Çanta = A; (Çanta ve a)

burada A ve giriş ve çıkış işlemleri için bir stand; noktalı virgül ve ve işareti sıra ve paralellik anlamına gelir. Önceki bağlantıdan erişilebilen SkillsMatter'daki videoyu izleyin.

Daha uygun bir çanta özellikleri

L = 1 + X • L

olabilir

B = 1 + X&B

ACP, aksiyomları kullanarak paralelliği seçim ve sıralama açısından tanımlar; Wikipedia makalesine bakın. Çanta benzetmesinin ne için olacağını merak ediyorum

L = 1 / (1-X)

ACP tarzı programlama, metin ayrıştırıcılar ve GUI denetleyicileri için kullanışlıdır. Gibi özellikler

searchCommand = tıklandı (searchButton) + tuşu (Enter)

cancelCommand = tıklandı (cancelButton) + tuşu (Escape)

iki ayrıntılandırma "tıklatıldı" ve "anahtar" örtük olarak (Scala'nın işlevlerle izin verdiği gibi) daha kısaca yazılabilir. Dolayısıyla şunu yazabiliriz:

searchCommand = searchButton + Enter

cancelCommand = cancelButton + Escape

Sağ taraf artık süreçler yerine veri olan işlenenler içeriyor. Bu düzeyde, hangi örtülü ayrıntılandırmanın bu işlenenleri süreçlere dönüştüreceğini bilmek gerekli değildir; ilke olarak girdi eylemlerinde rafine olmayacaklardır; çıktı eylemleri, örneğin bir test robotunun spesifikasyonunda da uygulanacaktır.

Süreçler bu şekilde verileri yoldaş olarak alır; bu yüzden "madde cebiri" terimini yazıyorum.


6

Türleri ile Matematik ve Maclaurin serileri

İşte bir başka küçük ekleme - bir seri genişlemedeki katsayıların neden işe yaraması gerektiğine dair, özellikle de matematikten Taylor-Maclaurin yaklaşımı kullanılarak türetilebilen serilere odaklanan kombine bir içgörü . Not: manipüle edilmiş liste tipine verdiğiniz örnek seri genişletmesi bir Maclaurin serisidir.

Diğer cevaplar ve yorumlar cebirsel tip ifadelerin (toplamlar, ürünler ve üsler) davranışıyla ilgilendiğinden, bu cevap bu ayrıntıyı ve 'matematik' türüne odaklanacaktır.

Bu cevapta ters virgüllerin ağır kaldırma yaptığını fark edebilirsiniz. Bunun iki nedeni vardır:

  • bir alandan diğerine varlıklara yorum verme işindeyiz ve bu tür yabancı kavramları bu şekilde sınırlamak uygun görünmektedir.
  • bazı kavramlar daha titiz bir şekilde resmileştirilebilir, ancak şekil ve fikirler ayrıntılardan daha önemli görünür (ve yazmak için daha az yer kaplar).

Maclaurin series'un tanımı

Maclaurın serileri bir fonksiyon f : ℝ → ℝolarak tanımlanır

f(0) + f'(0)X + (1/2)f''(0)X² + ... + (1/n!)f⁽ⁿ⁾(0)Xⁿ + ...

nerede th türevi f⁽ⁿ⁾anlamına gelir .nf

Maclaurin serisini türlerle yorumlandığı gibi anlamlandırabilmek için, üç şeyi tip bağlamında nasıl yorumlayabildiğimizi anlamamız gerekir:

  • bir (muhtemelen çoklu) bir türev
  • işlev uygulamak 0
  • gibi terimler (1/n!)

ve analizdeki bu kavramların tür dünyasında uygun muadilleri olduğu ortaya çıkıyor.

'Uygun bir meslektaşı' ile ne demek istiyorum? Bir izomorfizm lezzetine sahip olmalıdır - eğer her iki yönde de gerçeği koruyabilirsek, bir bağlamda elde edilebilen gerçekler diğerine aktarılabilir.

Türleri ile Matematik

Peki, bir tür ifadesinin türevi ne anlama geliyor? Büyük ve iyi kalpli ('farklılaşabilir') tip ifadeler ve işlevler sınıfı için, uygun bir yorum olacak kadar benzer davranan doğal bir operasyon olduğu ortaya çıkıyor!

Delgiyi bozmak için farklılaşmaya benzer işlem, 'tek delikli bağlamlar' yapmaktır. Bu , bu özel noktayı daha da genişletmek için mükemmel bir yerdir, ancak tek delikli bir bağlamın ( da/dx) temel konsepti, belirli bir türden ( x) tek bir alt öğenin bir terimden (tür a) çıkarılmasının sonucunu temsil etmesidir. Alt öğenin orijinal konumunu belirlemek için gerekli olanlar da dahil olmak üzere diğer tüm bilgiler. Örneğin, bir liste için tek delikli bir bağlamı temsil etmenin bir yolu iki listedir: biri çıkarılandan önce gelen öğeler için ve diğeri sonra gelen öğeler için.

Bu operasyonu farklılaşma ile tanımlama motivasyonu aşağıdaki gözlemlerden gelir. Biz yazma da/dxtürü için bir delikli bağlamlarda türünü anlamında aÇeşidi delikle x.

d1/dx = 0
dx/dx = 1
d(a + b)/dx = da/dx + db/dx
d(a × b)/dx = a × db/dx + b × da/dx
d(g(f(x))/dx = d(g(y))/dy[f(x)/a] × df(x)/dx

Burada, 1ve 0sırasıyla tam olarak bir ve tam olarak sıfır nüfuslu türlerini temsil eder ve +ve ×her zamanki gibi toplamı ve ürün çeşitlerini temsil eder. fve gtip fonksiyonlarını veya tip ifadesi oluşturucuları temsil etmek için kullanılır ve önceki ifadedeki her biri için [f(x)/a]ikame işlemi anlamına gelir .f(x)a

Bu nokta tipinde bir tarzda yazılabilir f', tip fonksiyonunun türev fonksiyonunu ifade etmek için yazılabilir f, böylece:

(x ↦ 1)' = x ↦ 0
(x ↦ x)' = x ↦ 1
(f + g)' = f' + g'
(f × g)' = f × g' + g × f'
(g ∘ f)' = (g' ∘ f) × f'

tercih edilebilir.

Not: Türler ve işlevlerin izomorfizm sınıflarını kullanarak türevleri tanımlarsak, eşitlikler titizlikle ve kesin olarak yapılabilir.

Şimdi, özellikle hesaplamada, toplama, çarpma ve kompozisyonun cebirsel işlemlerine (genellikle Sum, Ürün ve Zincir kuralları olarak adlandırılır) ilişkin kuralların tam olarak 'bir delik açma' işlemiyle yansıtıldığını görüyoruz. Ayrıca, sabit bir ifadede veya terimin xkendisinde 'delik açmak' temel vakaları da farklılaşma gibi davranır, bu nedenle tümevarım yoluyla tüm cebirsel tip ifadeler için farklılaşma benzeri davranışlar elde ederiz.

Şimdi farklılaşmayı yorumlayabiliriz n, bir tür ifadesinin 'türevi' ne dⁿe/dxⁿdemektir? n-Place bağlamlarını temsil eden bir tiptir : ntip ile 'doldurulduğunda' xan e. (1/n!)Daha sonra gelmekle ilgili başka bir önemli gözlem daha var.

Bir tür işlevinin değişmez kısmı: 0'a bir işlev uygulama

0Tür dünyasında zaten bir yorumumuz var : üye olmayan boş bir tür. Kombinatoryal bir bakış açısından, ona bir tip işlevi uygulamak ne anlama gelir? Daha somut olarak, fbir tür fonksiyon olduğunu varsayalım , f(0)neye benziyor? Eh, kesinlikle tipte bir şeye erişimimiz yok 0, bu yüzden bir yapı f(x)gerektiren herhangi bir yapı xmevcut değil. Geriye, yokluğunda erişilebilen, türün 'değişmez' veya 'sabit' bölümünü diyebileceğimiz terimler kaldı.

Açık bir örnek için, Maybecebirsel olarak temsil edilebilecek işlevi alın x ↦ 1 + x. Bunu uyguladığımızda şunu 0elde ederiz 1 + 0- tıpkı şu gibi 1: olası tek değer Nonedeğerdir. Bir liste için, benzer şekilde, sadece boş listeye karşılık gelen terimi alırız.

Onu geri getirip türü f(0)bir sayı olarak yorumladığımızda, bir türe erişim olmadan kaç tür terimin (herhangi biri için ) elde edilebileceğinin sayısı olarak düşünülebilir : yani, 'boş benzeri' terimlerin sayısı .f(x)xx

Bir araya getirmek: Maclaurin serisinin tam yorumu

Korkarım (1/n!)bir tür olarak uygun bir doğrudan yorum düşünemiyorum .

Biz düşünürsek, olsa da, tip f⁽ⁿ⁾(0)Yukarıdakilerin ışığında, bunun türü olarak yorumlanabilir görüyoruz ntip bir dönem için -Yeri bağlamlarda zaten içermeyen onlara 'entegre' zaman olduğu - sürelerini , sonuçta ortaya çıkan terim tam olarak s, daha fazla, daha az değil. Daha sonra türün bir sayı olarak yorumlanması ( Maclaurin serisinin katsayılarında olduğu gibi ), bu tür boş yer bağlamlarının kaç tane olduğunun bir sayısıdır . Neredeyse geldik!f(x) xn n xf⁽ⁿ⁾(0)fn

Peki nerede (1/n!)bitiyor? 'Farklılaşma' türü sürecinin incelenmesi, birden fazla kez uygulandığında alt terimlerin çıkarıldığı 'düzeni' koruduğunu gösterir. Örneğin, (x₀, x₁)tür terimini x × xve içinde iki kez 'delik açma' işlemini düşünün . Her iki diziyi de alıyoruz

(x₀, x₁)  ↝  (_₀, x₁)  ↝  (_₀, _₁)
(x₀, x₁)  ↝  (x₀, _₀)  ↝  (_₁, _₀)
(where _ represents a 'hole')

her ikisi de aynı terimden gelse de 2! = 2, düzeni koruyarak iki öğeden iki öğe almanın yolları vardır . Genel olarak, öğeleri almanın yolları vardırn! . Bu nedenle, öğeleri olan bir functor türünün yapılandırma sayısını saymak için , tam olarak Maclaurin serisinin katsayılarında olduğu gibi türü saymak ve bölmek zorundayız .nnnf⁽ⁿ⁾(0)n!

Yani, bölüşmek n!basitçe kendisi gibi yorumlanabilir.

Son düşünceler: 'özyinelemeli' tanımlar ve analitiklik

İlk olarak, bazı gözlemler:

  • f: ℝ → ℝ fonksiyonunun bir türevi varsa, bu türev benzersizdir
  • benzer şekilde, f: ℝ → ℝ fonksiyonu analitik ise, tam olarak karşılık gelen bir polinom serisine sahiptir

Zincir kuralına sahip olduğumuz için, tür türevlerini izomorfizm sınıfları olarak resmileştirirsek, örtük farklılaşmayı kullanabiliriz . Ancak örtük farklılaşma, çıkarma veya bölme gibi yabancı manevralar gerektirmez! Bu nedenle, özyinelemeli tür tanımlarını analiz etmek için kullanabiliriz. Liste örneğinizi almak için,

L(X) ≅ 1 + X × L(X)
L'(X) = X × L'(X) + L(X)

ve sonra değerlendirebiliriz

L'(0) = L(0) = 1

Maclaurin serisinin katsayısını elde etmek .

Ancak, bu ifadelerin gerçekten de kesin olarak 'ayırt edilebilir' olduğundan emin olduğumuzdan ve yalnızca örtülü olarak ve türevlerin kesinlikle benzersiz olduğu ℝ → ℝ fonksiyonlarıyla yazıştığımızdan, değerleri kullanarak elde etsek bile emin olabiliriz. yasadışı 'işlemler, sonuç geçerlidir.

Şimdi, benzer şekilde, observ → ℝ fonksiyonlarıyla yazışma (bu bir homomorfizm mi?) Nedeniyle ikinci gözlemi kullanmak için, bir fonksiyonun Maclaurin serisine sahip olmasından memnun olduğumuz takdirde , her şeyden önce , yukarıda özetlenen ilkeler onu titiz hale getirmek için uygulanabilir.

Fonksiyonların bileşimi ile ilgili sorunuza gelince, zincir kuralının kısmi bir cevap verdiğini düşünüyorum.

Bunun kaç tane Haskell tarzı ADT için geçerli olduğundan emin değilim, ancak hepsi değilse de çok olduğundan şüpheleniyorum. Bu gerçeğin gerçekten muhteşem bir kanıtını keşfettim, ancak bu kenar boşluğu onu içeremeyecek kadar küçük ...

Şimdi, kesinlikle burada olanları çözmenin tek bir yolu ve muhtemelen başka birçok yol var.

Özet: TL; DR

  • 'farklılaşma' türü ' delik açmak' anlamına gelir .
  • bir functor uygulamak 0bize bu functor için 'boş benzeri' terimleri getirir.
  • Maclaurin güç serileri bu nedenle (bir şekilde), belirli sayıda eleman içeren bir functor tipinin üye sayısının titizlikle karşılığıdır.
  • örtük farklılaşma bunu daha su geçirmez hale getirir.
  • türevlerin tekliği ve kuvvet serilerinin tekliği, ayrıntıları geçebileceğimiz anlamına gelir ve çalışır.

6

Bağımlı tip teorisi ve 'keyfi' tip fonksiyonlar

Bu soruya ilk cevabım kavramlar üzerinde yüksek ve detaylar üzerinde düşüktü ve “neler oluyor?” Alt sorusuna yansıdı; bu cevap aynı olacak, ancak 'keyfi tip fonksiyonlar alabilir miyiz?' alt sorusuna odaklanacaktır.

Toplam ve ürünün cebirsel işlemlerinin bir uzantısı, genellikle yazılı Σve Πsırasıyla bir dizinin (veya daha genel olarak, bir fonksiyonun toplamı ve ürününün) toplamını ve ürününü temsil eden 'büyük operatörler' olarak adlandırılır . Bkz. Sigma Gösterimi .

Yani toplam

a + aX + aX² + ...

yazılabilir

Σ[i  ℕ]aX

aÖrneğin, gerçek sayıların bazı dizileri nerede . Ürün, Πyerine benzer şekilde temsil edilecektir Σ.

Uzaktan baktığınızda, bu tür bir ifade, içinde 'keyfi' bir fonksiyona çok benzer X; tabii ki ifade edilebilir seriler ve bunlarla ilişkili analitik fonksiyonlarla sınırlıyız. Bu bir tür teorisinde temsil edilmeye aday mı? Kesinlikle!

Bu ifadeleri hemen temsil eden tür teorileri sınıfı 'bağımlı' tür teorilerinin sınıfıdır: bağımlı türlerle teoriler. Doğal olarak terimlere bağlı terimlerimiz vardır ve Haskell gibi yazım fonksiyonlarına ve tür miktarına sahip dillerde, türlere bağlı olarak terim ve türlere sahibiz. Bağımlı bir ortamda ek olarak terimlere bağlı olarak tiplerimiz vardır. Haskell bağımlı olarak yazılan bir dil değildir, ancak bağımlı türlerin birçok özelliği , dile biraz işkence yapılarak simüle edilebilir .

Curry-Howard ve bağımlı türleri

'Curry-Howard izomorfizmi', basit tipli lambda hesabının terimleri ve tip değerlendirme kurallarının sezgisel önerme mantığına uygulanan türlerin (Gentzen tarafından formüle edildiği gibi) tam olarak doğal indirime (Gentzen tarafından formüle edildiği) karşılık geldiği bir gözlem olarak hayata başladı. ve ikisi bağımsız olarak icat edilmiş / keşfedilmiş olmasına rağmen ispatların yerini alan terimler. O zamandan beri, tip teorisyenleri için büyük bir ilham kaynağı oldu. Dikkate alınması gereken en belirgin şeylerden biri, önermeli mantığın bu yazışmasının yüklem veya daha yüksek dereceli mantıklara genişletilip genişletilemeyeceğidir. Bağımlı tip teoriler başlangıçta bu keşif yolundan doğdu.

Basitçe yazılmış lambda hesabı için Curry-Howard izomorfizmasına giriş için buraya bakınız . Örnek olarak, kanıtlamak istiyorsak A ∧ Bkanıtlamak Ave kanıtlamak zorundayız B; birleştirilmiş bir kanıt basitçe bir çift kanıttır: her bir bağlaç için bir kanıt.

Doğal indirimde:

Γ  A    Γ  B
Γ  A  B

ve basitçe yazılmış lambda hesabında:

Γ  a : A    Γ  b : B
Γ  (a, b) : A × B

Benzer yazışmalar ve toplam türleri, işlev türleri ve çeşitli eleme kuralları için de vardır.

Kanıtlanmamış (sezgisel olarak yanlış) bir teklif, ıssız bir tipe karşılık gelir.

Mantıksal önermeler olarak türlerin benzetilmesiyle, tür dünyasında tahminlerin nasıl modelleneceğini düşünmeye başlayabiliriz. Bunun resmileştirilmesinin birçok yolu vardır ( yaygın olarak kullanılan bir standart için Martin-Löf'ün Sezgisel Tip Teorisine bu girişe bakın ), ancak soyut yaklaşım genellikle bir yüklemin serbest terim değişkenlerine sahip bir teklif gibi olduğunu gözlemler veya alternatif olarak, önermeleri dikkate alan bir işlev. Tür ifadelerinin terimler içermesine izin verirsek, lambda kalkülüs tarzında bir tedavi hemen bir olasılık olarak kendini sunar!

Sadece yapıcı deliller düşünüldüğünde, bunun delili ∀x ∈ X.P(x)nedir? Bunu, xkarşılık gelen önerilerinin ( P(x)) kanıtlarına terim ( ) alarak bir kanıt işlevi olarak düşünebiliriz . Bu nedenle, türün (öneri) üyeleri (kanıtlar), ∀x : X.P(x)her xbiri Xiçin bir tür terim veren 'bağımlı işlevlerdir' P(x).

Ne olmuş ∃x ∈ X.P(x)? Biz herhangi bir üyesini gerek X, xbirlikte bir kanıtı olan, P(x). Tip (önerme) üyeleri (deliller) Yani ∃x : X.P(x)seçkin bir terim: 'bağımlı çifti' in xiçinde X, birlikte tip bir süre ile P(x).

İşaretleme: kullanacağım

x  X...

sınıf üyeleri hakkındaki gerçek ifadeler için Xve

x : X...

tip üzerinden evrensel nicelemeye karşılık gelen tip ifadeleri için X. Aynı şekilde .

Kombinatoryal düşünceler: ürünler ve toplamlar

Önermelerle türlerin Curry-Howard yazışmasının yanı sıra, bu sorunun ana noktası olan cebirsel türlerin sayı ve işlevlerle birleştirici yazışmaları vardır. Ne mutlu ki, bu yukarıda özetlenen bağımlı türlere genişletilebilir!

Modül gösterimini kullanacağım

|A|

bir türün 'boyutunu' temsil etmek A, tür ve sayılar arasında soruda özetlenen yazışmaları açıkça ortaya koymak. Bunun teorinin dışında bir kavram olduğunu unutmayın; Dilde böyle bir operatöre ihtiyaç olduğunu iddia etmiyorum.

Olası (tamamen azaltılmış, standart) türdeki üyeleri sayalım

x : X.P(x)

hangi tip terimlerini alan bağımlı fonksiyonların xtürüdürX türüdür P(x). Bu tür her fonksiyonun her terimi için bir çıktıya sahip olmalı Xve bu çıktı belirli bir tipte olmalıdır. Her xgiriş için X, bu |P(x)|çıktı 'seçenekleri' verir .

Delici çizgi

|∀x : X.P(x)| = Π[x : X]|P(x)|

Tabii ki eğer anlamda büyük bir anlaşma yapmaz Xise IO (), ancak cebirsel türleri için de geçerlidir.

Benzer şekilde, bir tür terimi

x : X.P(x)

çiftlerinin türü (x, p)ile p : P(x), bu nedenle herhangi bir xbölgesindekiX biz herhangi bir üye ile, uygun bir çift gerçekleştirebilmesi P(x)vererek |P(x)|seçimlerini '.

Bu nedenle,

|∃x : X.P(x)| = Σ[x : X]|P(x)|

aynı uyarılar ile.

Bu, sembolleri kullanarak teorilerde bağımlı türler için ortak gösterimi haklı çıkarır Π ve Σ, ve gerçekten de çok teori yukarda bahsedilen yazışmalar, 'toplamı' 'vardır ve ve 'ürün' 'için tüm' arasında arasında ayrımı.

Yaklaşıyoruz!

Vektörler: bağımlı tuplleri temsil eder

Şimdi aşağıdaki gibi sayısal ifadeleri kodlayabilir miyiz

Σ[n  ℕ]X

tür ifadeleri olarak?

Pek değil. Bir tür ve doğal bir sayı Xⁿolan Haskell'deki gibi ifadelerin anlamını gayri resmi olarak düşünebiliriz , ancak gösterimin kötüye kullanılması; bu bir sayı içeren bir tür ifadesidir: belirgin olarak değilXn geçerli bir ifade .

Öte yandan, resimdeki bağımlı türlerle, sayı içeren türler tam olarak noktadır; aslında, bağımlı tuples veya 'vektörler' bağımlı türlerin liste erişimi gibi işlemler için nasıl pragmatik tip düzeyinde güvenlik sağlayabileceğinin çok yaygın bir örneğidir . Bir vektör sadece uzunluğu ile ilgili tip seviyesi bilgileri ile birlikte bir listedir: tam olarak aşağıdaki gibi tip ifadeleri için neyin peşindeyizXⁿ .

Bu cevabın süresi boyunca

Vec X n

uzunluk- nvektör türü olmakX değerlerinin türü olmalıdır.

Teknik olarak nburada, gerçek bir doğal sayı yerine, doğal bir sayı sistemindeki bir temsildir. NatPeano stilindeki doğal sayıları ( ) başka bir doğal sayının sıfırı ( 0) veya halefi ( S) olarak temsil edebiliriz ve n ∈ ℕyazdığım ˻n˼için Nattemsil ettiği terim anlamına gelir n. Örneğin, ˻3˼bir S (S (S 0)).

Sonra elimizde

|Vec X ˻n˼| = |X|ⁿ

herhangi biri için n ∈ ℕ.

Nat türleri: ℕ terimleri türlere yükseltmek

Şimdi gibi ifadeleri kodlayabiliriz

Σ[n  ℕ]X

türleri olarak. Bu özel ifade, kuşkusuz X, soruda tanımlandığı gibi , listelerin türüyle izomorf olan bir tür ortaya çıkaracaktır . (Sadece bu değil, aynı zamanda kategori-teorik bakış açısından, bir fonktor olan tip fonksiyonu X, yukarıdaki tipe almak doğal olarak izomorfiktir Liste .)

'Keyfi' işlevler için bulmacanın son parçası, nasıl kodlanacağı

f :   

gibi ifadeler

Σ[n  ℕ]f(n)X

böylece bir kuvvet serisine keyfi katsayılar uygulayabiliriz.

Cebirsel türlerin sayılarla yazışmasını zaten anlıyoruz, türlerden sayılara ve tip fonksiyonlarını sayısal fonksiyonlara eşlememize izin veriyoruz. Diğer yoldan da gidebiliriz! - doğal bir sayı göz önüne alındığında, bağımlı türlerimiz olsun ya da olmasın, birçok terim üyesi ile birlikte tanımlanabilir bir cebirsel tür vardır. Bunu indüksiyonla tip teorisinin dışında kolayca ispatlayabiliriz . İhtiyacımız olan şey , sistemin içindeki doğal sayılardan türlere eşlemenin bir yoludur .

Hoş bir farkındalık, bağımlı türlere sahip olduğumuzda, indüksiyonla kanıtın ve özyineleme ile inşaatın neredeyse benzer hale gelmesidir - aslında birçok teoride aynı şeydir. İhtiyaçlarımızı karşılayan tiplerin var olduğunu tümüyle indükleyerek kanıtlayabildiğimiz için bunları inşa edemeyiz mi?

Terim düzeyinde türleri temsil etmenin birkaç yolu vardır. Burada *türlerin evreni için hayali bir Haskellish gösterimi kullanacağım , genellikle bağımlı bir ortamda bir tür olarak kabul edilir. 1

Benzer şekilde, bağımlı tip teoriler olduğu gibi, ' elemeyi' not etmek için de en az yol vardır. Haskellish desen eşleştirme gösterimi kullanacağım.

Biz, bir eşleme gerek αgelen Natetmek *özelliğiyle,

n  ℕ.|α ˻n˼| = n.

Aşağıdaki sözde tanımlama yeterlidir.

data Zero -- empty type
data Successor a = Z | Suc a -- Successor ≅ Maybe

α : Nat -> *
α 0 = Zero
α (S n) = Successor  n)

Bu yüzden görüyoruz ki, eylem, αhalefin davranışını Sbir çeşit homomorfizm haline getirir. Successorbir türün üye sayısına 'bir ekleyen' bir tür işlevidir; yani, tanımlı boyutu |Successor a| = 1 + |a|olan herhangi biri için a.

Örneğin α ˻4˼(ki α (S (S (S (S 0))))),

Successor (Successor (Successor (Successor Zero)))

ve bu türün şartları

Z
Suc Z
Suc (Suc Z)
Suc (Suc (Suc Z))

Tam dört elemanları bize veren: |α ˻4˼| = 4.

Aynı şekilde, herhangi n ∈ ℕbiri için

 ˻n˼| = n

gereğince, gerektiği gibi.

  1. Birçok teori, üyelerin *yalnızca türlerin temsilcisi olmasını gerektirir ve işlem, *türden ilişkili türlerine açık bir eşleme olarak sağlanır . Diğer teoriler, gerçek türlerin kendilerinin terim düzeyinde varlık olmasına izin verir.

'Keyfi' işlevler?

Şimdi bir tür olarak tamamen genel bir güç serisi ifade etmek için aparat var!

Seri

Σ[n  ℕ]f(n)X

tip olur

n : Nat f˼ n) × (Vec X n)

nerede ˻f˼ : Nat → Natfonksiyonun dili içinde uygun bir temsil f. Bunu aşağıdaki gibi görebiliriz.

|∃n : Nat f˼ n) × (Vec X n)|
    = Σ[n : Nat]|α f˼ n) × (Vec X n)|          (property of  types)
    = Σ[n  ℕ]|α f˼ ˻n˼) × (Vec X ˻n˼)|        (switching Nat for ℕ)
    = Σ[n  ℕ]|α ˻f(n × (Vec X ˻n˼)|           (applying ˻f˼ to ˻n˼)
    = Σ[n  ℕ]|α ˻f(n)˼||Vec X ˻n˼|              (splitting product)
    = Σ[n  ℕ]f(n)|X|ⁿ                           (properties of α and Vec)

Bu ne kadar 'keyfi'? Bu yöntemle sadece tamsayı katsayılarıyla değil doğal sayılarla da sınırlıyız. Bunun dışında, Turing Completef göz önüne alındığında, herhangi bir şey olabilir bağımlı türlere sahip dili , herhangi bir şey olabilir, doğal sayı katsayılarıyla herhangi bir analitik işlevi temsil edebiliriz.

Bunun, örneğin, bu List X ≅ 1/(1 - X)tür negatif ve tamsayı olmayan 'türlerin' söz konusu olayda veya olası bir anlamda bu bağlamda ne olabileceği sorusuyla etkileşimini araştırmadım .

Umarım bu cevap keyfi tip fonksiyonlarla ne kadar ileri gidebileceğimizi araştırmanın bir yoludur.

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.