Dato un linguaggio L definito da una macchina di Turing che lo decide, è possibile determinare algoritmicamente se L si trova in NP?
Dato un linguaggio L definito da una macchina di Turing che lo decide, è possibile determinare algoritmicamente se L si trova in NP?
Risposte:
No. Innanzitutto, secondo il Teorema di Rice, questa è una proprietà delle TM che dipende solo dalla lingua che calcolano, quindi non può essere calcolabile.
Ma, più di questo, è noto che l'insieme di indici di (ovvero l'insieme di TM che calcolano le lingue in ) è ( nella gerarchia aritmetica della calcolabilità, non il gerarchia polinomiale).
Domande come questa sono state indagate per la prima volta da Hajek . Per di più, vedi ad esempio questo articolo di Ken Regan.
Alcune altre grandi pepite dal giornale di Hajek:
La risposta alla tua domanda letterale è no, come ha sottolineato Joshua Grochow.
Tuttavia, come affermato da Holger, è possibile verificare in tempo lineare se la macchina di Turing non deterministica (NTM) "si auto-sveglia" e si ferma dopo n ^ k passi per qualche costante k, attraverso un modo standard di simulazione di un orologio (come il codice sotto). Spesso quando un documento o un libro suggerisce (erroneamente) che è possibile determinare se un NTM è tempo polinomiale, questo è ciò che realmente significano. Forse è per questo che hai posto la domanda? (Ho avuto la stessa domanda quando ho appreso per la prima volta la teoria della complessità e da qualche parte ho visto l'affermazione che è possibile verificare se una MT è un poli-tempo.) La vera domanda è perché si potrebbe desiderare di fare questo, che discuterò di seguito dopo aver spiegato come .
Esistono molti modi per aggiungere una tale funzione di orologio. Ad esempio, immagina sull'input x di lunghezza n, eseguendo alternativamente un'istruzione dell'algoritmo primario in fase di clock, e quindi un'istruzione dell'algoritmo seguente, che termina in (qualcosa di simile a) passaggi n ^ k:
per i_1 = 1 a n per i_2 = 1 a n ... per i_k = 1 a n no-op; ritorno;
Se il codice sopra riportato ritorna prima che l'algoritmo primario si interrompa, quindi interrompere l'intero calcolo (diciamo, con rifiuto).
L'algoritmo che decide se un NTM è di questa forma, se interpretato come un tentativo di un algoritmo per decidere se il suo input è un NTM polifunzionale, segnalerà alcuni falsi negativi: alcuni NTM sono garantiti per arrestarsi in tempo polinomiale, anche se non si alternano eseguendo un'istruzione di un algoritmo con un'istruzione di un orologio come il codice sopra (quindi verrebbero rifiutati nonostante fossero poli-tempi).
Ma non ci sono falsi positivi. Se un NTM supera il test, si arresta definitivamente nel tempo polinomiale, quindi definisce un linguaggio NP. Tuttavia, forse il comportamento del suo algoritmo primario sottostante è alterato, se l'orologio a volte si esaurisce prima che l'algoritmo primario si interrompa, causando il rifiuto del calcolo anche se l'algoritmo primario potrebbe aver accettato se fosse stato concesso il tempo sufficiente per terminarlo. Pertanto il linguaggio deciso può essere diverso da quello dell'algoritmo primario. Ma, e questa è la chiave, se l'algoritmo primario in esecuzione è in realtà un algoritmo del tempo polinomiale in esecuzione nel tempo p (n) e se la costante k nell'orologio è abbastanza grande da n ^ k> p (n), allora l'algoritmo primario si fermerà sempre prima che scada il tempo. In questo caso, la risposta dell'algoritmo primario non viene modificata, quindi l'algoritmo primario e il NTM con clock che lo simula decidono quindi lo stesso linguaggio NP.
Perché questo è importante? Ciò significa che è possibile "enumerare tutti i linguaggi NP" (che, come ho detto, è spesso inesatto nella letteratura dichiarata come "decidere se un dato NTM è un poli-tempo" o "enumerare tutti i poli-tempo NTM"). Più precisamente, è possibile enumerare un elenco infinito di M_1 M_2 di NTM, ..., con le proprietà che
Ciò che non accade è che ogni NTM polinomiale è nell'elenco. Ma ogni linguaggio NP ha un numero infinito di NTM che lo rappresentano. Pertanto, si garantisce che ogni linguaggio NP abbia almeno alcuni dei suoi NTM rappresentativi nell'elenco, in particolare tutti quelli NTM con un indice k abbastanza grande che n ^ k supera il tempo di esecuzione di M_k.
Ciò è utile per eseguire trucchi come la diagonalizzazione, che richiedono un elenco algoritmico di elenchi infiniti (o illimitati) di tutti i linguaggi NP. E, naturalmente, tutta questa discussione si applica a molti altri tipi di macchine oltre alle NTM poli-tempo, come le TM deterministiche poli-tempo.