Sıkı pozitiflik


10

Bu referanstan: Sıkı pozitiflik

Katı pozitiflik koşulu,

data Bad : Set where
 bad : (Bad → Bad) → Bad
         A      B       C
 -- A is in a negative position, B and C are OK

A neden negatif? Ayrıca B'ye neden izin verilir? C'ye neden izin verildiğini anlıyorum.


1
Neden bu "negatif" olarak adlandırılır emin değilim, ama daha çok ürettiği hata tarafından bilinir: yığın taşması :) Bu kod sonsuz genişlemesine neden olabilir Ave sonunda (yığın tabanlı dillerde) yığını patlayabilir.
wvxvw

anladığım kadarıyla, rasgele şeyler yazabileceğinizi anlıyorum ve dolayısıyla hesaplama sonlanmayacak. teşekkürler
Pushpa

1
Sorunuzun bedeninde feshedilmemekten bahsetmenin iyi bir şey olacağını düşünüyorum . Cevabınızı yorumunuza dayanarak güncelledim.
Anton Trunov

@wvxvw Derleyici kuyruk özyinelemesini uyguladığı sürece, sadece yığını havaya uçurmadan sonsuza kadar çalışabilir, örneğin aşağıdaki OCaml'deki örneğim yığını patlatmaz.
Anton Trunov

1
@AntonTrunov, kesin olmak için bir girişimden ziyade sitenin adı hakkında bir cinstir.
wvxvw

Yanıtlar:


17

ABAB

Şimdi endüktif veri tiplerine.

TTT

Cebirde, bir işlemin sınırlı sayıda argüman alması ve çoğu durumda sıfır (sabit), bir (tekli) veya iki (ikili) argüman alması gelenekseldir. Bunu veri tipi kurucuları için genelleştirmek uygundur. cBir veri türü için yapıcı olduğunu varsayalım T:

  • eğer cbir sabitse onu bir işlev olarak düşünebiliriz unit -> T, ya da eşdeğer olarak (empty -> T) -> T,
  • eğer csıradansa, bunu bir işlev olarak düşünebiliriz T -> T, ya da eşdeğer olarak (unit -> T) -> T,
  • eğer cbir fonksiyonu olarak düşünebiliriz ikili olduğu T -> T -> T, veya eşdeğer T * T -> Tveya eş anlamlı (bool -> T) -> T,
  • Biz yapıcı isterse cyedi argüman alır, bir fonksiyonu olarak görüntüleyebilmek yedi elemanları ile bazı önceden tanımlanmış bir türüdür.(seven -> T) -> Tseven
  • aynı zamanda csınırsız sayıda argüman alan bir kurucuya sahip olabiliriz , bu bir işlevdir (nat -> T) -> T.

Bu örnekler bir kurucunun genel biçiminin

c : (A -> T) -> T

dediğimiz yerde Arity ait ve biz düşünmek alır yapıcı olarak Çeşidi -çok argümanları bir öğesini üretmek .AccATT

Burada çok önemli bir şey var: Biz tanımlanmadan önce ajanslar tanımlanmalı T, aksi takdirde inşaatçıların ne yapması gerektiğini söyleyemeyiz. Birisi bir kurucuya sahip olmaya çalışırsa

broken: (T -> T) -> T

sonra "kaç argüman brokenalır?" sorusu iyi bir cevabı yok. Bu soruyu " T-many argümanları alır" ile cevaplamaya çalışabilirsiniz , ancak bu gerçekleşmeyecektir, çünkü Thenüz tanımlanmamıştır. Bir tür Tve injektif bir fonksiyon bulmak için süslü sabit nokta teorisini kullanarak cunundrum'dan çıkmaya çalışabiliriz (T -> T) -> Tve başarılı oluruz, ancak aynı zamanda indüksiyon prensibini Tde yol boyunca kırabiliriz . Yani, böyle bir şeyi denemek sadece kötü bir fikir.

λvλvcB

c : B * (A -> T) -> T

Nitekim, birçok kurucular bu şekilde tekrar yazılabilir, ama hepsi değil, biz yani biz izin vermelidir, bir adım daha ihtiyacımız Aiçin bağımlı üzerinde B:

c : (∑ (x : B), A x -> T) -> T

Bu, bir endüktif tip için bir kurucunun son şeklidir. Aynı zamanda W-tiplerinin tam olarak ne olduğudur. Form o kadar genel ki, sadece tek bir kurucuya ihtiyacımız var c! Gerçekten, eğer bunlardan iki tane varsa

d' : (∑ (x : B'), A' x -> T) -> T
d'' : (∑ (x : B''), A'' x -> T) -> T

o zaman onları bir araya getirebiliriz

d : (∑ (x : B), A x -> T) -> T

nerede

B := B' + B''
A(inl x) := A' x
A(inr x) := A'' x

Bu arada, genel formu köriyorsak, bunun

c : ∏ (x : B), ((A x -> T) -> T)

bu da insanların kanıt asistanlarına yazdıklarına daha yakın. İspat asistanları, inşaatçıları uygun yollarla yazmamıza izin verir, ancak bunlar yukarıdaki genel forma eşdeğerdir (egzersiz!).


