Pourquoi les fonctions totales ne sont-elles pas énumérables?
29
Nous avons appris le concept d'énumération des fonctions. En pratique, ils correspondent à des langages de programmation.
Dans une remarque passagère, le professeur a mentionné que la classe de toutes les fonctions totales (c'est-à-dire les fonctions qui se terminent toujours pour chaque entrée) n'est pas énumérable. Cela signifierait que nous ne pouvons pas concevoir un langage de programmation qui nous permette d'écrire toutes les fonctions totales mais pas d'autres --- ce serait bien d'avoir!
Alors, comment se fait-il que nous devons (apparemment) accepter le potentiel de non-terminaison si nous voulons une puissance de calcul décente?
En raison de la diagonalisation. Si était une énumération calculable de toutes les fonctions calculables totales de N à N , de sorte que chaque f e était totale, alors g ( i ) = f i ( i ) + 1 serait également un calcul total fonction, mais ce ne serait pas dans l'énumération. Cela contredirait les hypothèses sur la séquence. Ainsi, aucune énumération calculable de fonctions ne peut être constituée exactement du nombre total de fonctions calculables.( fe: e ∈ N )NNFeg( i ) = fje( i ) + 1
Supposons que nous pensons à une fonction calculable universelle , où "universel" signifie h est une fonction binaire calculable et que pour chaque fonction unaire calculable totale f ( n ) il y a un e tel que f ( i ) = h ( e , i ) pour tout i . Alors il doit aussi y avoir un e tel que g ( n ) = h ( e , n )h ( e , i )hF( n )eF( i ) = h ( e , i )jeeg(n)=h(e,n)n'est pas une fonction totale, en raison du paragraphe précédent. Sinon, donnerait une énumération calculable du nombre total de fonctions unaires calculables qui comprend toutes les fonctions unaires calculables totales.h
Ainsi, l'exigence que chaque fonction soit un système de fonctions est totale est incompatible avec l'existence d'une fonction universelle dans ce système. Pour certains systèmes faibles, tels que les fonctions récursives primitives, chaque fonction est totale mais il n'y a pas de fonctions universelles. Les systèmes plus forts qui ont des fonctions universelles, comme la calculabilité de Turing, doivent simplement avoir des fonctions partielles afin de permettre à la fonction universelle d'exister.
Je voulais juste ajouter que quelqu'un a trouvé ce qui semble être une faille dans la diagonalisation. Si vous utilisez une représentation typée pour le programme, vous pouvez utiliser le système de typage pour interdire la diagonalisation et créer un auto-interprète total. Voir Briser la barrière de normalisation: un auto-interprète pour F-oméga pour plus de détails.
hatch22
Bien sûr, le système F n'est pas un système complet de Turing. L'article que vous avez lié est intéressant; il semble qu'ils parviennent à exploiter l'intégralité de non-Turing d'une manière intéressante.
Carl Mummert
Je ne comprends pas pourquoi "alors serait également une fonction calculable totale". Si g est une fonction calculable totale, alors ∃ k , f k = g , alors l'évaluation de g ( k ) nécessite l'évaluation de g ( k ) = f k ( k ) + 1 = g ( k ) + 1g(i)=fi(i)+1g∃k,fk=gg(k)g(k)=fk(k)+1=g(k)+1: conttradiction. Il semble donc que s'il y a une énumération des fonctions calculables totales, nous ne pouvons même pas construire , de sorte que nous ne pouvons pas atteindre une contradiction pour réfuter l'hypothèse initiale (nous pouvons atteindre une contradiction, mais cela réfute simplement que g étant calculable total). gg
agemO
Et même l'utilisation d'une diagonale décalée pour éviter ce problème semble conduire à des contradictions.
agemO
10
Juste pour être clair, nous devons distinguer les fonctions mathématiques (je les appellerai des fonctions et il y en a souvent un nombre incalculable donc elles ne sont pas du tout énumérables) et des fonctions que vous pouvez écrire: je les appellerai des programmes ou des fonctions calculables .
SExEx∈Sx∉SS
L'ensemble de tous les programmes qui sont totaux sur un ensemble fini est énumérable car vous pouvez écrire un interpréteur qui exécute simplement le programme sur tous les éléments de l'ensemble fini et renvoie «oui» s'ils se terminent tous. (Mais je ne vois pas si l'un d'eux ne le fait pas)
Votre professeur a dit que l'ensemble de tous les programmes totaux sur un ensemble infini n'est pas énumérable car vous ne pouvez pas simplement exécuter votre programme sur un nombre infini d'éléments.
Mais cela ne veut pas dire que c'est mauvais:
Par exemple, l'ensemble si tous les programmes qui sont prouvés totaux sont énumérables car vous pouvez énumérer toutes les preuves et vérifier mécaniquement si elles prouvent que votre programme est total.
Même un ensemble énumérable ne serait pas pratique, car vous devrez peut-être attendre indéfiniment sans être sûr que la procédure se terminera un jour. Je ne vois pas comment utiliser un programme qui énumère toutes les fonctions totales ...
Il existe des langages de programmation où tout ce que vous écrivez est garanti de se terminer juste avec une frappe statique! Il y en a même qui vous garantissent une liaison polynomiale. Ils sont principalement académiques pour l'instant, écrire dans ceux-ci vous fera probablement ressentir les contraintes plus que l'écriture en Python, mais il y a beaucoup de chercheurs qui y travaillent.
Donc, pour répondre à votre question: dans un sens, oui. La non-terminaison potentielle est nécessaire pour que Turing soit complet (la puissance de calcul la plus élevée pour l'instant). Mais je ne trouve pas cela directement lié au fait que les fonctions totales sont énumérables ou non. Vous pouvez toujours écrire tous les programmes totaux!
"parce que vous ne pouvez pas simplement exécuter votre programme sur un nombre infini d'éléments" - c'est un argument faible car je n'aurais peut-être pas besoin de le faire si je peux récupérer toutes les informations dont j'ai besoin dans le programme lui-même. Voir ici pour une question illustrant le danger de votre raisonnement.
Raphael
Effectivement. Je n'ai pas prétendu que c'était une preuve (comme toujours, vous devez construire un argument diagonal) et peut-être que je n'aurais pas dû utiliser le mot "parce que". J'essayais de répondre à votre question qui (je pensais) ne portait pas sur une preuve de la déclaration de votre professeur mais sur la raison pour laquelle la résiliation entrait en conflit avec la puissance de calcul.
Juste pour être clair, nous devons distinguer les fonctions mathématiques (je les appellerai des fonctions et il y en a souvent un nombre incalculable donc elles ne sont pas du tout énumérables) et des fonctions que vous pouvez écrire: je les appellerai des programmes ou des fonctions calculables .
L'ensemble de tous les programmes qui sont totaux sur un ensemble fini est énumérable car vous pouvez écrire un interpréteur qui exécute simplement le programme sur tous les éléments de l'ensemble fini et renvoie «oui» s'ils se terminent tous. (Mais je ne vois pas si l'un d'eux ne le fait pas)
Votre professeur a dit que l'ensemble de tous les programmes totaux sur un ensemble infini n'est pas énumérable car vous ne pouvez pas simplement exécuter votre programme sur un nombre infini d'éléments.
Mais cela ne veut pas dire que c'est mauvais:
Par exemple, l'ensemble si tous les programmes qui sont prouvés totaux sont énumérables car vous pouvez énumérer toutes les preuves et vérifier mécaniquement si elles prouvent que votre programme est total.
Même un ensemble énumérable ne serait pas pratique, car vous devrez peut-être attendre indéfiniment sans être sûr que la procédure se terminera un jour. Je ne vois pas comment utiliser un programme qui énumère toutes les fonctions totales ...
Il existe des langages de programmation où tout ce que vous écrivez est garanti de se terminer juste avec une frappe statique! Il y en a même qui vous garantissent une liaison polynomiale. Ils sont principalement académiques pour l'instant, écrire dans ceux-ci vous fera probablement ressentir les contraintes plus que l'écriture en Python, mais il y a beaucoup de chercheurs qui y travaillent.
Donc, pour répondre à votre question: dans un sens, oui. La non-terminaison potentielle est nécessaire pour que Turing soit complet (la puissance de calcul la plus élevée pour l'instant). Mais je ne trouve pas cela directement lié au fait que les fonctions totales sont énumérables ou non. Vous pouvez toujours écrire tous les programmes totaux!
la source