Warren's Abstract Machine

Un article de Wikipédia, l'encyclopédie libre.
Ceci est la version actuelle de cette page, en date du 5 janvier 2017 à 10:35 et modifiée en dernier par Lesenzeite (discuter | contributions). L'URL présente est un lien permanent vers cette version.
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)

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

Liens externes[modifier | modifier le code]