1
Tekrar teşekkürler Andrej öğle yemeğimden sonra sindirmem benim için en zor şey olacak. Şerefe.
Pushpa

9

Badİşlevinin ilk oluşumuna 'negatif' denir, çünkü bir işlev bağımsız değişkenini temsil eder, yani işlev okunun solunda bulunur (bkz . Philip Wadler tarafından ücretsiz olarak yinelenen türler). Teriminin 'olumsuz bir pozisyona' kökeni kavramına kaynaklanmaktadır tahmin contravariance ( 'kontra' araçları ters).

Türün negatif konumda tanımlanmasına izin verilmez, çünkü birisini kullanarak sonlandırmayan programlar yazabilir, yani güçlü normalizasyon varlığında başarısız olur (daha fazlası aşağıdadır). Bu arada, 'katı pozitiflik' kuralının adının nedeni budur: negatif pozisyonlara izin vermiyoruz.

BadSonlandırmaya neden olmadığı için ikinci oluşumuna izin veriyoruz ve yinelenen bir veri türünde ( yapıcısının son okundan önceBad ) bir noktada tanımlanmış ( ) türünü kullanmak istiyoruz .

Aşağıdaki tanım olmadığını anlamak önemlidir değil sıkı pozitiflik kuralını ihlal ediyor.

data Good : Set where
  good : Good → Good → Good

Kural, yalnızca yapıcı argümanları için geçerlidir (her ikisi Goodde bu durumdadır ) ve bir kurucu için geçerli değildir (ayrıca bkz. Adam Chlipala'nın " Bağımlı Türlerle Sertifikalı Programlama ").

Katı pozitifliği ihlal eden başka bir örnek:

data Strange : Set where
  strange : ((Bool → Strange) → (ℕ → Strange)) → Strange
                       ^^     ^
            this Strange is   ...this arrow
            to the left of... 

Negatif pozisyonlar hakkındaki bu cevabı da kontrol etmek isteyebilirsiniz .


Feshetmeyle ilgili daha fazla bilgi ... Referans verdiğiniz sayfa bazı açıklamalar içerir (Haskell'deki bir örnekle birlikte):

Kesinlikle olumlu olmayan bildirimler reddedilir çünkü biri onları kullanarak sonlandırıcı olmayan bir işlev yazabilir. Yukarıdan Bad veri türünü kullanarak bir döngü tanımı nasıl yazabileceğini görmek için bkz . BadInHaskell .

Ocaml'da özyinelemeli davranışı doğrudan (!) Kullanmadan özyinelemeli davranışın nasıl uygulanacağını gösteren benzer bir örnek :

type boxed_fun =
  | Box of (boxed_fun -> boxed_fun)

(* (!) in Ocaml the 'let' construct does not permit recursion;
   one have to use the 'let rec' construct to bring 
   the name of the function under definition into scope
*)
let nonTerminating (bf:boxed_fun) : boxed_fun =
  match bf with
    Box f -> f bf

let loop = nonTerminating (Box nonTerminating)

nonTerminatingFonksiyon "paketten çıkarır" orijinal argümanı olan argüman ve elma ondan bir fonksiyonu. Burada önemli olan, çoğu tip sistemin fonksiyonların kendilerine geçmesine izin f fvermemesidir, bu nedenle, fdaktiloyu tatmin edecek bir tür olmadığından , tipik bir kontrol olmayacaktır. Tip sistemlerinin kullanılmasının nedenlerinden biri, kendi kendine uygulamayı devre dışı bırakmaktır ( buraya bakın ).

Yukarıda tanıttığımız gibi kaydırma veri türleri tutarsızlık yolunda bu barikatı atlatmak için kullanılabilir.

Sonlandırıcı olmayan hesaplamaların mantık sistemlerine tutarsızlıklar getirdiğini eklemek istiyorum. Agda ve Coq durumunda, Falsetümevarımsal veri türünde herhangi bir kurucu yoktur, bu nedenle hiçbir zaman False türünde bir kanıt terimi oluşturamazsınız. Fakat sonlandırıcı olmayan hesaplamalara izin verildiyse , bunu örneğin Coq'ta yapabilirdi:

Fixpoint loop (n : nat) : False = loop n

Sonra loop 0daktilo vererek loop 0 : False, Curry-Howard yazışmaları altında yanlış bir önerimiz olduğu anlamına gelir.

Upshot : tümevarım tanımları için katı pozitiflik kuralı, mantık için felaket olan sonlandırılmamış hesaplamaları önler.


Şimdi kafam karıştı. Özel veri İyi: İyi olduğu yeri ayarlayın: İyi → İyi →. Bir saat içinde anlamaya ve geri dönmeye çalışacağız /
Pushpa

Kural, kurucunun kendisi için geçerli değildir, yalnızca argümanları için geçerlidir, yani bir kurucu tanımının en üst düzeyindeki oklar önemli değildir. Ayrıca başka (dolaylı) ihlal eden bir örnek daha ekledim.
Anton Trunov
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.