Questa è una domanda interessante. Ovviamente non ci si può aspettare di avere un programma che decida per ogni se ∀ k T ( e , k ) valga o meno, poiché ciò determinerebbe il problema dell'arresto. Come già accennato, esistono diversi modi per interpretare le prove in modo computazionale: estensioni di Curry-Howard, realizzabilità, dialettica e così via. Ma tutti interpreterebbero computazionalmente il teorema che hai citato più o meno nel modo seguente.e∀ k T( e , k )
Per semplicità considera l'equivalente teorema classico
(1) ∃ i ∀ j ( ¬ T( e , j ) → ¬ T( e , i ) )
Questo è (costruttivamente) equivalente a quello menzionato perché dato possiamo decidere se ∀ k T ( e , k ) vale o meno semplicemente controllando il valore di ¬ T ( e , i ) . Se ¬ T ( e , i ) vale quindi ∃ i ¬ T ( e , i ) e quindi ¬ ∀ i T ( e , i ) . Se d'altra parteio∀ k T( e , k )¬ T( e , i )¬ T( e , i )∃ i ¬ T( e , i )¬ ∀ i T( e , i ) non regge quindi da (1) abbiamo ∀ j ( ¬ T ( e , j ) → ⊥ ) che implica ∀ j T ( e , j ) .¬T(e,i)∀j(¬T(e,j)→⊥)∀jT(e,j)
Ora, di nuovo, non possiamo calcolare in (1) per ogni data e perché risolveremmo nuovamente il problema di Halting. Ciò che farebbero tutte le interpretazioni sopra menzionate è guardare al teorema equivalenteie
(2) ∀f∃i′(¬T(e,f(i′))→¬T(e,i′))
La funzione è chiamata funzione Herbrand. Cerca di calcolare un contro esempio j per ogni dato testimone potenziale i . È chiaro che (1) e (2) sono equivalenti. Da sinistra a destra questo è costruttivo, basta prendere i ′ = i in (2), dove i è il presunto testimone di (1). Da destra a sinistra bisogna ragionare in modo classico. Assumere (1) non era vero. Poi,fjii′=ii
(3) ∀i∃j¬(¬T(e,j)→¬T(e,i))
Lascia che sia una funzione testimone di questo, cioèf′
(4) ∀i¬(¬T(e,f′(i))→¬T(e,i))
Ora, prendi in (2) e abbiamo ( ¬ T ( e , f ′ ( i ′ ) ) → ¬ T ( e , i ′ ) ) , per alcuni i ′ . Ma prendendo i = i ′ in (4) otteniamo la negazione di ciò, contraddizione. Quindi (2) implica (1).f=f′(¬T(e,f′(i′))→¬T(e,i′))i′i=i′
Quindi, abbiamo che (1) e (2) sono classicamente equivalenti. Ma la cosa interessante è che (2) ha ora una testimonianza costruttiva molto semplice. Prendi semplicemente se T ( e , f ( 0 ) ) non regge, perché allora la conclusione di (2) è vera; oppure prendere i ′ = 0 se T ( e , f ( 0 ) ) vale, perché allora ¬ T ( e , f ( 0 )i′=f(0)T(e,f(0))i′=0T(e,f(0)) non regge e la premessa di (2) è falsa, rendendola nuovamente vera.¬T(e,f(0))
Quindi, il modo di interpretare computazionalmente un teorema classico come (1) è guardare a una formulazione (classicamente) equivalente che può essere dimostrata in modo costruttivo, nel nostro caso (2).
Le diverse interpretazioni sopra menzionate differiscono solo nel modo in cui viene visualizzata la funzione . Nel caso della realizzabilità e dell'interpretazione dialettica, ciò è esplicitamente dato dall'interpretazione, quando combinata con una qualche forma di traduzione negativa (come quella di Goedel-Gentzen). Nel caso di estensioni Curry-Howard con operatori chiamata-cc e continuazione della funzione f deriva dal fatto che il programma è autorizzato a "sapere" come un certo valore (nel nostro caso i verrà utilizzato), quindi f è la continuazione del programma intorno al punto in cui i è calcolata.ffifi
Un altro punto importante è che vuoi che il passaggio da (1) a (2) sia "modulare", cioè se (1) è usato per provare (1 '), allora la sua interpretazione (2) dovrebbe essere usata in modo simile per dimostrare l'interpretazione di (1 '), dire (2'). Tutte le interpretazioni sopra menzionate lo fanno, inclusa la traduzione negativa di Goedel-Gentzen.