Je suis un débutant travaillant sur des méthodes prouvant l'équivalence d'un programme. J'ai lu quelques articles sur la définition de relations logiques ou de simulations pour prouver que deux programmes sont équivalents. Mais je suis assez confus au sujet de ces deux techniques.
Je sais seulement que les relations logiques sont définies par induction tandis que les simulations sont basées sur la coinduction. Pourquoi sont-ils définis de cette manière? Quels sont leurs avantages et inconvénients respectivement? Lequel dois-je choisir dans différentes situations?
lo.logic
pl.programming-languages
logical-relations
parametricity
Hongjin Liang
la source
la source
Réponses:
J'ai une réponse à cette question qui est peut-être nouvelle. En fait, j'y réfléchis encore depuis environ 6 mois, et cela n'a pas encore été écrit dans les journaux.
La thèse générale est que les principes du raisonnement relationnel comme les «relations logiques», les «simulations» et même les «invariants» sont des manifestations de l'abstraction de données ou de la dissimulation d'informations. Partout où se cachent des informations, ces principes surgissent.
Les premiers à le découvrir ont été les théoriciens des automates. Les automates ont un état masqué. Vous avez donc besoin d'un raisonnement relationnel pour parler de leur équivalence. Les théoriciens des automates ont lutté pendant un certain temps avec les homomorphismes, ont abandonné et ont proposé une notion appelée "couverture relationnelle", qui est une forme de relations de simulation.
Milner a repris l'idée dans un article peu connu mais très fondamental intitulé " Une notion algébrique de simulation entre programmes " en 1971. Hoare la connaissait et l'a utilisée pour arriver à " Preuve d'exactitude des représentations de données " en 1972 (mais utilisée l'abstraction fonctionne à la place des relations parce qu'il pensait qu'elles étaient "plus simples"). Il a par la suite retiré la revendication de simplicité et est retourné à l'utilisation des relations dans " Raffinement des données raffiné ". Reynolds a utilisé le raisonnement relationnel dans " Craft of Programming"", Chapitre 5 (1981). Il pensait que les relations étaient plus naturelles et plus générales que les fonctions d'abstraction. Si vous revenez en arrière et lisez ce chapitre, vous trouverez des idées de paramétrie relationnelle qui rôdent, attendant d'être découvertes. Effectivement, deux ans plus tard, Reynolds a publié "Types, abstraction et polymorphisme paramétrique" (1983).
Il semble que toutes ces idées n'aient rien à voir avec les types, mais elles le font vraiment. Langues stateful et modèles ont intégré abstraction de données. Vous n'avez pas besoin de définir un "type de données abstrait" pour masquer les informations. Vous déclarez simplement une variable locale et la cachez. Nous pouvons l'enseigner aux étudiants de première année dans les classes Java dans les premières semaines. Pas de transpiration.
Les langages et modèles fonctionnels, en revanche, doivent obtenir leurs informations cachées via des types . Les modèles fonctionnels n'ont pas d'abstraction de données intégrée. Nous devons l'ajouter explicitement, en utilisant ou ∃ . Donc, si vous traduisez un langage avec état dans un langage fonctionnel, vous remarquerez que tout l'état local est traduit en variables de type. Pour une description explicite de la façon dont cela fonctionne, voir mon article " Objets et classes dans des langages de type algol ", mais les idées viennent vraiment de Reynolds 1981 ("L'essence d'Algol"). Nous comprenons mieux ces idées classiques maintenant.∀ ∃
Prenez deux machines et M ′ que vous souhaitez prouver équivalentes. Milner 1971 dit, définit une relation entre les états de M et M ' et montre que les deux machines préservent la relation. La paramétricité de Reynolds dit, pensez aux états des machines comme appartenant aux types X et XM M′ M M′ X . Définissez une relation R entre eux. Si les machines sont de type F ( X ) et F ( X ′ ) , paramétrées par les types de leurs états, alors vérifiez que les deux machines sont liées par la relation FX′ R F(X) F(X′) . F(R)
Ainsi, les simulations et la paramétricité relationnelle sont essentiellement la même idée . Ce n'est pas simplement une ressemblance superficielle. Le premier est fait pour les langues avec état où il y a une abstraction des données intégrée. Ce dernier est fait pour les langages sans état où l'abstraction des données est obtenue via des variables de type.
Et les relations logiques alors? À première vue, les relations logiques semblent être une idée plus générale. Alors que la paramétricité explique comment relier les variables de type au sein d'un même modèle, les relations logiques semblent relier les types entre différents modèles. (Dave Clarke a écrit une brillante exposition de cela plus tôt.) Mais mon sentiment est (et cela doit encore être démontré) qu'il s'agit d'un exemple d'une forme de paramétrie de type supérieur qui n'a pas encore été formulée. Restez à l'écoute pour plus de progrès sur ce front.
[Note ajoutée] Le lien entre les relations logiques et les simulations est discuté dans notre récent article Logical relations and parametricty: A Reynolds program for Category Theory and Programming Languages .
la source
functor
L'une des principales différences est que les relations logiques sont utilisées comme technique pour montrer qu'une classe de programmes (par exemple, entrée dans un compilateur) correspond à une autre classe de programmes (par exemple, la sortie du compilateur), tandis que les relations de simulation sont utilisées pour montrer la correspondance entre deux programmes.
La similitude entre les deux notions est qu'elles définissent toutes deux une relation utilisée pour montrer la correspondance entre deux entités différentes. Dans un certain sens, on peut considérer une relation logique comme une relation de simulation définie de manière inductive sur la syntaxe des types. Mais il existe différents types de relations de simulation.
Les relations logiques peuvent être utilisées pour montrer la correspondance entre une langue telle que ML et sa traduction en langage d'assemblage, comme dans l'article que vous lisez. Une relation logique est définie par induction sur la structure de type. Une relation logique fournit un moyen de composition pour montrer, par exemple, qu'une traduction est correcte, en montrant que la traduction est correcte pour chaque constructeur de type. Pour les types de fonction, la condition de condition d'exactitude dirait quelque chose comme, la traduction de cette fonction prend une entrée bien traduite en sortie bien traduite.
Les relations logiques sont une technique polyvalente pour les langages basée sur le calcul lambda. Les autres applications des relations logiques incluent (à partir d' ici ): caractérisation de la définissabilité lambda, mise en relation des définitions sémantiques dénotationnelles, caractérisation du polymorphisme paramétrique, modélisation de l'interprétation abstraite, vérification des représentations de données, définition de la sémantique entièrement abstraite et modélisation de l'état local dans les langages d'ordre supérieur.
Les relations de simulation sont généralement utilisées pour montrer l'équivalence de deux programmes. De tels programmes produisent généralement une sorte d'observation, comme l'envoi de messages sur les canaux. Un programme P simule un autre Q si P peut faire tout ce que Q peut faire, mais peut-être plus.
La bisimulation, en gros, est deux relations de simulation réunies. Vous montrez que le programme P et simule le programme Q et que le programme Q peut simuler le programme P et vous avez une bisimulation, bien que des conditions supplémentaires soient généralement présentes. L'entrée de Wikipedia sur la bisimulation est un bon point de départ (plus précis). Il existe des milliers de variantes de l'idée, mais c'est une idée fondamentale qui a été réinventée plus ou moins sous la même forme informatique, logique modale et théorie des modèles. L' article de Sangiorgi donne une merveilleuse histoire de l'idée.
Un article établissant une relation entre les deux notions est une note sur les relations logiques entre la sémantique et la syntaxe par Andy Pitts qui utilise des relations logiques, en fin de compte une notion sémantique définie syntaxiquement, pour prouver une certaine propriété sur bisimulation applicative , qui est une notion purement syntaxique.
la source
Les deux types de relations semblent être utilisés dans des contextes différents. Simulations logiques pour les langages dactylographiés et relations de simulation lorsqu'il s'agit de calculs de processus ou de logiques modales interprétés sur des systèmes de transition. Dave Clarke a fourni de nombreuses explications intuitives, je vais donc ajouter quelques conseils qui pourraient vous aider.
Il y a eu des travaux sur la caractérisation des deux notions à l'aide d'une interprétation abstraite. Ce n'est peut-être pas ce que vous voulez, mais au moins les deux notions sont traitées dans le même cadre mathématique.
Samson Abramsky a utilisé des relations logiques pour prouver la solidité et la fin de l'analyse de rigueur pour le calcul lambda paresseux ( interprétation abstraite, relations logiques et extensions Kan ). Il a également montré que les relations logiques définissent les fonctions d'abstraction dans le sens de connexion galoisienne de l'interprétation abstraite. Plus récemment, Backhouse et Backhouse ont montré comment construire des connexions Galois pour des types d'ordre supérieur à partir de connexions Galois pour des types de base et que ces constructions peuvent être décrites de manière équivalente en utilisant des relations logiques (relations logiques et connexions Galois ). Ainsi, dans le contexte spécifique des langages fonctionnels typés, les deux notions sont équivalentes.
Les relations de simulation caractérisent la préservation des propriétés entre les structures de Kripke pour diverses logiques modales et temporelles. Au lieu de types, nous avons des modalités dans une logique. Les relations de simulation définissent également les connexions de Galois et donc les abstractions. On peut se demander si ces abstractions ont des propriétés spéciales. La réponse est que les abstractions standard sont saines et que les abstractions basées sur des relations de simulation sont complètes. La notion d'exhaustivité concerne les connexions de Galois, qui peuvent ne pas être en accord avec leur interprétation intuitive. Cette ligne de travail a été développée par David Schmidt ( Structure-Preserving Binary Relations for Program Abstraction ), et Francesco Ranzato et Francesco Tapparo ( Generalized Strong Preservation by Abstract Interpretation ).
la source
Je dirais que les deux concepts sont quelque peu vagues. Les deux concernent les relations binaires des mécanismes de calcul qui incarnent en quelque sorte une notion d'égalité. Les relations logiques sont définies par induction de la structure de type, tandis que les simulations peuvent être définies comme vous le souhaitez, mais le terme fait allusion à la coinduction.
la source