In che modo il combinatore Y esemplifica "Incoerenza del calcolo lambda"?


44

Sulla pagina Wikipedia di Combinatori a virgola fissa è scritto il testo piuttosto misterioso

Il combinatore Y è un esempio di ciò che rende incoerente il calcolo Lambda. Quindi dovrebbe essere considerato con sospetto. Tuttavia è sicuro considerare il combinatore Y quando definito solo nella logica matematica.

Sono entrato in una sorta di romanzo di spionaggio? Cosa nel mondo si intende con le affermazioni che -calculus è "incoerente" e che dovrebbe essere "considerato con sospetto" ?λ


3
FWIW, quel paragrafo è stato nell'articolo di Wikipedia da gennaio 2014, quando è stato introdotto in questa massiccia riscrittura di quasi l'intero articolo .
Ilmari Karonen,

Risposte:


51

È ispirato da eventi reali, ma il modo in cui è affermato è appena riconoscibile e "dovrebbe essere considerato con sospetto" è una sciocchezza.

La coerenza ha un significato preciso nella logica: una teoria coerente è quella in cui non è possibile provare tutte le affermazioni. Nella logica classica, questo è equivalente alla mancanza di una contraddizione, cioè una teoria è inconsistente se e solo se v'è una dichiarazionetale che la teoria dimostra siae la sua negazione.AA¬A

Cosa significa questo per quanto riguarda il calcolo lambda? Niente. Il calcolo lambda è un sistema di riscrittura, non una teoria logica.

È possibile visualizzare il calcolo lambda in relazione alla logica. Considera le variabili come rappresentative di un'ipotesi in una prova, le astrazioni lambda come prove in una certa ipotesi (rappresentata dalla variabile), e l'applicazione come la messa insieme di una prova condizionale e una prova dell'ipotesi. Quindi la regola beta corrisponde a semplificare una dimostrazione applicando il modus ponens , un principio fondamentale della logica.

Questo, tuttavia, funziona solo se la dimostrazione condizionale è combinata con una dimostrazione della giusta ipotesi. Se hai una prova condizionale che assume e hai anche una prova di , non puoi combinarli insieme. Se si desidera far funzionare questa interpretazione del calcolo lambda, è necessario aggiungere un vincolo che solo le prove dell'ipotesi corretta vengano applicate alle prove condizionali. Questo è chiamato un sistema di tipi e il vincolo è la regola di battitura che dice che quando si passa un argomento a una funzione, il tipo di argomento deve corrispondere al tipo di parametro della funzione.n=3n=2

La corrispondenza Curry-Howard è un parallelo tra calcoli tipizzati e sistemi di prova.

  • i tipi corrispondono alle dichiarazioni logiche;
  • i termini corrispondono alle prove;
  • i tipi abitati (cioè i tipi tali che esiste un termine di quel tipo) corrispondono alle affermazioni vere (ovvero le affermazioni tali che esiste una prova di tale affermazione);
  • la valutazione del programma (vale a dire regole come la beta) corrisponde alle trasformazioni delle prove (che avrebbero trasformato meglio le prove corrette in prove corrette).

Un calcolo tipizzato che ha un combinatore di punti fissi come consente di costruire un termine di qualsiasi tipo (provare a valutare ), quindi se si prende l'interpretazione logica attraverso la corrispondenza Curry-Howard, si ottiene una teoria incoerente. Vedi Il combinatore Y contraddice la corrispondenza Curry-Howard? per ulteriori dettagli.YY(λx.x)

Questo non è significativo per il calcolo lambda puro, vale a dire per il calcolo lambda senza tipi.

In molti calcoli tipizzati, è impossibile definire un combinatore a punto fisso. Questi calcoli tipizzati sono utili rispetto alla loro interpretazione logica, ma non come base per un linguaggio di programmazione completo di Turing. In alcuni calcoli tipizzati, è possibile definire un combinatore a punto fisso. Quei calcoli digitati sono utili come base per un linguaggio di programmazione completo di Turing, ma non rispetto alla loro interpretazione logica.

In conclusione:

  • Il calcolo lambda non è "incoerente", tale concetto non si applica.
  • Un calcolo lambda tipizzato che assegna un tipo a ogni termine lambda è incoerente. Alcuni calcoli lambda digitati sono così, altri rendono alcuni termini non tipizzabili e sono coerenti.
  • I calcoli lambda tipizzati non sono l'unica ragion d'essere per il calcolo lambda, e persino i calcoli lambda tipizzati incoerenti sono strumenti molto utili - solo per non provare le cose.

2
Wow, c'è molto da disimballare qui. Grazie per la spiegazione dettagliata. Mi ci vorrà un po 'di tempo per provare a farlo tutto.
Ben I.

