• Aucun résultat trouvé

Description du codage d'un terme

Dans le document Apprendre et enseigner Prolog pdf (Page 179-183)

Exemple 3 : Cet exemple montre comment utiliser une variable pour contrôler un programme de l'extérieur La règle liste_de_un qui a été donnée

7. Extensions de Prolog avec des langages externes.

7.3. Fonctions de communication de termes quelconques

7.3.2. Au moyen de structures de tableau

7.3.2.1. Description du codage d'un terme

Un terme est représenté par un tag et une valeur entière dont l'interprétation dépend du tag.

terme: (tag, valeur)

Entier: 'I' la valeur de l'entier. Si l'entier venant de Prolog est trop grand pour être codé, une erreur est notifiée.

Réel: 'R' un index dans le tableau des réels doubles real_tab. Réel: 'X' un index dans le tableau des réels doubles real_tab. Chaîne: 'S' un index i dans le tableau des caractères str_tab.

»

i indique le premier caractère de la chaîne. La chaîne est terminée par un caractère NULL.

Ident: 'N' un entier représentant l'identificateur de manière unique.

»

Cette représentation est unique tant que l'identificateur est déclaré utilisé (cf. set_permanent_symbol). Sinon il peut être supprimé par le récupérateur de mémoire. variable: 'V' un numéro de variable libre.

»

Le numéro est unique pour un état donné de la machine (voir § 7.3). Si deux numéros sont différents, il s'agit de deux variables libres différentes (c'est à dire non liées entre elles). Dans un même appel de procédure externe, ces numéros sont cohérents pour différents appels des fonctions get_term et put_term. Entre deux activations ou deux états, il n'y a aucun lien entre ces numéros.

De nouvelles variables peuvent être créées en appelant put_term avec des numéros non encore utilisés. Il est plus efficace de créer des numéros en ordre croissant par rapport aux numéros déjà attribués. Prolog attribue ces numéros par incréments de 1.

séquence: 'D' un index dans les tableaux de terme/sous-termes vers une séquence de sous-termes.

»

La séquence pointée est terminée par 'E' ou 'F' suivant le cas.

terme: (tag, valeur)

n-uplet: 'T' un index dans les tableaux de terme/sous-termes tag_tab et val_tab.

»

Pointe sur une suite de termes dont le premier est un entier représentant le nombre d'arguments n du n-uplet, suivi des n sous-termes représentant les arguments. fin liste: 'E' indéfinie.

»

Marque la fin d'une séquence se terminant par nil. Cette marque peut être le premier élément d'une séquence pointée par 'D'.

fin séquence:'F' indéfinie.

»

Marque la fin d'une séquence ne se terminant pas par nil: le terme qui suit immédiatement cette marque est le dernier élément de la séquence. Cette marque ne peut être le premier élément d'une séquence pointée par 'D'. On a deux représentations équivalentes du terme 1.2.3.nil, l'une sous forme vectorisée, la deuxième étant de type paire pointée (ici une paire est représentée par 3 entrées). Prolog fournit toujours les données sous la première forme qui est plus compacte, la deuxième étant surtout utile pour construire des listes dont la longueur n'est pas connue au début de la construction.

Le couple ('N', 0) représente par convention l'identificateur nil. (dans ce qui suit, "-" représente des valeurs indéfinies)

forme compacte forme type paire pointée

00 'D' 1 ! 'D' 1 terme: 1.2.3.nil 01 'I' 1 'I' 1 02 'I' 2 'F' - 03 'I' 3 'D' 4 04 'E' - 'I' 2 05 'F' - 06 'D' 7 07 'I' 3 08 'F' - 09 'N' 0 exemple:

indice tag_tab val_tab (32 bits)

00 'D' 1 argument de type séquence

* codage des sous-termes de l'arg.

01 'I' 1

02 'I' 2 ...

03 'D' 10 vers: (3."Hi!".x)

04 'T' 6 vers: father(x,y)

05 'E' - nil

!!début sous-terme: father(x,y)

06 'I' 3

07 'N' <entier représentant father>

08 'V' 0 x

09 'V' 1 y

* début sous-terme: (3."Hi!".x)

10 'I' 3

11 'S' 0 référence vers 1er élt de str_tab

12 'F' -

13 'V' 0 x

14 - -

Tableau des caractères Tableau des réels

indice caractère indice réel

00 'H' 00 - 01 'i' 01 - 02 '!' 03 null (0) 04 -

7.3.2.2. Identificateurs

Dans la structure de tableaux, un identificateur est codé par une clé (notamment un entier) dans le dictionnaire de Prolog. Au moment de la transformation des données par les fonctions d'interfaçage (get_term, put_term), des fonctions de conversions entre la clé et la représentation de l'identificateur (chaîne de caractères) peuvent être nécessaires.

La fonction pro_symbol, ou son équivalent en Fortran, permet à partir d'une chaîne de caractères, de construire l'identificateur Prolog correspondant (identificateur qui pourra par exemple faire partie d'un terme qui sera transmis à Prolog par la procédure put_term). La chaîne de caractères doit avoir la syntaxe d'un identificateur. Si la chaîne de caractères ne comprend pas de préfixe (c'est une notation abrégée), l'identificateur créé sera fonction du contexte courant (Voir à ce propos le Chapitre 3 de ce manuel). Si une erreur s'est produite, la fonction retourne

long pro_symbol(str) char *str;

integer*8 function fprosymbol(lg, str) integer*4 lg

character** str

La fonction symbol_string, ou son équivalent en Fortran, permet d'obtenir la représentation, sous forme de chaîne, d'un identificateur Prolog. Cet identificateur aura été obtenu par une des fonctions de communication de termes, get_term par exemple. Les arguments fournis à la fonction sont la clé key, l'adresse d'une zone

mémoire où la chaîne pourra être copiée str, la longueur maximum de la chaîne de

caractères copiée lg_max. La chaîne obtenue est la notation de l'identificateur en

fonction du contexte courant, notation abrégée si possible. La fonction donnera dans le paramètre de sortie lg, la longueur effective de la chaîne. La fonction retourne 0 si

elle a pu s'exécuter, un entier positif correspondant à un numéro d'erreur si une erreur s'est produite.

NB: key doit correspondre à un identificateur valide. int symbol_string(key, str, lg, lg_max) long key;

char *str; int *lg; int lg_max;

integer*4 function fsymbolstring(key, str, lg, lg_max) integer*4 key,lg_max,lg

character** str

Le caractère choisi pour noter la séparation entre le préfixe et le suffixe de la représentation d'un identificateur complet, peut être modifié depuis Prolog. La fonction suivante permet donc de connaître le caractère courant utilisé :

char prefix_limit();

character*1 function fprefixlimit();

Les fonctions set_permanent_symbol et reset_permanent_symbol, ou leur équivalent en Fortran, permettent de prévenir le récupérateur de mémoire de Prolog, dans le cas où il serait activé sur le dictionnaire, qu'un identificateur est utilisé et respectivement non utilisé, par une procédure externe.

NB: key doit correspondre à un identificateur valide. set_permanent_symbol(key)

long key;

reset_permanent_symbol(key) long key;

integer*4 function fsetpermanentsymbol(key) integer*4 key

integer*4 function fresetpermanentsymbol(key) integer*4 key

Dans le document Apprendre et enseigner Prolog pdf (Page 179-183)