Quelles sont les différences entre les relations logiques et les simulations?


29

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?


1
Vous voudrez peut-être fournir des liens vers ces articles que vous avez lus. Cela rendrait plus clair quels exemples spécifiques vous prêtent à confusion.
Marc Hamann

1
Pour les relations logiques, j'ai lu le récent article de Hur et Dreyer "Une relation logique entre Kripke entre ML et l'assemblage" (POPL'11). J'ai également lu les chapitres classiques du livre de Pierce "Sujets avancés en types et langages de programmation". Je trouve que les relations logiques sont définies de manière inductive sur la structure de type du langage, mais que se passe-t-il si le langage n'a pas de structure de type (comme C)? (Il semble qu'une autre question, je suppose.)
Hongjin Liang

1
Pour les simulations, j'ai lu l'article original "Lois algébriques pour le non-déterminisme et la concurrence" par Hennessy et Milner. Les "petites bisimulations pour raisonner sur les programmes impératifs d'ordre supérieur" (POPL'06) de Koutavas et Wand sont incompréhensibles pour moi et je ne sais pas pourquoi ils ont appelé leur méthode "bisimulation".
Hongjin Liang

3
il serait préférable d'inclure les informations que vous avez fournies dans les commentaires dans le post. Vous pouvez modifier votre question en cliquant sur le lien de modification sous la question.
Kaveh

1
@HongjinLiang: Si vous n'avez pas de structure de type (ou si vous avez des types récursifs), vous pouvez utiliser des relations logiques indexées par étapes - avec les relations logiques, vous utilisez l'induction sur les types, avec l'indexation par étapes, vous induisez les étapes d'observation. Vous trouverez des conseils dans la déclaration de recherche d'Amal Ahmed: ccs.neu.edu/home/amal/ahmed-research.pdf . (Un autre aperçu de la recherche sur les relations logiques est cet exposé de Derek Dreyer et dans son énoncé de recherche: mpi-sws.org/~dreyer/research.pdf ).
Blaisorblade

Réponses:


20

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 XMMMMX . 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 FXRF(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 .


Je me demandais s'il serait vrai de dire que la relation mentionnée ci-dessus est la soi-disant relation de levage de R étant donné F décrivant la machine. F(R)Rfunctor F
Dave Clarke

@DaveClarke Oui, c'est la même idée. Dans le style de définition Reynolds, chaque constructeur de type est équipé d'une action de relation qui associe à chaque relation R :F , une relation correspondante F ( R ) : F ( X ) F ( X RR:XX satisfaisant certains axiomes. Dans certaines autres communautés, ils aimeraient dériver F ( R ) d'autres principes, d'où ils les appellent desrelèvements de relation. Le F (F(R):F(X)F(X)F(R) qu'ils produisent par ce processus serait une action relationnelle au sens de Reynolds. F(R)
Uday Reddy du

14

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.


Merci beaucoup pour votre explication détaillée! Je vais lire vos références et essayer de comprendre les connexions / différences profondes entre les deux.
Hongjin Liang

êtes-vous sûr de la déclaration "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."? Soit A = (a. (B + c)) + (a.b + ac) et B = a.b + ac quand, pour autant que je sache, A est similaire à B, B est similaire à A, mais A et B ne sont pas bisimilaires.
András Salamon

@ András: Vous avez raison. Ma déclaration n'est pas assez précise. La différence est résumée par la phrase "Certaines conditions supplémentaires peuvent être présentes".
Dave Clarke

Hennessy et Milner ont défini trois types de relations d'équivalence dans leur article original pour la bisimulation et ont donné quelques exemples pour illustrer leurs différences. Votre énoncé original est en fait le médium de leur article, qui est plus faible que la bisimulation et plus fort que l'équivalent de trace. Je ne sais pas quelle équivalence est la meilleure. Cela dépend peut-être d'une utilisation pratique.
Hongjin Liang

La simulation est également utilisée comme technique de preuve pour établir le raffinement des données entre deux types de données. Chacune de ces preuves de simulation concerne des classes entières de programmes. Voir par exemple [1] pour plus de détails. Cela suggère que la distinction entre les deux concepts est encore plus floue. [1]: CAR Hoare, He J et JW Sanders. Prespécification dans le raffinement des données. Lettres de traitement de l'information , 25: 71-76, 1987.
Kai

8

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 ).


Votre réponse est très utile pour relier les concepts à une interprétation abstraite. Merci!
Hongjin Liang

Une question sincère: je ne suis pas un expert, mais Reynolds (1983, "Types, abstraction et polymorphisme paramétrique") ne définit-il pas déjà des relations logiques qui sont des connexions galoisiennes (Sec. 6)? Les seules différences que je remarque: il ne dit pas le terme "connexion de Galois" mais seulement les "foncteurs adjoints équivalents entre ordres partiels considérés comme des catégories", et il se limite aux domaines. OTOH, Backhouse et Backhouse citent Reynolds mais ne discutent pas de cette affirmation, d'une manière ou d'une autre.
Blaisorblade

6

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.

π


Votre référence est vraiment sympa! Je n'ai jamais entendu de relations logiques pour des programmes concurrents auparavant. Merci! Je suppose que la difficulté de définir une relation logique est de trouver la structure de type. Avec la même structure de type, une relation logique peut être définie entre différents langages de programmation. D'un autre côté, une simulation nécessite la modélisation de programmes par un système de transition d'état, ce qui peut être difficile si les programmes sont écrits pour différents modèles d'état.
Hongjin Liang

Bonjour! Oui, trouver une structure de type appropriée n'est pas toujours facile. Vous pouvez définir des simulations à l'aide de différents systèmes de transition pour les deux calculs que vous souhaitez comparer. On pourrait soutenir que la définition de la simulation faible fait exactement cela. Tout ce dont vous avez vraiment besoin pour définir des simulations est une relation pour comparer les étiquettes de transition.
Martin Berger
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.