Arrestare il problema senza autoreferenzialità: perché questo argomento non è sufficiente (o lo fa)?


8

Sto cercando di trovare un modo per spiegare l'idea della prova del problema di Halting nel modo più accessibile possibile (agli studenti universitari). L'argomento più semplice che ho trovato è questo ; questo è precisamente lo stile di trattamento a cui sto puntando. Tuttavia, l'auto-riferimento (in particolare, verificare se un programma si ferma su se stesso) non è il più didattico.

Quello che mi chiedo, come uno schizzo di prova, è perché non potremmo semplificare ulteriormente e dire: se assumiamo un programma H(P,I)per il problema di Halting che si ferma con vero se si P(I)ferma e si ferma con falso altrimenti, allora potremmo creare un programma del modulo:

def Q(J):
  if H(Q,J) then loop forever
  else halt

... che è un programma valido se e solo se Halting Problem è un programma valido. Possiamo quindi chiedere: cosa dovrebbe H(Q,J)restituire un valore arbitrario per J? Vediamo una contraddizione in entrambe le possibilità e concludiamo che poiché l'esistenza di Hci consente di costruire il programma contraddittorio Q, quindi un programma della forma Hnon può esistere.

C'è ancora qualche auto-riferimento qui nel fatto che il programma Qcontrolla se si ferma o meno sull'input corrente (e fa il contrario), ma per me questo sembra molto più intuitivo che impostare una situazione in cui abbiamo bisogno di una chiamata del forma P(P)o H(P,P), ecc. Tuttavia, non ho visto questo argomento più semplice usato, e penso che sarebbe stato se fosse valido. Quindi le mie domande sono:

  • L'argomento di cui sopra è sufficiente come prova (schizzo) del problema di Halting?
    • Se è così, perché tanti argomenti vanno con una fase confusa del modulo P(P)o H(P,P)? (È solo per rimuovere l '"input" non importante dall'equazione?)
    • In caso contrario, cosa manca?

Esistono diverse domande correlate su questo argomento, come ad esempio:

Ho anche trovato la menzione della prova basata sul paradosso di Berry, che è abbastanza interessante. Tuttavia, non sono ancora riuscito a convincermi se la specifica argomentazione di cui sopra funziona (anche se solo per la mia comprensione; sento che forse mi manca qualcosa di stupido e vorrei sapere di cosa si tratta).


2
Sei a conoscenza di questo video ? È la spiegazione più intuitiva del problema di arresto che abbia mai visto.
Polygnome,

Grazie per il puntatore! Sì, @DW si collega ad esso nella sua risposta.
badroit,

Risposte:


20

Non penso che questo sia un buon modo per presentare il problema di arresto, perché elimina in modo subdolo un problema critico sotto le coperte. Suggerisco di attenersi a una presentazione più standard, come quella che hai collegato. Se vuoi trovare un modo per spiegarlo in modo da ridurre al minimo il contenuto tecnico, la presentazione in questo video è sorprendentemente accessibile e rimane fedele alla logica della prova standard.

Alle difficoltà con la tua proposta. Nella tua proposta, non è banale scrivere il codice per un tale Q. Pensa a cosa significa avere la linea

  if H(Q,J) then loop forever 

Ricordiamo che il primo argomento Hè una stringa di bit che contiene il codice / algoritmo / macchina di Turing - non è un puntatore alla funzione, ma una stringa. Ingenuamente, questo sembra significare che includiamo una stringa hardcoded che contiene il codice sorgente Qall'interno del codice di Q. Ma questo non è possibile. Supponiamo che il codice per Qimpieghi 100 caratteri. Quindi abbiamo bisogno di codificare una costante di stringa di 100 caratteri all'interno della definizione di Q, inoltre abbiamo bisogno di alcuni caratteri in più per il resto della logica - e questo aggiunge fino a più di 100 caratteri. Se ci pensate, è ovvio che non possiamo avere una costante di stringa all'interno del codice Qche è il codice di Q, perché sarebbe troppo lungo.

