Prova dell'indecidibilità del problema dell'arresto


25

Ho difficoltà a comprendere la prova dell'indecidibilità del problema di Halting.

http://computing.guide/wp-content/uploads/2014/12/HaltingProblem1.jpg

Se restituisce se il programma o meno un soste in ingresso b , perché dobbiamo far passare il codice di P sia un e bH(a,b)abPab ?

Perché non possiamo alimentare con P e qualche input arbitrario, diciamo, x ?H()Px


Tieni presente che nel modello di calcolo utilizzato qui è consentito qualsiasi input (codificato). Non c'è controllo del tipo o qualcosa del genere. Puoi sempre codificare un programma e passarlo come input a se stesso.
asmeurer,

2
Si potrebbe nutrire qualunque ingresso che si desidera. La struttura di questa prova richiede di considerare un input particolare. H
David Richerby,

1
È possibile fornire qualsiasi input al programma. L'obiettivo è quello di trovare la contraddizione. Teoricamente la macchina 'H' dovrebbe funzionare per tutti i tipi di input. Quindi consideriamo uno di tutti i possibili input, che porta alla contraddizione.
Ugnes

Questa prova è imperfetta. Considera se ho un H () che funziona per tutto tranne che per se stesso; sarebbe comunque una soluzione generale al problema dell'arresto.
Joshua,

Correlato, possibilmente duplicato: cs.stackexchange.com/questions/42819/…
Ilmari Karonen,

Risposte:


27

La prova mira a trovare una contraddizione. Devi capire qual è la contraddizione derivata, per capire perché è usato come input per se stesso. La contraddizione è informale: se abbiamo una macchina H (a, b) che decide "a accetta b", allora possiamo costruire una macchina che accetta macchine che non si accettano. (Leggi che un paio di volte fino a quando lo si ottiene.) La macchina mostrato nella foto - chiamiamolo M - M ( P ) = non P non accetta P PMM(P)=PP ?

La contraddizione si verifica quando si chiede: non accetta M ? Prova a elaborare le due opzioni per vedere come c'è una contraddizione.MM

accettaM se e solo se M non accettaM ; questa è chiaramente una contraddizione.MMMM

Questo è il motivo per cui è essenziale che la dimostrazione esegua su se stesso non un input arbitrario. Questo è un tema comune nelle prove di impossibilità note come argomenti diagonali.P


38

Ignora l'immagine per un momento; ci arriveremo tra poco. Il programma dovrebbe essere un tester di arresto: quando diamo a H un input di un programma a (pensiamo a a come l'elenco di un programma) e qualsiasi cosa per b , H ( a , b ) agisce come segueH(a,b)HaabH(a,b)

  1. Se il programma rappresentato da ferma quando viene dato b come input, H ( a , b ) risponderà "sì". D'altra parte, se il programma descritto da a viene eseguito per sempre quando viene fornito l'ingresso b, quindi H ( a , b )abH(a,b)abH(a,b) risponderà "no".
  2. È importante sottolineare che il programma fermerà sempre e darà la risposta corretta per qualsiasi coppia ( a , b ) .H(a,b)

L'argomento secondo cui è impossibile da costruire si basa sull'azione di un particolare programma "perverso", P , che utilizza H come subroutine. P prende come input un elenco di qualsiasi programma, x , e fa quanto segue:HPHPx

P(x) =
  run H(x, x)
  if H(x, x) answers "yes"
      loop forever
  else
      halt

Non è difficile vederlo

si interromperà se e solo se il programma x verrà eseguito per sempre quando viene fornita la propria descrizione come input.P(x)x

Fin qui tutto bene: sarà sicuramente un programma fintanto che la sua subroutine H è un programma.PH

Ora torna all'immagine. Cosa succede se riceve la propria descrizione come input? L'immagine descrive proprio quello scenario: Sia p la descrizione del programma P , quindi, sostituendo la parte evidenziata sopra, avremoPpP

si arresterà se e solo se il programma P ( p ) funzionerà per sempre.P(p)P(p)

