Malheureusement, il se passe trop de choses ici. Il est donc facile de mélanger les choses. L'utilisation de «complet» dans «pleine complétude» et «pleine abstraction» fait référence à des idées complètement différentes de plénitude. Mais, il y a aussi un lien vague entre eux. Donc, cela va être une réponse compliquée.
Complétude complète : "Sound and complete" est une propriété que vous souhaitez avoir pour une logique traditionnelle par rapport à sa sémantique. La solidité signifie que tout ce que vous pouvez prouver dans la logique est vrai dans le modèle sémantique. L'exhaustivité signifie que tout ce qui est vrai dans le modèle sémantique est prouvable dans la logique. Nous disons qu'une logique est saine et complète pour un modèle sémantique particulier. Quand nous arrivons à une logique constructive, comme la théorie de type Martin-Lof ou la logique linéaire, nous nous soucions non seulement de savoir si les formules sont prouvables, mais aussi de leurs preuves. Une formule prouvable peut avoir de nombreuses preuves et une logique constructive veut les séparer. Ainsi, une sémantique pour une logique constructive implique de spécifier non seulement si une formule est vraie, mais aussi une notion sémantique abstraite de "preuve" ("preuve") pour sa vérité. Abramsky et ses collègues ont inventé le terme «pleine complétude» pour signifier que les preuves dans la logique peuvent exprimer toutes les preuves sémantiques dans le modèle. Donc, "complet" fait référence aux preuves ici. Une logique «complète» peut prouver tout ce dont elle a besoin. Une logique "entièrement complète" a toutes les preuves dont elle a besoin. Ainsi, "complétude complète" signifie "complétude constructive" ou "complétude de preuve". Cela n'a rien à voir avec une abstraction complète.
Abstraction complète : "Adéquate et entièrement abstraite" est une propriété que vous souhaitez pour le modèle sémantique d'un langage de programmation. (Notez la première différence: nous avons maintenant affaire aux propriétés du modèle sémantique, pas les propriétés du langage!) L'adéquation signifie que, chaque fois que deux termes ont la même signification dans le modèle sémantique, ils sont équivalents du point de vue observationnel dans le langage de programmation (par rapport à une certaine notion d'exécution). L'abstraction complète signifie que, si deux termes sont équivalents sur le plan de l'observation, ils ont la même signification dans le modèle sémantique. Ces idées peuvent être liées à la solidité et à l'exhaustivité, mais d'une manière quelque peu artificielle. Si nous considérons le modèle sémantique d'un langage de programmation comme une "logique" ou une "méthode de preuve" pour parler d'équivalence d'observation, alors l'adéquation signifie que cette méthode de preuve est solide; l'abstraction complète signifie que cette méthode de preuve est terminée. Il n'y a aucune notion de «pleine complétude»méthode de preuve. (Mais, une telle chose est théoriquement possible, et un de ces jours, quelqu'un pourrait le faire.)
Dans votre cas, vous vous intéressez aux traductions plutôt qu'aux modèles sémantiques. Les propriétés d'adéquation et d'abstraction complète peuvent être étendues pour traiter les traductions comme suit. Vous pensez que la langue cible est votre "modèle sémantique", c'est-à-dire un formalisme que vous comprenez parfaitement d'une manière ou d'une autre. Si oui, vous avez une notion d'équivalence pour cela. Ensuite, nous disons que la traduction est adéquate si, chaque fois que les traductions de deux programmes sources sont équivalentes dans la langue cible, elles sont équivalentes du point de vue observationnel dans la langue source. Nous disons qu'il est totalement abstrait si, chaque fois que deux programmes sources sont équivalents du point de vue observationnel dans la langue source, leurs traductions sont équivalentes dans la langue cible.
En réalité, je ne connais pas de langues cibles que nous comprenons vraiment parfaitement. Tout ce que nous savons, c'est une autre notion d'équivalence observationnelle pour la langue cible. Dans ce cas, la traduction est adéquate si l'équivalence observationnelle des traductions dans la langue cible implique l'équivalence observationnelle dans la langue source.
La traduction est entièrement abstraite si l'équivalence observationnelle des termes dans la langue source implique l'équivalence observationnelle des traductions dans la langue cible.
Certains auteurs considèrent que la «traduction entièrement abstraite» signifie la combinaison de ces deux propriétés:
τ( M) ≅τ( N) ⟹ M≅N
M≅N⟹ τ( M) ≅τ( N)
M≅N⟺τ( M) ≅τ( N)
Egger et al semblent étendre de manière similaire l'idée de complétude complète aux traductions. Dans leur configuration, les formules sont des types et les preuves sont des termes. Leur traduction traduit aussi bien les types que les termes. Ils appellent leur traduction complète entièrement si la traduction d'un type n'a que les termes qui sont obtenus en traduisant les conditions initiales de type .
UNEUNE
∀ N: τ( A ) .∃ M: A .τ( M) = N
Maintenant, pour le lien vague entre la complétude complète et l'abstraction complète. Prouver qu'un modèle sémantique ou une traduction est complètement abstrait implique souvent une certaine définissabilité. En effet, nos langues sont généralement d'ordre supérieur. Donc, si le modèle sémantique ou la langue cible a trop de «contextes», alors il pourra piquer nos termes ou significations sémantiques de manière indésirable et gâcher leur équivalence. "Voies indésirables" signifie que le langage de programmation lui-même ne peut pas les pousser. Donc, pour obtenir une abstraction complète, nous devons nous assurer que les «contextes» disponibles dans le modèle sémantique ou la langue cible proviennent de ceux de la langue source sous une forme ou une autre. Notez que cela concerne la propriété d'exhaustivité complète.
Pourquoi voulons-nous de telles propriétés? Ça n'a rienà voir avec les compilateurs! Nous voulons ces propriétés afin de prétendre que la langue source s'intègre dans la langue cible. Si nous sommes satisfaits d'une langue cible particulière (comme étant claire, compréhensible, fondamentale ou donnée par Dieu), alors, si la langue source y est intégrée, nous pouvons affirmer qu'il n'y a rien de nouveau dans la langue source. Ce n'est qu'un fragment de la langue cible que nous connaissons et aimons. C'est juste du sucre syntaxique. Ainsi, des traductions entièrement abstraites sont fournies par des personnes pour établir que des langues cibles particulières sont excellentes. Ils sont aussi parfois donnés par des personnes qui ont une langue grosse ou compliquée à gérer. Ainsi, au lieu de définir directement une sémantique pour eux, ils la traduisent dans un langage de base puis donnent une sémantique au langage de base. Par exemple, le rapport Haskell fait cela. Mais l'abstraction complète de ces traductions est rarement prouvée car les langues source sont grandes et compliquées. Les gens croient que la traduction est bonne.
Encore une fois, cela n'a rien à voir avec les compilateurs. Les compilateurs sont rarement adéquats ou totalement abstraits. Et ils n'ont pas besoin de l'être! Tout ce qu'un compilateur doit faire est de conserver le comportement d'exécution de programmes complets. Le langage cible d'un compilateur est généralement énorme, ce qui signifie qu'il a beaucoup de contextes qui peuvent gâcher l'équivalence. Ainsi, les programmes équivalents dans la langue source ne sont presque jamais équivalents au contexte lorsqu'ils sont compilés.