È possibile arrestare il problema calcolabile per input / ipotesi particolari


19

Dalla mia comprensione della prova che l'arresto del problema non è calcolabile, questo problema non è calcolabile perché se abbiamo un programma P (x) che calcola se il programma x si ferma o no, otteniamo un paradosso quando diamo P come input per stesso P, avendo: P (P), cercando di decidere se P si ferma o non usa P stesso.

Quindi la mia domanda è: l'arresto del problema è calcolabile dal programma P per tutti gli altri programmi usati come input ma P stesso? In altre parole: l'arresto del problema non è calcolabile solo in questo caso speciale o la prova è più generale e mi manca qualcosa?


Penso che tu abbia frainteso la prova che il problema dell'arresto non è calcolabile. P (P) restituisce semplicemente true, poiché P determina sempre se un programma si arresta a tempo finito. Devi fare una costruzione leggermente più complicata per raggiungere una contraddizione.
Dan Staley,

Penso che otterresti risposte migliori e forse praticamente più pertinenti se ti chiedessi se ci sono molti programmi per i quali il problema dell'arresto è risolvibile. Dopotutto, molti programmi sono anche verificabili formalmente , il che include certamente una determinazione se si fermano con determinati input. Suppongo fortemente che quel gruppo non possa essere determinato (perché ciò equivarrebbe a risolvere ... lo sai), ma che per la stragrande maggioranza dei programmi del mondo reale non ci sono ostacoli per dire se si fermano o no, per input rilevanti.
Peter - Ripristina Monica il

Risposte:


10

Se è una funzione calcolabile, allora g , definito comefg

g(n)={f(n)Se nKvaltrimenti

è anche calcolabile, per qualsiasi scelta di .K,v

Fondamentalmente, se hai un programma che calcola g ( n ) per tuttiP'g(n) 'ad eccezione di n = k , puoi "risolvere" quel caso (ad es. Usando un) e ottenere un altro programma P che calcola g ( n ) per tutto n .nn=Kif then elsePg(n)n

Quindi, se potessi calcolare la funzione di arresto "tranne un caso", potresti anche calcolare la funzione di arresto (senza eccezioni). Da ciò, puoi ottenere una contraddizione come al solito.

Conclusione: no, non è possibile decidere il problema dell'arresto "tranne un caso" (né "tranne casi finiti").


1
Ok, penso di averlo preso matematicamente ... Ma mi chiedevo: se provassi a scrivere un programma che calcola gli HP quali problemi concreti dovrei affrontare? Perché e come potrei capire a un certo punto che non riesco a scrivere un programma del genere?
Alessio Martorana,

@AlessioMartorana Dipende: come affronteresti questo problema? Un problema principale è che P deve sempre arrestarsi, anche quando il suo input è un programma non-stop, quindi non puoi semplicemente provare a simulare il programma di input.
Chi

E supponendo di poter vedere il codice del programma di input? Non possiamo dal codice vedere se il programma si interrompe?
Alessio Martorana,

2
@AlessioMartorana Possiamo davvero vedere il codice, ma se c'è ad esempio un ciclo while non possiamo dire molto in generale. Un ciclo while potrebbe controllare tutte le possibili prove di una congettura matematica arbitraria e fermarsi solo se viene trovata una prova. Decidere se questo ciclo si ferma significa decidere se la congettura è dimostrabile. Risolvere l'HP ci darebbe una macchina che risponderebbe Sì (dimostrabile) / No (non dimostrabile) a qualsiasi domanda matematica formale. Sarebbe irrealisticamente potente.
Chi

1
@AlessioMartorana Se pensavi di aver scritto un programma che risolve l'HP, dove il tuo programma fallirebbe in due modi: per alcuni programmi potrebbe restituire il risultato sbagliato (dire qualcosa si ferma quando non lo fa o dire qualcosa non lo fa ' t si ferma quando lo fa) e / o il tuo programma di decisione stesso non si fermerebbe su molti input con te incapace di sapere se non si fermerà davvero o se ha solo bisogno di più tempo per calcolare la risposta.
Shufflepants

21

l'arresto del problema è calcolabile dal programma P per tutti gli altri programmi usati come input ma P stesso?

No. Considera l'infinita sequenza di programmi , dove P i è "Sposta la testa i  quadrati a destra, quindi i  quadrati a sinistra, quindi fai esattamente ciò che PP1,P2,PiiiP farebbe ". Ognuno di questi programmi produce esattamente lo stesso output di  per ogni input (incluso il looping per sempre se P si  esegue in loop per sempre), ma sono tutti programmi diversi.PP