Chiaramente, questo comportamento paradossale è impossibile, quindi siamo costretti a concludere che la subroutine non può essere un tester di arresto, dal momento che fallisce in un caso, dove viene dato ( p , p ) come input. Potrebbero esserci altri casi in cui H funziona come dovrebbe, ma poiché H non riesce in almeno una situazione, non può essere un tester di arresto completo, come richiesto.H(p,p)HH


Mi piace questa risposta. Anche se ora ho capito la prova, sembra solo dimostrare che H può lanciare un'eccezione al limite di ricorsione.
Fax

2
@Fax Hnon viene chiamato più di una volta, non c'è ricorsione in Palcun modo. H(P, P)non viene eseguito P, determina semplicemente "magicamente" se si Pferma o meno .
Ajedi32,

@ Ajedi32 H(P,P)non deve essere eseguito P, ma deve essere eseguito H(x ↦ H(x,x), P)per determinare se si Pinterrompe. Che si espande H(x ↦ H(y ↦ H(y,y), x), P)e così via.
Fax

@Fax L'implementazione di Hnon è specificata in questa prova. Quindi no, non deve eseguire nulla, che sia Po se stesso. La prova parte dal presupposto che Hesiste una sorta di programma che decide magicamente il problema di arresto, quindi prosegue dimostrando che l'esistenza stessa di un tale programma sarebbe una contraddizione, e quindi non esiste tale programma.
Ajedi32,

1
@Fax Sollevi un buon punto riguardo alla possibilità che esista un programma che decida il problema di arresto, tranne quando viene chiamato su se stesso. Vedi Ci sono prove dell'indecidibilità del problema di arresto che non dipende dall'autoreferenziazione o dalla diagonalizzazione? per una domanda interessante a riguardo.
Ajedi32,

9

Prova una prova più bella con le animazioni. E poiché ansewrs dovrebbe contenere più di un semplice collegamento a un sito, ecco la risposta alla tua domanda.

Innanzitutto, ricordiamo come funziona la prova della non esistenza dell'oracolo di Halting. Dimostriamo che, dato a qualsiasi candidato Hper un oracolo di Halting, esiste un programma Pe un input aper i quali Hnon è possibile prevedere correttamente cosa P(a)fa.

Teorema: Sia Hqualsiasi programma che accetta due input e restituisce sempre halto loop. Quindi esiste un programma Qe un input atale che si Q(a)ferma se, e solo se, H(Q,a)ritorna loop.

Prova. Considera il programma

program P(y):
  if H(y,y) = halt then
    loop forever
  else:
    return

Let Q = Pand a = P. O H(Q,a) = halto H(Q,a) = loop:

  • if H(Q,a) = haltthen Q(a)(che è giusto P(P)) viene eseguito per sempre dalla definizione diP .
  • se H(Q,a) = looppoi Q(a)fermato dal definitoin di P.

QED

Hai chiesto perché abbiamo preso in considerazione H(P,P)invece che H(P,X)per qualcun altro X. La risposta ovvia è "perché H(P,P)è ciò che fa funzionare la prova"! Se lo usassi H(P,X)per qualche arbitrario X, rimarrai bloccato. In effetti, la prova dovrebbe apparire così:

Prova rotta. Considera il programma

program P(y):
  if H(y,y) = halt then
    loop forever
  else:
    return

Let Q = Pe a = Xper alcuni arbitrari X. O H(Q,X) = halto H(Q,X) = loop:

  • supponiamo H(Q,X) = haltquindi che non possiamo dire cosa P(X)fa, perché se le P(X)soste dipendono da ciò che H(X,X)ritorna. Siamo bloccati. Tuttavia, se lo sapessimo P(X)e X(X)siamo gli stessi, potremmo fare progressi. (Quindi, dovremmo davvero prendereX = P ).
  • se H(Q,a) = looppoi fossimo di nuovo bloccati e non saremmo bloccati se X = P.

Nessun QED.

Spero che ciò dimostri che dobbiamo considerare H(P,P)per far funzionare la nostra idea.


Haha. Eccezionale! :)
aelguindy,

2

Il risultato della dimostrazione è questa analogia:

P(P)P(P)P(P)(P)(P)

(P)(P)

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.