Teoria della realizzabilità: differenza di potenza tra il calcolo Lambda e le macchine di Turing


48

Ho tre domande secondarie correlate, che sono evidenziate dai seguenti punti elenco (no, non potrebbero essere divisi, se ti stai chiedendo). Andrej Bauer ha scritto, qui , che alcune funzioni sono realizzabili attraverso una macchina di Turing, ma non tramite lambda-calcolo. Un passo fondamentale del suo ragionamento è:

Tuttavia, se usiamo il calcolo lambda, allora [il programma] c dovrebbe calcolare un numero che rappresenta una macchina di Turing da un termine lambda che rappresenta una funzione f. Questo non può essere fatto (posso spiegare perché, se lo fai come domanda separata).

  • Vorrei vedere una spiegazione / prova informale.

Non vedo come applicare il teorema di Rice qui; si applicherebbe al problema "questa macchina da presa T e questo termine lambda L equivalgono?", perché applicare questo predicato a termini equivalenti dà lo stesso risultato. Tuttavia, la funzione richiesta potrebbe calcolare TM diverse, ma equivalenti, per termini lambda diversi ma equivalenti.

  • Inoltre, se il problema riguarda l'introspezione di un termine lambda, penso che passare anche una codifica di Gödel di un termine lambda sarebbe accettabile, no?

Da un lato, dato che il suo esempio riguarda il calcolo, nel calcolo lambda, il numero di passaggi necessari a una Turing Machine per completare un determinato compito, non sono molto sorpreso.

  • Ma poiché qui il lambda-calcolo non è in grado di risolvere un problema relativo alla macchina di Turing, mi chiedo se si possa definire un problema simile per il calcolo di lambda e dimostrarlo irrisolvibile per le macchine di Turing, oppure esiste effettivamente una differenza di potere a favore di Turing Machines (che mi sorprenderebbe).

Risposte:


56

John Longley ha pubblicato un articolo di indagine molto approfondito che discute delle questioni coinvolte, "Nozioni di calcolabilità di tipo superiore" .

L'idea di base è che la tesi di Church-Turing riguarda solo le funzioni da - e c'è di più al calcolo di così! In particolare, quando scriviamo programmi, facciamo uso di funzioni di tipo superiore (come ).NN(NN)N

Per definire completamente un modello di calcolo di tipo superiore, è necessario specificare la convenzione di chiamata per le funzioni, al fine di consentire a una funzione di chiamare un'altra funzione che riceve come argomento. Nel calcolo lambda, la convenzione di chiamata standard è che rappresentiamo le funzioni in base ai termini lambda e l'unica cosa che puoi fare con un lambda nel calcolo lambda è applicarla. Nelle codifiche tipiche con le macchine di Turing, passiamo funzioni come argomenti fissando una particolare codifica Godel e quindi stringhe che rappresentano l'indice della macchina che si desidera passare come argomento.

La differenza nella codifica significa che è possibile analizzare la sintassi dell'argomento con una codifica in stile TM e non è possibile con una rappresentazione lambda-calcolo standard. Quindi, se ricevi un termine lambda per una funzione di tipo , puoi testare il suo comportamento solo passando particolari 's: non puoi analizzare la struttura del termine in alcun modo. Queste non sono informazioni sufficienti per capire il codice del termine lambda.NNn