E non puoi aggirare questo richiedendo solo a di lavorare su programmi che non sono funzionalmente equivalenti a se stesso, dal momento che quella proprietà è anche indecidibile. Forse il problema sarebbe decidibile se limitato a tali istanze (anche se sospetto che non lo fosse) ma l'insieme di istanze è indecidibile, quindi non è possibile eseguire effettivamente la restrizione.P


15
Sospetto che la tua ultima frase sia probabilmente vera, ma non credo che ne consegue che, poiché una proprietà è indecidibile, la limitazione del set di input basato su quella proprietà lascerà il problema indecidibile. Come esempio stupido, se si limitasse l'input impostato ai programmi di terminazione (una proprietà indecidibile), il problema sarebbe decidibile (da un programma che restituiva sempre true).
Owen l'

3
@Owen Quando la restrizione stessa è indecidibile, non puoi imporre la restrizione in modo che non ti possa comprare nulla nella realtà.
David Richerby

5

Esistono algoritmi per dimostrare che alcune classi di programmi fanno o non si fermano. Per esempio,

  • È possibile determinare algoritmicamente se un programma che modella una macchina a stati finiti si arresta.
  • È possibile determinare aritmeticamente se una macchina per turing a limite lineare si arresta
  • Se sai in quale classe di complessità si trova un programma, allora sai che il programma si ferma per input finiti.

Mentre non esiste un algoritmo per determinare se un programma arbitrario si arresta, la maggior parte del codice è stata progettata per arrestare (come la maggior parte delle subroutine) o non arrestarsi (come un ciclo infinito per gestire gli eventi), ed è possibile determinare algoritmicamente quale sia quale. In altre parole, puoi avere un algoritmo che risponde "si ferma", "non si ferma" o "Non lo so", e un tale algoritmo può essere progettato per coprire abbastanza programmi che sarebbe utile.


Cosa c'entra questo con Goto? Non possiamo avere un programma che utilizza goto e ancora decidere se si ferma, purché modellizzi una macchina a stati finiti?
Bergi

Stavo per scrivere di fermarmi in termini di cicli a catena, e poi l'ho cambiato solo per parlare di macchine a stati finiti e quant'altro
Antonio Perez

4

Le prove per contraddizione non devono essere esaustive , è sufficiente un unico contro-esempio. La prova che il problema dell'arresto è indecidibile fornisce un esempio di P per il quale la proprietà di arresto non può essere decisa. Questa dimostrazione non afferma che P sia l'unico programma del genere, infatti, potrebbero esistere prove indipendenti che costruiscono classi completamente diverse di P.


3

La dimostrazione è davvero più generale: il problema dell'arresto è un caso speciale del teorema di Rice , che afferma

Se è una proprietà di programmi indipendente dalla rappresentazione, allora è sempre vero, sempre falso o indecidibile.Φ

ABΦ(A)Φ(B)

xx

È possibile ottenere alcuni risultati, limitando lo spazio di programmi che si desidera lavorare, anche se queste restrizioni devono essere abbastanza drastico. Ad esempio, se ti viene garantito che il programma che ti viene dato si arresta entro 100 passi o viene eseguito per sempre, decidere se si interrompe diventa facile.

NkBB(k)


1
N

1
L'ultimo paragrafo ricorda Busy Beaver.
Evil

Per quanto riguarda le restrizioni "abbastanza drastiche": i linguaggi di programmazione totali sono una cosa. Tendono a richiedere un livello relativamente alto di sofisticazione, quindi forse lo consideri drastico, ma è possibile risolvere problemi reali in uno spazio di programmi che si fermano in modo dimostrabile.
Ben Millwood,

Includere un collegamento a en.wikipedia.org/wiki/Rice%27s_theorem avrebbe senso IMO.
Dmitry Grigoryev il

Grazie, ho aggiornato la risposta. @BenMillwood Certamente, ma data la loro soluzione è "fai fermare tutto" Non sono sicuro che sia davvero quello che Alessio sta cercando. Un caso in cui il comportamento di arresto è decidibile ma non banale sarebbe interessante, però: forse Agda + tipi coinduttivi?
Anton Golov,

0

Sia R un qualsiasi insieme ricorsivamente enumerabile ma non ricorsivo. Ci sono infiniti set di questo tipo. Sia T una macchina di Turing che si ferma sull'input k se e solo se k è in R. Tale T esiste per qualsiasi set ricorsivamente enumerabile. È impossibile scrivere un programma in grado di risolvere il problema di arresto per questo T. Ciò è dovuto al fatto che qualsiasi algoritmo per determinare se gli arresti T produrrebbe un algoritmo per determinare l'appartenenza a R, il che è impossibile se R non è ricorsivo. Poiché ci sono infiniti molti di questi R, ognuno dei quali dà macchine Turing diverse, ci sono infinitamente molte macchine Turing su cui qualsiasi tentativo di arrestare il programma P fallirebbe.

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.