Domanda

Do non esiste Turing completo digitato lambda calcoli? Se sì, quali sono alcuni esempi?

È stato utile?

Soluzione

Sì, certo. Molti digitato lambda calcoli accettano solo termini fortemente normalizzare, in base alla progettazione, in modo da essi non possono esprimere i calcoli arbitrari. Ma un sistema di tipo può essere qualsiasi cosa ti piace; renderlo abbastanza ampio, e si può esprimere tutte le computazioni deterministiche.

Un sistema tipo banale che comprende un frammento Turing-complete del lambda calcolo è quella che accetta ogni termine così-digitato (con top tipo ). $$ \ dfrac {} {\ Gamma \ vdash M: \ top} $$

Più praticamente, staticamente tipizzato linguaggi di programmazione funzionale hanno al loro centro un digitato lambda calcolo che permette una punto fisso combinatore pure digitato-. Per esempio, iniziare con la semplicemente digitato lambda calcolo (o il sistema di tipo ML o sistema F o qualsiasi altro sistema tipo di scelta) e aggiungere una regola che rende un po 'combinatore punto fisso come $ \ mathbf {Y} = \ lambda f. (\ Lambda x. F (x \, x)) (\ lambda x f (. X \, x)) $ ben tipato. $$ \ Dfrac {\ Gamma \ vdash f: T \ rightarrow T} {\ Gamma \ vdash \ mathbf {Y} \, f: T} \ qquad \ Dfrac {\ Gamma \ vdash f: T \ rightarrow T} {\ Gamma \ vdash (\ lambda x f (x \, x).) (\ Lambda x f (x \, x).): T} $$ Le regole sopra esposte sono piuttosto goffo, come fanno termini come $ \ mathbf {Y} \, f $ ben tipato, anche se i loro elettori non sono ben digitati - non sono pienamente compositiva. Una semplice correzione è quello di aggiungere un combinatore punto fisso come costante lingua e fornire una regola delta per esso; allora è una semplice questione di avere un sistema tipo e semantica a riduzione con tipo conservazione . Non una fuga dalla lambda calcolo puro nel regno della lambda calcolo con costanti. $$ \ begin {raccogliere *} \ Dfrac {} {\ Gamma \ vdash \ textbf {} fix: (T \ rightarrow T) \ rightarrow T} \\ \ Textbf {fix} \, f \ f (\ textbf {fix} \, f) \\ \ End {raccogliere *} $$

L'aderenza al lambda calcolo puro, un sistema di tipo interessante è il lambda calcolo con tipi intersezione.

$$ \ Dfrac {\ Gamma \ vdash M: T_1 \ quad \ Gamma \ vdash M: T_2} {\ Gamma \ vdash M: T_1 \ wedge T_2} (\ Cuneo I) \ Qquad \ qquad \ Dfrac {} {\ Gamma \ vdash M: \ top} (\ I top) $$

I tipi intersezione hanno proprietà interessanti per quanto riguarda la normalizzazione:

  • Un lambda-termine può essere digitato senza utilizzare il $ \ cima ho $ regola se e solo se è fortemente normalizzante.
  • Un lambda-termine ammette un tipo che non contiene $ \ top $ se e solo se ha una forma normale.

Caratterizzazione di lambda-termini che hanno tipi unione per una comprensione del perché tipi intersezione hanno una notevole portata tale.

In modo da avere un sistema di tipo che definisce un linguaggio Turing-complete (dal momento che ogni termine è ben digitato-), e una semplice caratterizzazione di terminazione calcoli. Naturalmente, poiché questo tipo di sistema caratterizza normalizzazione, non è decidibile.

Un'osservazione sui nomi delle regole $ (\ alto I) $ e $ (\ wedge I) $: non hanno alcun senso formale, ma essi sono scelti deliberatamente. il $ $ I sta per “introduzione”, perché queste sono le regole di introduzione - introducono il simbolo ($ \ wedge $ o $ \ top $) nel tipo di sotto della linea. Dually, troverete le regole di eliminazione, quando compare il simbolo sopra la linea, ma non al di sotto. Ad esempio, la regola per TYPECHECK un'espressione lambda nel lambda calcolo semplicemente digitato è la regola introduzionea $ \ rightarrow $, e la regola per TYPECHECK un'applicazione è la regola di eliminazione per $ \ rightarrow $.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a cs.stackexchange
scroll top