Una cosa degna di nota è che con tipi più alti, se una lingua è meno espressiva in un ordine, è più espressiva in ordine superiore, perché le funzioni sono contraddittorie. Allo stesso modo ci sono funzioni che puoi scrivere in LC che non puoi con una codifica in stile TM (perché si basano sul fatto che puoi passare argomenti funzionali e sapere che il ricevitore non può guardare all'interno della funzione che gli dai) .

EDIT: Ecco un esempio di una funzione definibile in PCF, ma non nelle codifiche TM + Goedel. Dichiarerò la isAlwaysTruefunzione

 isAlwaysTrue : ((unit → bool) → bool) → bool

che dovrebbe restituire vero se il suo argomento ignora il suo argomento e restituisce sempre vero, dovrebbe restituire falso se il suo argomento restituisce falso su qualsiasi input e va in un ciclo se il suo argomento va in loop su qualsiasi input. Possiamo definire questa funzione abbastanza facilmente, come segue:

isAlwaysTrue p = p (λ(). true) ∧ p (λ(). false) ∧ p (λ(). ⊥)

dov'è il calcolo del loop ed è l'operatore e su booleani. Questo funziona perché ci sono solo tre abitanti di unit → boolPCF e quindi possiamo elencarli esaustivamente. Tuttavia, in un modello di stile con codifica TM + Goedel, è ppossibile verificare quanto tempo impiega l'argomento per restituire una risposta e restituire risposte diverse in base a ciò. Quindi l'implementazione di isAlwaysTruewith TMs non riuscirebbe a soddisfare le specifiche.


1
questo è un sondaggio eccellente. grazie per il link!
Suresh Venkat,

Mi sono appena reso conto di aver dimenticato di accettare una risposta, anche se intendevo accettare la tua. Scusate!
Blaisorblade,

"La differenza nella codifica significa che è possibile analizzare la sintassi dell'argomento con una codifica in stile TM e non è possibile con una rappresentazione lambda-calcolo standard.": Ma se si dispone di rappresentazioni per la composizione di funzioni? Inoltre, ciò che dici sembra suggerire che HOL è più di una teoria di un calcolo lambda tipizzato, è più di questo?
Hibou57,

Inoltre, che dire di questo: cs.virginia.edu/~evans/cs150/classes/class39/lecture39.pdf . È sbagliato in qualche modo?
Hibou57,

Caro Neel, hai un esempio per una funzione che può essere realizzata nel modello di calcolo lambda ma non nel modello di Turing?
Ingo Blechschmidt,

29

Ciò che Neel ha detto, e anche il seguente.

Vorrei enfatizzare ( ancora , ancora e ancora ) quella rappresentazione delle questioni di input e output. Se ci è permesso cambiare le rappresentazioni, possiamo ottenere qualsiasi cosa (per esempio, rendere calcolabile una data funzione). Quindi, passare da una rappresentazione di funzioni di -terms a una rappresentazione di numeri di Gödel non è accettabile se il nostro modello di calcolo è -calculus (perché quindi l'operazione di curry diventa incomputabile da -calculus).NNλλλ

Un'affermazione che è realizzabile nel modello -term ma non nel modello della macchina di Turing è "non tutte le funzioni da hanno un codice Gödel", che è piuttosto sciocco. Proverò a trovarne uno migliore e a modificare questa risposta.λNN


Modifica il 07-10-2013: ecco cosa intendevo per "curry diventa incomprensibile". Supponiamo di usare il non tipizzato -calculus come nostro modello computazionale, ma poi decidiamo che dovremmo rappresentare le mappe con i codici Gödel (delle macchine di Turing, codificate come numeri della Chiesa). Sembra innocuo, vero? Dopo tutto crediamo che il mantra "Macchine di Turing e -calculus sono equivalenti".λNNλ

Bene, affinché questa nuova rappresentazione sia effettivamente una rappresentazione valida di , dobbiamo anche realizzare l'applicazione e il curry (perché "rappresentare le funzioni" significa la stessa cosa di "rappresentare un oggetto esponenziale "). Specificamente, è necessario un -termine tale che, quando la Chiesa globalmente rappresenta quindi è rappresentato da . (Qui scrivo per il numero della Chiesa che rappresenta il numero .) TaleNNλappn¯f:NNf(k)appn¯k¯n¯nappè prontamente disponibile perché equivale a un interprete per macchine di Turing, implementato nel -calculus.λ

Ma che ne dici di curry? Per questo abbiamo bisogno di quanto segue. Supponiamo che sia un insieme rappresentato. Dato qualsiasi mappa calcolata da un -term , dobbiamo mostrare che la trasposizione è anche calcolato da alcuni -term . Ma prendiamo in considerazione l'esempio in cui è l'insieme di fmaps rappresentato da -terms e è l'applicazione. Quindi sarebbe una mappa che funge da identità suXf:X×NNλtf~:X(NN)λsXNNλff~NN, ma il suo realizzatore è un -term che converte -terms che rappresentano le mappe nei corrispondenti codici di Gödel. Un tale -term non esiste (ad esempio perché sarebbe discontinuo in un modello semantico topologico).λλNNλ

Potresti tentare di obiettare che non avrei dovuto usare l'insieme rappresentato specifico delle mappe da rappresentato da -terms, perché abbiamo "concordato" che quelle dovrebbero essere rappresentate dai codici di Gödel . Ma avresti torto. Prima di tutto, avrei potuto usare una diversa con una prova più complicata che ti avrebbe eluso ma avrebbe comunque ottenuto lo stesso risultato. In secondo luogo, è presente nella categoria e la definizione di esponenziale richiede che il curry funzioni rispetto a tutti gli oggetti. Devi rispettare la categoria. Non puoi semplicemente macellarlo in modo casuale ed estrarre alcuni oggetti (beh, puoi ma poi sei un macellaio).XNNλXX


2
sto ancora aspettando quell'esempio migliore ...
Jacques Carette,

1
Bene, posso pensare a molte affermazioni che sono realizzabili con le macchine di Turing ma non con -terms. Suppongo che tu voglia il contrario. Hmmm. λ
Andrej Bauer,

Non capisco come il curry possa diventare incomutabile. Dovresti essere in grado di riutilizzare il teorema di smn, poiché la sua dimostrazione costruisce una funzione sui dati del primo ordine (naturali). Secondo la tesi di Church-Turing, questo comportamento sui naturali può essere implementato come termine lambda (che utilizza le funzioni native internamente, ma non vedo come sia proibito). Allo stesso modo si può dimostrare il teorema dell'utmo, quindi secondo il tuo post dovremmo fare. Cosa mi sto perdendo?
Blaisorblade,

1
Ho spiegato nella risposta che cosa significa che il curry diventa incomprensibile, vale a dire che l'oggetto suggerito non è un esponenziale nella categoria degli insiemi rappresentati.
Andrej Bauer,

Grazie per la spiegazione! Purtroppo non posso votare di nuovo. Posso seguire la maggior parte dei dettagli tecnici; Non ho familiarità con i modelli topologici, ma ho comunque familiarità con "non è possibile ispezionare le funzioni nella programmazione funzionale / calcolo λ". Il tuo ultimo paragrafo spiega anche perché non riesco a passare attraverso smn, perché il curry fornito da smn produce nuovamente i codici Gödel, non le funzioni standard di cui hai bisogno. Mediterò su quel paragrafo.
Blaisorblade,
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.