Comment vérifiez-vous si deux algorithmes renvoient le même résultat pour une entrée?

18

Comment vérifiez-vous si deux algorithmes (disons, Tri par fusion et Tri naïf) renvoient le même résultat pour n'importe quelle entrée, lorsque l'ensemble de toutes les entrées est infini?

Mise à jour: Merci Ben d' avoir décrit comment cela est impossible à faire algorithmiquement dans le cas général. La réponse de Dave est un excellent résumé des méthodes algorithmiques et manuelles (soumises à l'esprit humain et à la métaphore) qui ne fonctionnent pas toujours, mais sont assez efficaces.

Andres Riofrio
la source
5
comme l'a dit Yuval, il n'y a pas de procédure qui puisse déterminer cela pour deux programmes. mais dans un cas particulier comme votre exemple, vous pouvez le prouver: par exemple, si vous prouvez que vos deux algorithmes renvoient une séquence triée et sont stables, vous aurez terminé.
Sasho Nikolov
1
Voulez-vous une technique / algorithme automatique ou un ensemble de techniques manuelles?
Dave Clarke
@SashoNikolov, si les performances sont considérées comme faisant partie de la sortie, vous devrez également montrer qu'elles fonctionnent toutes les deux dans la même complexité temps / espace.
edA-qa mort-ora-y
1
Voulez-vous dire «vérifier» ou prouver? Voulez-vous dire «toute entrée» ou toutes les entrées? Quels sont la motivation et le contexte de la question?
Kaveh
2
@AndresRiorio: Les techniques de preuve sont différentes des algorithmes qui résolvent le problème général. Par exemple, le problème d'arrêt est indécidable mais il est certainement possible de prouver l'arrêt de nombreux programmes (à la main ou par heuristique automatisée).
Raphael

Réponses:

16

Contrairement à ce que disent les opposants, il existe de nombreuses techniques efficaces pour ce faire.

  • La bisimulation est une approche. Voir, par exemple, l'article de Gordon sur la coinduction et la programmation fonctionnelle .

  • Une autre approche consiste à utiliser les théories opérationnelles de l'équivalence des programmes, comme le travail de Pitts .

  • Une troisième approche consiste à vérifier que les deux programmes satisfont à la même spécification fonctionnelle. Il existe des milliers d'articles sur cette approche.

  • Une quatrième approche consiste à montrer qu'un programme peut être réécrit dans l'autre en utilisant des transformations de programmes sonores .

Bien sûr, aucune de ces méthodes n'est complète en raison de l'indécidabilité, mais des volumes et des volumes de travail ont été produits pour résoudre le problème.

Dave Clarke
la source
heu · ris · tic . [Gr. εὑρίσκω "découvrir"] n. 1. Une technique conçue pour résoudre un problème qui ignore si la solution peut être prouvée comme étant correcte, mais qui produit généralement une bonne solution ou résout un problème plus simple qui contient ou recoupe la solution du problème plus complexe. 2. ( Théor. ) Un algorithme qui ne fonctionne pas.
JeffE
1
Bart Simpson: "Impossible de gagner. N'essayez pas."
Dave Clarke
9
@JeffE: Si vous voulez vérifier si deux algorithmes retournent le même résultat, vous faites une preuve. Il existe de nombreuses bonnes techniques pour ce faire. Bien sûr, toutes les méthodes sont incomplètes, mais qui s'en soucie? Le théorème d'incomplétude de Goedel n'est pas une raison pour renoncer aux mathématiques!
Neel Krishnaswami
3
@JeffE Ce n'est pas parce qu'il n'y a pas de fonction calculable pour déterminer si deux algorithmes arbitraires renvoient le même résultat que vous ne pouvez pas répondre à la question pour deux algorithmes particuliers , d'autant plus que le processus de recherche d'une preuve n'est pas un calculable fonction . De même, il y a beaucoup de documents qui prouvent la terminaison garantie pour des algorithmes particuliers, indépendamment du fait qu'il n'est pas possible de déterminer mécaniquement si un algorithme arbitraire se terminera toujours.
Ben
2
En pratique, deux algorithmes censés calculer la même fonction ne permettent presque jamais une preuve d'équivalence basée sur la bisimulation. (Dans le cas des algorithmes de tri mentionnés ci-dessus, les étapes intermédiaires des boucles / récursivité sont différentes.) Je dirais que l'utilisation d'une bonne vieille logique Hoare pour montrer qu'ils implémentent tous les deux la même spécification de comportement d'E / S est le moyen aller.
Kai
10

Pour élaborer un peu sur les affirmations «c'est impossible», voici un simple croquis de preuve.

