Una macchina di Turing non deterministica accetta se almeno un percorso accetta; rifiuta solo se rifiutano tutti i percorsi. Questa asimmetria rende difficile "capovolgere le risposte".
Ad esempio, supponiamo di avere una macchina di Turing non deterministica che ha due percorsi per l'input w : uno accetta, l'altro rifiuta. M ha almeno un percorso di accettazione per w , quindi accetta. Supponiamo di voler produrre una macchina che accetti esattamente gli input che M rifiuta. Il primo ovvio tentativo è di prendere M e far rifiutare i suoi stati accettanti, e accettarne i suoi stati rifiutanti. M ha un percorso di accettazione per w e un percorso di rifiuto; questa nuova macchina M ' ha un percorso di rifiuto e un percorso di accettazione. Quindi accetta ancora w , che avrebbe dovuto rifiutare!MwMwMMMwM'w
Una macchina non deterministica non può guardare tutti i suoi percorsi contemporaneamente e agire in base a ciò che fanno tutti quei percorsi. Se vuoi, puoi pensarlo come una forma di parallelismo in cui ai fili è proibito comunicare tra loro. Quando tutti i thread hanno terminato il programma deve porsi la seguente domanda: "Almeno uno dei miei thread ha accettato?" Se la risposta è sì, è legalmente obbligata ad accettare; se la risposta è no, è legalmente obbligata a rifiutare. Non può fare nient'altro.
Quando simuli una macchina non deterministica usando un'altra, M ′ , ogni percorso di M ′ simula un percorso di M e vede solo quel percorso. Non può dire "Se tutti quegli altri percorsi rifiutati, accetterò" perché non riesce a vedere gli altri percorsi; può solo vedere se stesso. Quindi tutto ciò che si potrebbe dire sono cose come "Se il percorso che ho simulato accettato, lo rifiuterò" o "Se il percorso che ho simulato accettato, accetterò anch'io". Quindi, alla fine del calcolo, la macchina deve dire "Se accetto anche uno dei miei percorsi, accetterò anch'io", portando al problema che ho descritto sopra. Per invertire il comportamento di M , ogni percorso di M ′MM'M'MMM'deve dire: "Se il percorso che ho simulato accettato, rifiuto; altrimenti, accetto" e, alla fine del calcolo, la macchina deve dire: "Se tutti i miei percorsi accettati, accetto; altrimenti, rifiuto ". Questo perché, se tutti i percorsi del simulatore sono stati accettati, ciò significa che tutti i percorsi di sono stati respinti, quindi M ha rifiutato, quindi il simulatore deve accettare. Ma il simulatore non è una macchina di Turing non deterministica valida perché non utilizza il criterio di accettazione obbligatorio per legge. Non può farlo.MM
L'unico modo in cui sappiamo per capire se una macchina non deterministica rifiuta il suo input è provare ogni possibile percorso e verificare che tutti rifiutino. Dopotutto, se anche uno di loro accettasse, la macchina accetterebbe l'input. Ma provare ogni possibile percorso è esponenzialmente più lento del provare solo uno.