Forse stai pensando che non è quello che avevi in ​​mente. Forse stavi pensando che il linguaggio di programmazione avrà qualche API integrata per ottenere il codice della funzione corrente, quindi in realtà il codice a cui stavi pensando è qualcosa del tipo:

def Q(J):
  if H(get_source_code_of_current_function(),J) then loop forever
  else halt

Ok bene. Ciò dimostra che il problema di arresto non può essere risolto per il codice scritto in qualsiasi linguaggio di programmazione che ha get_source_code_of_current_function()un'API. Tuttavia, il mio linguaggio di programmazione preferito non ha una tale API. Quindi, questa prova non dimostra nulla del mio linguaggio di programmazione preferito - forse il problema di arresto è risolvibile per il mio linguaggio, chi lo sa? Allo stesso modo, le macchine Turing non hanno una tale API, quindi questo non dimostra che il problema di arresto per le macchine Turing sia indecidibile.

E questo è un grande difetto nella tua prova. Ed è un difetto sottile e per nulla evidente. Non credo sia pedagogicamente una buona idea presentare una prova che "sembra valido" in superficie ma che in realtà è, una volta scavato più a fondo, imperfetto.

Ora è possibile salvare la prova proposta. In realtà è possibile costruire una funzione Qche funzioni come hai detto; fondamentalmente hai bisogno che sia un quine . Suppongo in linea di principio che potresti spiegare l'idea dei quines, quindi presentare la tua prova e spiegare come implementare una funzione Q usando quelle idee. Ma questa mi sembra una cattiva idea, da una prospettiva pedagogica. I quines sono strabilianti, misteriosi e spaventosamente difficili da capire. Uno studente che non capisce le quine non capirà la tua prova. E rende la prova di indecidibilità per il problema dell'arresto molto più misteriosa di quanto debba essere. Quindi questo non mi sembra un modo più accessibile per capire il problema dell'arresto.


Ottima risposta, molte grazie! Penso che forse andare con una presentazione più standard sia la strada da percorrere (piuttosto che introdurre quines, per esempio).
badroit

"fondamentalmente hai bisogno che sia un quine" - o definisci Q come costante in un programma più ampio e poi valutalo usando una macchina di turing universale o equivalente. Fintanto che accetti che la macchina di turing universale si comporta allo stesso modo della macchina su cui è in esecuzione in tutte le circostanze, dovrebbe sicuramente essere un approccio più facile da capire?
Jules,

@Jules, scusa, non capisco la tua proposta di prova, quindi non posso commentarla.
DW

Ti dispiacerebbe spiegare perché ritieni che le quines siano difficili da capire? Nella mia esperienza, quines della forma "scrivere questo e poi lo stesso citato" sono abbastanza semplici da costruire.
Dmitri Urbanowicz,

@DmitriUrbanowicz, forse sono solo io e sono solo bloccato su di esso. Trovo chine magiche e difficili da avvolgere la testa. Forse sono solo io; o forse non ho ancora visto la spiegazione giusta; o forse non ho provato abbastanza. Forse altri avrebbero un'esperienza diversa!
DW

1

Non vedo quanto l'autoreferenzialità sia pedagogicamente difficile. Barber Paradox è abbastanza facile da capire. E la tua argomentazione ha autoreferenzialità implicita, e trovo che sia più difficile da capire rispetto alla semplice autoreferenzialità. Inoltre, è incoerente. Per definire H (Q, J), devi prima sapere cos'è Q, e per definire Q, devi prima sapere cos'è H (Q, J). Non funziona Nella migliore delle ipotesi puoi affermare che Q è un punto fisso di questa definizione autoreferenziale, ma poi se provi a derivare qualcosa dalla natura contraddittoria di Q, stai solo mostrando che H non esiste O che non esiste tale punto fisso ; ora devi dimostrare che se H esistesse, il punto fisso dovrebbe esistere.

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.