Nous pouvons modéliser des algorithmes avec sortie par Turing Machines qui s'arrêtent avec leur sortie sur leur bande. Si vous voulez avoir des machines qui peuvent s'arrêter en acceptant avec une sortie sur leur bande ou en rejetant (dans ce cas, il n'y a pas de sortie), vous pouvez facilement trouver un encodage qui vous permet de modéliser ces machines avec le "stop ou stop non", il n'y a pas de machines à rejeter.

Supposons maintenant que j'ai un algorithme P pour déterminer si deux de ces MT ont la même sortie pour chaque entrée. Puis, étant donné un TM A et une entrée X , je peux construire un nouveau TM B qui fonctionne comme suit:

  1. Vérifiez si l'entrée est exactement X
  2. Si oui, entrez une boucle infinie
  3. Si non, exécutez A sur l'entrée

Maintenant , je peux courir P sur A et B . B ne s'arrête pas sur X , mais a la même sortie que A pour toutes les autres entrées, donc si et seulement si A ne s'arrête pas sur X, ces deux algorithmes ont la même sortie pour chaque entrée. Mais P était supposé pouvoir dire si deux algorithmes ont la même sortie pour chaque entrée, donc si nous avions P, nous pourrions dire si une machine arbitraire s'arrête sur une entrée arbitraire, ce qui est le problème de l'arrêt. Puisque le problème de l'arrêt est connu pour être indécidable, P ne peut pas exister.

Cela signifie qu'il n'y a pas d'approche générale (calculable) pour déterminer si deux algorithmes ont la même sortie qui fonctionne toujours, vous devez donc appliquer un raisonnement particulier à la paire d'algorithmes que vous analysez. Cependant, dans la pratique, il peut y avoir des approches calculables qui fonctionnent pour de grandes classes d'algorithmes, et il existe certainement des techniques que vous pouvez utiliser pour essayer de trouver une preuve pour un cas particulier. La réponse de Dave Clarke vous donne quelques éléments pertinents à regarder ici. Le résultat de "l'impossibilité" ne s'applique qu'à la conception d'une méthode générique qui résoudra le problème une fois pour toutes, pour toutes les paires d'algorithmes.

Ben
la source
P
@Raphael Oui, l'argument que j'ai esquissé ne dit rien sur un P aussi restreint , mais seulement qu'il ne peut pas exister un tout général. Mon instinct est que le problème d'arrêt est toujours indécidable même lorsque vous le limitez à des "algorithmes de tri" plutôt qu'à des algorithmes généraux, auquel cas la preuve d'impossibilité tient toujours, bien que je n'ai jamais entendu une telle affirmation.
Ben
2
Plus généralement, le théorème de Rice indique qu'il n'y a aucun moyen calculable de prouver quelque chose à propos d'un algorithme, dès qu'il existe au moins un algorithme qui a la propriété que vous essayez de prouver et au moins un qui n'en a pas. Par exemple, étant donné un algorithme A, il n'y a pas de fonction calculable qui prend un algorithme B en entrée et teste si B est équivalent à A.
Gilles 'SO- arrête d'être mauvais'
Il est important de noter que le théorème de Rice ne s'applique qu'aux propriétés des langages , pas aux machines de Turing (lorsque vous les utilisez comme modèle d'algorithme). S'il est possible que deux machines de Turing existent qui reconnaissent toutes les deux le même langage mais que l'une a la propriété et l'autre pas, alors le théorème de Rice ne s'applique pas, et il pourrait y avoir une méthode calculable générale pour tester la propriété. Mais le théorème de Rice s'applique clairement à ce cas, oui.
Ben
2

C'est impossible en général, mais de nombreuses contraintes peuvent le rendre possible. Par exemple, vous pouvez vérifier l'équivalence de deux programmes de code linéaire utilisant des BDD. L'exécution symbolique peut gérer de nombreux autres cas.

James Koppel
la source
1

Il est impossible de concevoir un algorithme qui prouve cette égalité en général. Astuce: réduction du problème Halting.

Yuval Filmus
la source
De nombreuses techniques existent, mais aucune n'est entièrement automatique.
Dave Clarke
Je ne sais pas si c'est possible ou pas, votre réponse n'est qu'un commentaire. pas une réponse.
@SaeedAmiri: J'ai étoffé un peu le contexte de la réponse; Je pense que c'est assez complet, sinon peut-être pas particulièrement bon.
Raphael
@Raphael, La réduction qui est dans l'esprit de Yuval est évidente, et je ne pense pas que OP ne soit pas au courant de cela, mais le problème difficile de l'OMI est de trouver un moyen pour des cas spéciaux, donc cette réduction évidente pourrait être un commentaire pour simplement rappeler à OP pour le cas général.
2
@SaeedAmiri: C'est au PO et aux électeurs de décider alors, pas à nous.
Raphael