Warren's Abstract Machine
Apparence
La Warren's Abstract Machine (Machine abstraite de Warren) est une machine virtuelle permettant d'implémenter le langage Prolog. Cette machine est composée d'un jeu d'instructions spécial ainsi que d'une mémoire. Elle a été définie par David H. D. Warren en 1983. Elle est une des implémentations classiques pour prolog.
Jeu d'instructions
[modifier | modifier le code]Le jeu d'instructions de la WAM est composé de huit types d'instructions.
Instructions Put
[modifier | modifier le code]Instructions Get
[modifier | modifier le code]Instructions Set
[modifier | modifier le code]Instructions d'unification
[modifier | modifier le code]Instructions de contrôle
[modifier | modifier le code]Instructions de choix
[modifier | modifier le code]Instructions d'index
[modifier | modifier le code]Instructions de coupure
[modifier | modifier le code]Ces instructions permettent la gestion de la coupure de prolog (prédicat !/0).
Structure de la mémoire
[modifier | modifier le code]La mémoire de la machine WAM est séparée en cinq parties (depuis le bas de la mémoire) :
- Un premier espace contient le code exécutable.
- Un deuxième espace contient un tas (heap) grandissant en direction du haut de la mémoire.
- Un troisième espace contient une pile (stack) grandissant en direction du haut de la mémoire. Cette pile contient en particulier les points de choix et les environnements.
- Un quatrième espace contient le trail grandissant en direction du haut de la mémoire.
- Un cinquième espace contient le pdl grandissant en direction du bas de la mémoire (depuis la plus haute adresse de la mémoire de la machine).
Exemples
[modifier | modifier le code]Soit le programme prolog suivant:
fille(anne). fille(claire). garcon(B) :- \+ fille(B).
Avec une implémentation basée sur la WAM, le code produit serait de la forme (en mini-assembleur WAM):
predicate(fille/1): switch_on_term(2,1,fail, fail,fail), label(1): switch_on_atom([(anne,3),(claire,5)]) label(2): try_me_else(4) label(3): get_atom(anne,0) proceed label(4): trust_me_else_fail label(5): get_atom(claire,0) proceed predicate(garcon/1): get_variable(x(1),0) put_structure(fille/1,0) unify_local_value(x(1)) execute((\+)/1))