Ci sono problemi esistenti che non sarebbero risolvibili con un oracolo di arresto?


11

Capisco che la maggior parte dei problemi sono banali se è disponibile un oracolo di arresto (o, penso equivalentemente, iper-computazione). Tuttavia, l'applicazione dell'argomento che mostra il problema di Halting è impossibile per una macchina di Turing mostra anche che è impossibile per un oracolo di Turing + decidere il problema di Halting per un oracolo di Turing +. Esistono esempi concreti, pratici, di problemi irrisolvibili da un oracolo che si ferma?

Nota: per "oracolo" intendo l'oracolo per una macchina Turing standard, non una TM con un oracolo stesso.


2
Ci sono problemi "arbitrariamente indecidibili", vedi ad esempio qui . Non conosco esempi "pratici" (che non corrispondono anche al titolo che hai scelto); cosa si qualifica come "pratico" per te?
Raffaello

Che non sono inventati semplicemente per rispondere a questa domanda. Ho riconosciuto che il problema di arresto di livello successivo si applica ancora.
Ike,

Inoltre, tutte le lingue che non sono enumerabili in modo ricorsivo non sono riducibili a HALT. Gli esempi includono FINITE, EMPTY, se due CFG derivano la stessa lingua, ecc.

Risposte:


15

Basta prendere un problema il cui grado di Turing è superiore a , che è il grado di The Halting Oracle. In termini di gerarchia aritmetica, si desidera avere problemi al di sopra di . Esempi di tali problemi (dove è il -esima parziale funzione calcolabile e è il - il set calcolabile enumerabile):0Σ10ϕnnWn={kNϕn(k) is defined}n

  • {nNφn terminates for finitely many inputs} è .Σ20
  • {nNφn is a total function} è .Π20
  • {nNWn is a computable set} è .Σ30

Nessuno di questi può essere risolto anche se si dispone di un Halting Oracle. Ad esempio, considera il secondo esempio, "is total?" Dato modo l'Halting Oracle potrebbe aiutarci a decidere se la macchina di Turing codificata da ferma su ogni input?φnnn


[Aggiunto il 03-06-2014] Per un aspetto "pratico" di tutto ciò, considerare il problema: un programmatore ha scritto una funzione void charge_credit_card(int card_number, int amount)e vorremmo sapere se la funzione termina su tutti gli ingressi. È impossibile scrivere un compilatore che può verificarlo automaticamente in generale. Inoltre, anche se consentiamo al compilatore di farci domande sul modulo " charge_credit_cardtermina quando viene fornito l'input (k,m)?", È ancora impossibile.


2
Dire "Non capisco l'esempio" senza spiegare ciò che ti confonde non è produttivo. Hai letto le pagine pertinenti di Wikipedia che ho indicato? Questi sono direttamente correlati alla tua domanda, quindi la prima cosa che dovresti od è familiarizzare con i concetti di base coinvolti.
Andrej Bauer,

1
@ike, l'esempio doveva avere una quantità infinita di int, ovviamente. Hai davvero bisogno che io scriva BigInto qualcosa del genere, o ti lamenterai che la memoria del computer è finita?
Andrej Bauer,

1
Qualunque cosa. Ti ho detto quale era la risposta alla tua domanda. Se non vuoi capirlo in buona fede, allora non disturbarci con domande.
Andrej Bauer,

2
Un esempio pratico è, , il complimento di halt. Questo è Dato un programma arbitrario e immesso nel programma, determina se il programma non si ferma. Questo problema, insieme ad ogni altro linguaggio non ricorsivamente enumerabile, non si riduce a HALT. HALT¯{<M,w>:M doesn't halt on w}

1
@tAllan: dovresti pubblicarlo come risposta. Mi batte ciò che l'OP considera "pratico", ma il tuo esempio è sicuramente migliore del mio.
Andrej Bauer,
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.