Qu'est-ce qu'une "variable logique" et quelle est l'approche générale de la mise en œuvre de la caractéristique linguistique?

j'essaie d'écrire un langage de requête de programmation logique jouet, basé sur diverses sources d'instruction dont SICP et L'Art de Prolog (AoP). Je suis juste de commencer à travailler sur mon premier croquis de l' algorithme d'unification<!-(Le "cœur du modèle de calcul de la programmation logique" selon AoP), et AoP note que

lors de la mise en œuvre de l'algorithme d'unification pour un langage de programmation logique particulier, l'explicite la substitution dans les équations de la pile et de l'unificateur est évitée. Au lieu de cela, les variables logiques et d'autres termes sont représentés par des cellules de mémoire avec des valeurs différentes, et la liaison variable est implémentée en assignant la cellule de mémoire représentant une variable logique une référence à la cellule contenant la représentation du terme auquel la variable est liée. (1ère édition, p. 71)--5-->

en lisant ceci, je me suis rendu compte que je n'avais qu'une compréhension rudimentaire et pratique de la logique les variables fonctionnent, mais je ne comprends pas vraiment comment elles sont mises en œuvre. Je ne sais même pas quelles sont les caractéristiques formelles précises qui différencient la variable logique des variables immuables qui caractérisent d'autres régions du paradigme de la programmation déclarative. Je vous serai reconnaissant de toutes les explications et références instructives.

10
demandé sur false 2015-11-05 10:28:22

3 réponses

Rechercher Warren Machine Abstraite si vous voulez comprendre comment les compilateurs et les interprètes Prolog sont implémentés.

l'idée de base pour les variables logiques est qu'elles sont soit liées à un terme, libres, ou aliasées à une variable logique différente.

5
répondu tobyodavies 2015-11-05 09:28:37

réponse Partielle, ne concernant que la notion de variable logique.

une première approximation pourrait être de dire que les variables logiques agissent comme des variables mathématiques: une fois que leur valeur est apprise, elle ne changera pas. Cela conduit à la notion de variables assign-once. Cela contraste avec la notion de variables dans les langages de programmation impératifs où elles identifient symboliquement les emplacements de mémoire, permettant des assignations destructives (et donc) multiples. Mais, revenir à la logique les variables, ça s'améliore. Une variable logique peut être unifié avec un terme, mais ce terme peut lui-même contenir des variables. En retour, ces variables peuvent être unifiées avec d'autres termes plus tard. Prenons l'exemple suivant, dans le Prologue:

?- V = a(Y).
V = a(Y).

?- V = a(Y), V = a(1).
V = a(1),
Y = 1.

Dans la seconde requête, la variable V plus loin instancié par fédérateur la variable qu'il contient, Y, avec le nombre entier 1. =/2 l'opérateur est Prolog unification opérateur. L'Unification est une opération logique qui est vraie quand vous pouvez prendre deux termes et les rendre égaux, peut-être par liaison variables d'un terme à un sous-terme dans l'autre terme.

2
répondu Paulo Moura 2015-11-05 12:28:31
structure sharing et structure copying. Googler pour cela attire l'attention sur de nombreuses ressources...

dans mon interpréteur Prolog, j'ai choisi le partage de structure, donc en unifier il est évident que le genre de traitement détaillé requis (Eh bien, c'est un très simple mind approach): la plus grande partie de la mise en œuvre est là, laissant aux structures de données de service BindStack et TrailStack juste le stockage et un peu plus... Comme conséquence de mon choix, un instancié Terme doit être référencé ensemble, c'est l'environnement.

1
répondu CapelliC 2015-11-05 13:59:16