Endüktif tiplerin tanımında “korunan” olumsuz olaylar, her zaman kötü mü?


11

Bazı olumsuz olayların kesin olarak kötü olabileceğini biliyorum:

data False

data Bad a = C (Bad a -> a)

selfApp :: Bad a -> a
selfApp (x@(C x')) = x' x

yc :: (a -> a) -> a
yc f = selfApp $ C (\x -> f (selfApp x))

false :: False
false = yc id

Ancak, emin değilim:

  • negatif oluşumları olan tüm endüktif tipler yanlış olabilir;

  • eğer öyleyse, bunu yapmanın bilinen bir mekanik yolu vardır;

Örneğin, bu tür yanlış yapmak için mücadele ediyorum:

type Not a = a -> False

data Bad2 a = C2 (Bad2 (Not a) -> a)

Bu konuda literatüre işaret eden her şey takdir edilecektir.


1
Bu Coq mu? Haskell? Yalancı tip teori? "Yanlış git" ile ne demek istiyorsun?
Dave Clarke

@DaveClarke Üzgünüz, kod Haskell, ancak endişe daha fazla Coq veya Agda gibi olumsuz olayların yasak olduğu diller hakkında. "Yanlış git" derken, ayrışan bir terim yazabilmek, böylece Haskell'deki örneğimde olduğu gibi Yanlış'da yaşayabilmek demek.
Kasım'da Ptival

Yanıtlar:


10

Olumsuz olayların yasaklanmasının nedeni, Knaster-Tarski teoremine benzetilerek anlaşılabilir. Bu teorem diyor ki

Eğer bir tam kafes ve bir ön : L L bir monoton fonksiyonu olan L , daha sonra sabit noktaları kümesi f de tam bir kafestir. Özellikle, en az sabit nokta μ f ve en büyük sabit nokta ν f vardır .Lf:LLLfμfνf

Geleneksel model teorisinde, kafesleri önermeler olarak görülebilir ve p q düzen ilişkisi entailment olarak anlaşılabilir (yani q'nun gerçeği p'nin gerçeği ile ifade edilir).Lpqqp

Model teorisinden ispat teorisine geçtiğimizde, kafesler kategorilere ayrılır. Türleri kategori nesneleri olarak görülebilir , ve bir harita e : p Q eşittir bir kanıtı olduğu S türetilebilir Q .Ce:PQQQ

Özyinelemeli denklemler tarafından tanımlanan türleri yorumlamaya çalıştığımızda, ee, , yapılacak en açık şey Knaster-Tarski teoreminin genelleştirilmesini aramaktır. Bunun yerine bir kafes üzerine bir monoton fonksiyon, bir istiyorum biliyorfunctor F : CC , nesnelere nesneler gönderir, ancak böylece her harita monotonluk koşulu genelleştirir e : P Q bir harita alır F ( e ) : F ( P ) F ( Q ) ( F'nin kimliklere kimlikler gönderdiği ve kompozisyonları koruduğututarlılık koşulları ile FN=μα.1+α F:CCe:PQF(e):F(P)F(Q)F ).F(gf)=F(g)F(f)

Endüktif bir veri tipi μ α istiyorsanız . , aynı zamanda, istediğinizsabit noktanın var olduğundan emin olmakiçin, F tipi operatörün terimleri hakkında bir işlev eylemisağlamanız gerekir. Agda ve Coq'daki katı pozitiflik durumu,busemantikkısıtlamayıimaedensözdizimsel birdurumdur. Gevşek olarak, toplamlar ve ürünlerden bir tip operatörü oluşturursanız, her zaman fonksiyonel eylemi pişirebileceğinizi ve bu şekilde oluşturulan herhangi bir türün sabit bir noktaya sahip olması gerektiğini söyler.μα.F(α)F

Bağımlı olarak yazılan dillerde, dizinlenmiş ve parametrelenmiş türleriniz de vardır, bu nedenle gerçek göreviniz daha karmaşıktır. Bob Atkey ( burada ve burada blog yazanlar ) bana hikayeyi aramak için iyi bir yer olduğunu söylüyor:

Andrej'in belirttiği gibi, temelde olumsuz bir oluşumun iyi olup olmadığı, tip teorisi modelinizin ne olduğuna bağlıdır. Temel olarak, özyinelemeli bir tanımınız olduğunda, sabit bir nokta arıyorsunuz ve matematikte birçok sabit nokta teoremleri vardır.

Şahsen çok fazla kullandığım şey, Banach'ın sabit nokta teoremi, yani bir metrik alan üzerinde kesinlikle büzülme fonksiyonuna sahipseniz, o zaman benzersiz bir sabit noktaya sahip olduğunu söylüyor. Bu fikir (IIRC) Maurice Nivat tarafından semantiğe sokuldu ve Amerika ve Rutten tarafından kapsamlı bir şekilde incelendi ve son zamanlarda Birkedal ve işbirlikçileri tarafından "adım indeksleme" adı verilen popüler bir operasyonel teknikle bağlantılıydı.

Bu, özyinelemeli türlerde negatif oluşumlara izin verilen tip teorilerini doğurur, ancak negatif oluşumlar özel bir "korunma" tipi yapıcı altında meydana geldiğinde. Bu fikir Hiroshi Nakano tarafından tanıtıldı ve Banach teoremiyle bağlantı hem kendim hem de Nick Benton'un yanı sıra Lars Birkedal ve yazarları tarafından yapıldı.


7

Bazen tekrarlayan denklemleri "şans eseri" çözebilirsiniz.

A(A)A.
  1. AA

    AA1.
    1
  2. A()1

Sonuç: Boş çözüm (sizin adınıza False) ve birim türü olmak üzere iki çözüm vardır ().

A(A2)2,
data Cow a = Moo ((a -> Bool) -> Bool)

A22AA22A

N22N.
2N22NInteger(Integer -> Bool) -> Bool

3

Andrej veya Neel'in açıklamalarına bir şey eklemek zor, ama ben bir şans vereceğim. Altta yatan anlambilimi ortaya çıkarmak yerine sözdizimsel bakış açısına değinmeye çalışacağım, çünkü açıklama daha temel ve benim sorunuza daha basit bir cevap veriyorum.

λ

Önemli referans şudur:

Mendler, N. (1991). İkinci dereceden lambda hesabında tümevarımsal türler ve tür kısıtlamaları. Korkarım çevrimiçi bir referans bulamadım. İfadeler ve kanıtlar Nax'ın doktora tezinde bulunabilir (şiddetle tavsiye edilir!).

Bad

Bad=BadA

A

λx:Bad.x x:BadA

ve bu yüzden

(λx:Bad.x x) (λx:Bad.x x):A

Bad=F(Bad)
F(X)XF(X)

Tabii ki denk olarak tanımlanmış tiplerle değil, yapıcılarla çalışıyorsunuz , yani

data Bad = Pack (Bad -> A)

katı eşitlikten ziyade. Ancak tanımlayabilirsiniz

unpack :: Bad -> (Bad -> A)
unpack (Pack f) = f

bu sonucun elde tutulması için yeterlidir:

 (\x:Bad -> unpack x x) (Pack (\x:Bad -> unpack x x))

A


İkinci örneğinizde, işler biraz daha zor, çünkü çizgiler boyunca bazı şeyleriniz var

Bad=BadA

BadBadBad aBad (Not a)

type Not a = a -> False

ile

data Not a = Not a

Haskell bu tür tanımlara izin verdiyse kolayca çözülebilir:

type Acc = Not Acc

Bu durumda, öncekiyle aynı şekilde bir döngü birleştiricisi oluşturabilirsiniz. Benzer (ama daha karmaşık) bir yapı taşıyabileceğinizden şüpheleniyorum

data Acc = D (Not Acc)

Buradaki sorun, bir izomorfizm inşa etmek

Bad Acc <-> Bad (Not Acc)

Karışık varyansla uğraşmak zorundasınız.

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.