4
Tecnicamente, la visualizzazione non tipizzata come un ho digitato, è possibile effettuare una corrispondenza tra il CH lambda calcolo tipizzato e una logica. È solo una logica molto, molto noiosa (e sicuramente incoerente). Assistenti di prova come NuPRL confondono un po 'le acque. La lingua dell'oggetto di NuPRL contiene il calcolo lambda non tipizzato e puoi facilmente definire il combinatore Y. NuPRL divide le cose in modo un po 'diverso, quindi ha un sistema di raffinamento del tipo piuttosto che un sistema del tipo, e l'esercizio non è quello di produrre termini ben digitati ma di produrre le derivazioni di battitura.
Derek Elkins,

Sono solo io, o è strano imporre il paradigma "proposizioni come tipi" sul calcolo lambda non tipizzato? Ho sempre visto le persone parlare di logica nel calcolo lambda non tipizzato introducendo oggetti specifici come valori booleani truee false, e le proposizioni erano cose che avevano un valore booleano valutato. (e sono state considerate solo proposizioni sul dominio delle cose in cui produce un valore booleano).

Trivial (prova ogni affermazione) e contiene contraddizioni sono due proprietà diverse. Mentre sono equivalenti nella logica classica, per le logiche paraconsistenti un sistema può essere incoerente e non banale.
Taemyr,

1
"Incoerente", per una logica basata sul calcolo λ, significa "assegna ogni tipo a un termine", non "assegna un tipo a ogni termine" (sebbene il primo segua da quest'ultimo); ci sono molte lingue basate sul calcolo λ che corrispondono a logiche incoerenti ma dove non tutti i termini del calcolo λ sono tipizzabili.
Jonathan Cast

6

Vorrei aggiungerne uno a quello che ha detto @Giles.

La corrispondenza Curry-Howard fa un parallelo tra -terms (più specificamente, i tipi di -terms) e i sistemi di prova.λλ

Ad esempio, ha tipo (dove significa "funzione da a "), che corrisponde all'istruzione logica . La funzione ha tipo , corrispondente a . Siamo in grado di convertire qualsiasi tipo di lambda-calcolo in una tautologia logica, in un certo senso, "pattern matching" su funzioni.λx.λy.xa(ba)ababa(ba)λx.λy.xy(ab)(ab)(ab)(ab)

Il problema sorge quando consideriamo il combinatore Y, definito come . Il problema sorge perché ci aspettiamo che il combinatore Y, come un combinatore "punto fisso", abbia tipo (perché prende una funzione da un tipo a quello stesso tipo e trova un fisso- punto per quella funzione, che ha quel tipo). La conversione di questo in un'istruzione logica produce . Questa è una contraddizione:λf.(λx.f(xx))(λx.f(xx))(aa)a(aa)a

(aa)aaa(¬a¬a)(¬a)¬a¬a

Accettare in un sistema di tipi comporta la coerenza del sistema di tipi. Questo significa che possiamo farlo entrambi(aa)a

  • Non consentire tipi come in un sistema di tipi (questo ti dà il semplice digitato -calculus ), o(aa)aλ
  • Vivere con il sistema di tipi incoerente come sistema di deduzione logica.

1
CH collega tipi a proposizioni, programmi a prove e persino riduzioni a trasformazioni di prove. Non si tratta solo di tipi. Successivamente, solo i tipi abitati corrispondono alle tautologie. è un tipo di calcolo lambda (polimorfico) anche se nessun termine lo abita. Supponendo che intendi tipi come , quindi accettare tali tipi è perfettamente corretto, il problema è se quel tipo ha un abitante o no. Al contrario, possiamo aggiungere termini primitivi a STLC che renderanno incoerente la logica corrispondente senza estendere il sistema di tipi. a,b.aba.(aa)a
Derek Elkins,

@DerekElkins, che tipo di termini primitivi? Inoltre, se capisco correttamente, questo è solo per supporre (a -> a) -> a è sempre abitata che produce l'incoerenza? Quindi non c'è più incoerenza con un linguaggio di programmazione che richiede una prova di terminazione? O c'è qualche altra fonte di incoerenza nel calcolo lambda non tipizzato o tipizzato Hindley-Milner?
Hibou57,

1
@ Hibou57 Termini primitivi, cioè costanti, come fix. Si può solo affermare che c'è una costante per ogni tipo . Questo ti darà già un sistema incoerente per quanto riguarda CH, poiché implicherebbe che ogni tipo è abitato da . Puoi anche aggiungere -rules per calcolare , e questo trasformerebbe, diciamo, lo STLC con i naturali in un sistema completo di Turing, ma non devi aggiungere queste regole di calcolo e il sistema sarebbe ancora incoerente. fixAAfix(λx.x)δfix
Derek Elkins,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.