En bref : un algorithme est la partie constructive d'une preuve constructive qu'un problème donné a une solution. La motivation de cette définition est l'isomorphisme de Curry-Howard entre les programmes et la preuve, considérant qu'un programme n'a d'intérêt que s'il résout un problème, mais de manière prouvée. Cette définition permet plus d'abstraction et laisse certaines portes ouvertes concernant le type de domaines qui peuvent être concernés, par exemple concernant les propriétés de finitude.
Attention . J'essaie de trouver une approche officielle appropriée pour répondre à la question. Je pense que cela est nécessaire, mais il semble qu'aucun des utilisateurs qui ont répondu jusqu'à présent (moi y compris, et certains étaient plus ou moins explicites à ce sujet dans d'autres articles) n'a pas le bon fond pour développer correctement les problèmes, qui sont liés à mathématiques constructives, théorie des preuves, théorie des types et des résultats tels que l' isomorphisme de Curry-Howard entre les preuves et les programmes. Je fais de mon mieux ici, avec les extraits de connaissances que je possède (je crois), et je ne suis que trop conscient des limites de cette réponse. J'espère seulement donner quelques indications sur ce à quoi je pense que la réponse devrait ressembler. Si vous voyez un point qui est clairement faux formellement (prouvablement), laissez-moi maintenant un commentaire - ou par e-mail.
Identifier certains problèmes
Une manière standard de considérer un algorithme est de déclarer qu'un algorithme est un programme arbitrairement spécifié de manière finie pour certains appareils informatiques , y compris ceux qui n'ont aucune limitation en mémoire. Le langage peut aussi être le langage machine informatique. En fait, il suffit de considérer tous les programmes pour un appareil informatique complet de Turing (ce qui implique de n'avoir aucune limitation de mémoire). Il peut ne pas vous donner toutes les présentations d'algorithmes, dans le sens où les algorithmes doivent être exprimés sous une forme qui dépend dans ses détails du contexte d'interprétation, même théorique, car tout est défini jusqu'à un certain encodage. Mais, puisqu'il calculera tout ce qu'il y a à calculer, il inclura en quelque sorte tous les algoritms, jusqu'au codage.
π
π, peut-être au sens mathématique de presque tous. Mais cela exigerait plus de précision dans les définitions.
La vraie question est donc de savoir quels sont les algorithmes significatifs. La réponse est que les algorithmes significatifs sont ceux qui résolvent un problème, calculant pas à pas la "solution", la "réponse" à ce problème. Un algorithme est intéressant s'il est associé à un problème qu'il résout.
Donc, étant donné un problème formel, comment obtenir un algorithme qui résout le problème. Que ce soit explicitement ou implicitement, les algorithmes sont associés à l'idée qu'il existe une solution au problème, qui peut être prouvée correcte. La précision de nos techniques de preuve est une autre affaire, mais nous essayons au moins de nous convaincre. Si vous vous limitez aux mathématiques constructives, ce qui est en fait ce que nous devons faire (et c'est une contrainte axiomatique très acceptable pour la plupart des mathématiques), le moyen de prouver l'existence d'une solution est de passer par des étapes de preuve qui présentent réellement une construction qui représente la solution, y compris éventuellement d'autres étapes qui établissent son exactitude.
Tous les programmeurs pensent quelque chose comme: si je joue avec les données de telle ou telle manière, alors j'obtiens ce widget qui a juste les bonnes propriétés en raison du théorème de Sesame, et en exécutant cette transformation préservant le foo, j'obtiens la réponse souhaitée . Mais la preuve est généralement informelle, et nous ne travaillons pas sur tous les détails, ce qui explique pourquoi un satellite a tenté d'orbiter Mars sous terre (entre autres). Nous faisons une grande partie de la réflexion, mais nous ne conservons en fait que la partie constructive qui construit la solution, et nous la décrivons dans un langage informatique pour être l'algorithme qui résout le problème.
Algorithmes (ou programmes) intéressants
Tout cela pour introduire les idées suivantes, qui font l'objet de nombreuses recherches actuelles (dont je ne suis pas spécialiste). La notion d '« algorithme intéressant » utilisée ici est la mienne, introduite comme un espace réservé informel pour des définitions plus précises.
Un algorithme intéressant est la partie constructive d'une preuve constructive qu'un problème donné a une solution . Cela signifie que la preuve doit réellement montrer la solution plutôt que simplement prouver son existence, par exemple par contradiction. Pour plus de détails, voir Logique intuitive et constructivisme en mathématiques.
C'est bien sûr une définition très restrictive, qui ne considère que ce que j'ai appelé des algorithmes intéressants. Il les ignore donc presque tous. Mais il en va de même pour tous nos manuels sur l'algorithme. Ils essaient d'enseigner seulement quelques-uns des plus intéressants.
Compte tenu de tous les paramètres du problème (données d'entrée), il vous indique comment obtenir un résultat spécifié étape par étape. Un exemple typique est la résolution des équations (l' algorithme du nom est en fait dérivé du nom d'un mathématicien persan, Muḥammad ibn Mūsā al-Khwārizmī , qui a étudié la résolution de certaines équations). Des parties de la preuve sont utilisées pour établir que certaines valeurs calculées dans l'algorithme ont certaines propriétés, mais ces parties n'ont pas besoin d'être conservées dans l'algorithme lui-même.
Bien sûr, cela doit avoir lieu dans un cadre logique formalisé qui établit quelles sont les données calculées, quelles sont les étapes de calcul élémentaires autorisées et quels sont les axiomes utilisés.
Pour revenir à votre exemple factoriel, il peut être interprété comme un algorithme, quoique trivial. La fonction factorielle normale correspond à une preuve que, étant donné un cadre arithmétique, et étant donné un entier n, il existe un nombre qui est le produit des n premiers entiers. C'est assez simple, tout comme le calcul factoriel. Cela pourrait être plus complexe pour d'autres fonctions.
Maintenant, si vous décidez de tabuler factorielle, en supposant que vous le pouvez, ce qui n'est pas vrai pour tous les entiers (mais pourrait être vrai pour un domaine fini de valeurs), tout ce que vous faites est d'inclure dans vos axiomes l'existence de factorielle en définissant avec un nouvel axiome sa valeur pour chaque entier, de sorte que vous n'avez plus besoin de prouver (donc de calculer) quoi que ce soit.
Mais un système d'axiomes est censé être fini (ou du moins défini de manière finie). Et il y a une infinité de valeurs pour factorielle, une par entier. Vous êtes donc en difficulté pour votre système fini d'axiomes si vous axiomatisez une fonction infinie, c'est-à-dire définie sur un domaine infini. Cela se traduit par le fait que votre recherche de table potentielle ne peut pas être implémentée pour tous les entiers. Cela tuerait l'exigence de finitude habituelle pour les algorithmes (mais doit-elle être aussi stricte que souvent présentée?).
Vous pouvez décider d'avoir un générateur d'axiomes défini de manière finie pour gérer tous les cas. Cela reviendrait, plus ou moins, à inclure le programme factoriel standard dans votre algorithme pour initialiser le tableau selon les besoins. Cela s'appelle la mémorisation par les programmeurs. C'est en fait le plus proche de l'équivalent d'une table précalculée. On peut comprendre qu'il a une table précalculée, à l'exception du fait que la table est réellement créée en mode d' évaluation paresseuse , chaque fois que cela est nécessaire. Cette discussion aurait probablement besoin d'un peu plus de soins formels.
Vous pouvez définir vos opérations primitives comme vous le souhaitez (en cohérence avec votre système formel) et leur affecter le coût que vous choisissez lorsqu'il est utilisé dans un algorithme, afin de faire une analyse de complexité ou de performance. Mais, si les systèmes concrets qui implémentent réellement votre algorithme (un ordinateur ou un cerveau par exemple) ne peuvent pas respecter ces spécifications de coût, votre analyse peut être intellectuellement intéressante, mais ne vaut rien pour une utilisation réelle dans le monde réel.
21000
Quels programmes sont intéressants
Cette discussion devrait être plus correctement liée à des résultats tels que l'
isomorphisme de Curry-Howard entre les programmes et la preuve. Si un programme est en fait une preuve de quelque chose, tout programme peut être interprété comme un programme intéressant au sens de la définition ci-dessus.
Cependant, à ma compréhension (limitée), cet isomorphisme est limité aux programmes qui peuvent être bien typés dans un système de typage approprié, où les types correspondent aux propositions de la théorie axiomatique. Par conséquent, tous les programmes ne peuvent pas être considérés comme des programmes intéressants. Je suppose que c'est dans ce sens qu'un algorithme est censé résoudre un problème.
Cela exclut probablement la plupart des programmes "générés aléatoirement".
C'est aussi une définition quelque peu ouverte de ce qu'est un «algorithme intéressant». Tout programme qui peut être considéré comme intéressant l'est certainement, car il existe un système de type identifié qui le rend intéressant. Mais un programme qui n'était pas typable jusqu'à présent, pourrait devenir typable avec un système de type plus avancé, et devenir ainsi intéressant. Plus précisément, cela a toujours été intéressant, mais faute de connaître le bon système de typage, nous ne pouvions pas le savoir.
Cependant, il est connu que tous les programmes ne sont pas typables, car il est connu que certaines expressions lambda, telles que l'implémentation du combinateur Y , ne peuvent pas être typées dans un système de type sonore .
Cette vue s'applique uniquement aux formalismes de programmation qui peuvent être directement associés à un système de preuve axiomatique. Je ne sais pas comment il peut être étendu à des formalismes de calcul de bas niveau tels que la machine de Turing. Cependant, étant donné que l'algorithmique et la calculabilité sont souvent un jeu d'encodage de problèmes et de solutions (pensez aux arithmétiques encodées dans le calcul lambda ), on peut considérer que tout calcul défini formellement qui peut être montré comme étant l'encodage d'un algorithme est également un algorithme. De tels encodages n'utilisent probablement qu'une très petite partie de ce qui peut être exprimé dans un formalisme de bas niveau, tel que Turing Machines.
Un intérêt de cette approche est qu'elle donne une notion d'algorithme plus abstraite et indépendante des problèmes de codage réel, de "représentabilité physique" du domaine de calcul. Ainsi, on peut, par exemple, considérer des domaines avec des objets infinis tant qu'il existe une manière solide sur le plan informatique de les utiliser.