1. Eléments de base. PrologIA HERITAGE II+
A!ociation
Prolog
HERITAGE
1 .
Eléments de base
1.1. Notations utilisées
1.2. Jeu de caractères
1.3. Les variables
1.4. Constantes
1.5. Termes et arbres
1.6. Les opérateurs
1.7. Les règles et les assertions
1.8. Les mécanismes de base de Prolog
1.9. La syntaxe complète de Prolog II+
1.10.
Le macroprocesseur
1 . 1 .
Notations utilisées
Dans ce manuel nous utiliserons des règles hors contexte pour décrire la syntaxe de toutes les formules intervenant dans Prolog. La notation utilisée ici est la même que celle utilisée par la commission de normalisation de Prolog :
• Les symboles non terminaux sont représentés par des identificateurs et les terminaux sont entre doubles quotes "…".
• Le symbole "=" est choisi comme symbole de réécriture et une règle se termine par un ";". Les éléments d'un membre droit de règle sont séparés par des ",".
• Les accolades {…} représentent un nombre quelconque d'apparitions,
éventuellement aucune, des éléments qu'elles encadrent.
• Les crochets […] signalent le caractère optionnel des éléments qu'ils encadrent.
• La barre verticale ...|... exprime l'alternative entre les éléments qu'elle sépare. Des parenthèses (...|...) sont utilisées lorsque le résultat de cette alternative apparaît dans une liste de symboles.
• Le signe "-" est utilisé pour représenter des exceptions.
• Certaines règles de réécriture dépendent des options de syntaxe sélectionnées : les règles dont le membre gauche est annoté par P ne sont actives que lorsque la syntaxe Prolog II est activée (par exemple separator
P
). Les règles dont le membre gauche est annoté par E ne sont actives que lorsque la syntaxe
Edinburgh est activée (par exemple graphic_char
E
).
©PrologIA
R 1 - 2
Manuel de Référence
• D'autres règles, annotées par une lettre, dépendent des options choisies au lancement de Prolog et ne sont valides que dans certains cas.
La totalité de la syntaxe de Prolog est donnée à la fin de ce chapitre. Des extraits plus ou moins simplifiés de cette syntaxe sont commentés dans les paragraphes suivants.
A!ociation
Prolog
HERITAGE
1 . 2 .
Jeu de caractères
L'utilisateur peut choisir parmi deux jeux de caractères : celui défini par le code ISO
8859-1 (cf. Annexe), ou celui disponible sur la machine hôte (cf. Manuel
Utilisateur). Dans ce manuel nous décrirons uniquement le jeu ISO. Le choix du jeu hôte aura pour effet de diminuer ou de grossir les sous-ensembles letter et
graphic_char avec des caractères n'existant pas dans le jeu ISO (cf. U3-2).
Voici une description simplifiée (la description complète se trouve au paragraphe
1.9) du jeu de caractères nécessaires à Prolog : letter = letter I = digit = alpha = separator = separator P = special_char= special_char E = graphic_char =
":" graphic_char E = character =
"A" | … | "Z" | "a" | … | "z"
| "À" … "ß" - "!" | "à" … "ÿ" - "÷"
"\", accent_escape ;
"0" | … | "9" ; letter | digit | "_" ;
"(" | ")" | "[" | "]" | "{" | "}" |
"|" | "," ;
";" | "." | "<" | ">" ;
"%" | "'" | """ | "_" | "!" | "`" ;
";" ;
"#" | "$" | "&" | "*" | "+" | "-" | "/" |
| "=" | "?" | "\" | "@" | "^" | "~"
| NBSP 1 … "¿" | "!" | "÷" ;
"." | "<" | ">" ; letter | digit | separator | graphic_char | special_char ;
Sans changer le sens de ce qui est écrit, on peut insérer des espaces n'importe où, sauf dans les constantes et les variables. On peut enlever des espaces n'importe où sauf dans les chaînes et sauf si cette suppression provoque la création de nouvelles constantes ou variables, par juxtaposition d'anciennes.
1
NBSP est l’espace non sécable.
©PrologIA
A!ociation
Prolog
HERITAGE
Eléments de base
R 1 - 3
Il existe diverses manières d'introduire des commentaires dans les programmes. Du point de vue de la syntaxe, un commentaire équivaut à un blanc et peut figurer partout où un blanc est permis :
• Le caractère "%" indique le début d'un commentaire qui s'étend depuis le "%" jusqu'à la fin de la ligne où ce commentaire apparaît.
• Les symboles "|*", "*|" et "/*", "*/" servent aussi à définir des commentaires, constitués par ces symboles et la suite des caractères qu'ils encadrent.
On ne doit pas mélanger ces symboles : un commentaire commençant par "|*" doit se terminer par "*|" et un commentaire commençant par "/*" doit se terminer par
"*/". D'autre part, on peut imbriquer de tels commentaires; par exemple, le texte suivant sera vu comme un unique commentaire :
|* second com- |* premier commentaire *| mentaire *|
• Une chaîne de caractères écrite au niveau supérieur, c'est-à-dire là où une règle est attendue, possède aussi la valeur d'un commentaire.
1 . 3 .
Les variables
Les variables servent aussi bien à désigner des constantes que des entités plus complexes. En voici la syntaxe : variable = variable = extended_var P = extended_var E =
"_" , {alpha} ; extended_var ; letter, [ (digit | "_"), {alpha} ] , { "'" } ; big_letter, [ {alpha} ] ;
Il y a donc, pour les variables, une syntaxe de base et une syntaxe étendue à choisir parmi deux : la syntaxe Prolog II et la syntaxe anglaise. On doit indiquer si l'on désire une syntaxe différente de la syntaxe étendue Prolog II, au moment du lancement de Prolog II+; de plus, puisque ces deux syntaxes de variables sont incompatibles 2 , on ne peut pas avoir les deux extensions en même temps.
2
En effet : l'expression x est une variable en Prolog II et ne l'est pas dans la syntaxe anglaise. De même, le nom Pierre n'est pas une variable en Prolog II, mais en est une en syntaxe anglaise !
©PrologIA
R 1 - 4
Manuel de Référence
Voici quelques exemples de variables correctes :
Syntaxe Prolog II Syntaxe Edinburgh
x x' X_12_plus x' ' x12 p_rix y33' y_en_a'
_prix
_123
X
Prix
_prix
X1Y2
_33
et quelques exemples d'expressions qui ne sont pas des variables correctes :
Syntaxe Prolog II Syntaxe Edinburgh
ph xx prix
1er_x
X' x12 prix y_en_a
A!ociation
Prolog
HERITAGE
©PrologIA
A!ociation
Prolog
HERITAGE
Eléments de base
R 1 - 5
1 . 4 .
C o n s t a n t e s
Les données les plus simples sont des constantes. Elles peuvent être de quatre types : les identificateurs, les nombres entiers, les nombres réels, et les chaînes de caractères.
identifier = identifier = identifierE = identifierE = abbreviated_id = abbreviated_id = prefix_limit = prefix = name = integer_number = integer_number = integer_number = integer_number = integer_number = real_number = real_numberS =
]; binary_number = octal_number = hex_number = digits = string = quoted_char = quoted_chari0 = quoted_chari1 = format_escape = prefix , prefix_limit , abbreviated_id ; abbreviated_id ; prefix , prefix_limit ,
"'", graphic_symbol, "'" ; graphic_symbol ; name - extended_var ;
"'", { (character - "'") | "'""'" }, "'";
":" ;
[ name , { prefix_limit , name } ] ; letter , { alpha } ; digits ;
"0b", binary_number ;
"0o", octal_number ;
"0x", hex_number ;
"0'", character ; digits, ".", digits, ("E"|"e"|"D"|"d"),
[ ["+"|"-"], digits]; digits, ".", digits,
[ ("E"|"e"|"D"|"d"), [ ["+"|"-"],digits] binary_digit , { binary_digit } ; octal_digit , { octal_digit } ; hex_digit , { hex_digit } ; digit , { digit } ;
""" , { quoted_char } , """ ; character - ( """ | "\" | newline) | """" ;
"\" ;
"\", format_escape ;
"b" | "f" | "n" | "r" | "t" | "\" | newline
| octal_digit, octal_digit, octal_digit
| ("x" | "X"), hex_digit, hex_digit ;
©PrologIA
R 1 - 6
Manuel de Référence
Identificateurs
Les identificateurs ont deux représentations externes : une représentation complète et une représentation abrégée. La première comporte un préfixe qui spécifie la famille dont l'identificateur fait partie; dans la représentation abrégée, le préfixe n'apparaît pas et il est supposé que certaines conventions de lecture-écriture précisent de manière non ambiguë quel est le préfixe de l'identificateur. Ces notions sont expliquées en détail au chapitre 3.
C'est la présence ou l'absence du caractère ":" qui distingue la représentation complète de la représentation abrégée d'un identificateur. Ce caractère peut être redéfini et remplacé par un caractère graphique, tel que le décrit le chapitre 3.
Les identificateurs complets suivants sont corrects et représentent tous des identificateurs différents:
data:peter x:peter sys:write
:peter grammar:singular lexicon:name sys:env:files grammar:plural
Note: La chaîne vide est un préfixe légal, l'identificateur :peter est donc correct syntaxiquement.
L'identificateur suivant n'est pas complet
peter
La syntaxe de la représentation abrégée des identificateurs et celle des variables sont très voisines et, ensemble, définissent ce que dans beaucoup d'autres langages de programmation on appelle «identificateur». Nous retiendrons que, dans la syntaxe
Prolog II, les variables commencent par une seule lettre ou par le caractère "_", tandis que les représentations abrégées d'identificateurs commencent par au moins
deux lettres. Dans la syntaxe Edinburgh, la différenciation se fait sur le premier caractère, qui doit être une lettre majuscule ou le caractère "_" pour représenter une variable ou bien une lettre minuscule pour représenter un identificateur en notation abrégée. Dans cette syntaxe, les représentations abrégées d'identificateurs peuvent
également être des suites de caractères graphiques.
Voici des exemples d'identificateurs abrégés corrects :
Syntaxe Prolog II Syntaxe Edinburgh
pomme pomme' pomme12 i10 pomme
***
§
A!ociation
Prolog
HERITAGE
©PrologIA
A!ociation
Prolog
HERITAGE
Eléments de base
R 1 - 7 des exemples d'identificateurs incorrects :
Syntaxe Prolog II Syntaxe Edinburgh
x
1er_lapin y_en_a l'herbe
Pomme
1er_lapin pomme'
Nombres
La syntaxe des nombres en Prolog II+ est sensiblement la même que dans la plupart des langages de programmation.
Les nombres entiers sont signés et permettent de représenter, a priori, des valeurs quelconques. Plusieurs syntaxes d'entiers sont acceptées.
Un entier peut être exprimé dans les bases suivantes : 2, 8, 10, 16. Pour cela, la mantisse de l'entier sera préfixée respectivement par : 0b, 0o, 0, 0x. Par défaut une mantisse non préfixée sera considérée en base décimale. Les petits entiers, inférieurs
à 256, pourront également être exprimés à l'aide du préfixe 0' suivi d'un caractère, la valeur de l'entier sera alors le code du caractère 3 . Par exemple, les expressions suivantes représentent des entiers :
Expression:
0b110
0o110
0110
0x110
0'A
Valeur:
6
72
110
272
65
On notera que, contrairement à d'autres langages, les nombres réels doivent comporter un exposant explicite : l'expression -12.34 ne définit pas un nombre réel, mais une paire pointée formée des deux entiers -12 et 34. En revanche,
-12.34e0 est un réel correct. C'est le choix par défaut en syntaxe Prolog II, il est néanmoins possible, pour se ramener à une syntaxe standard, de le modifier par une option sur la ligne de commande au lancement de Prolog (cf. § 2.3 du manuel d'utilisation).
Les nombres réels sont codés en double précision, cela correspond au type double du standard IEEE 64 bits. La lettre introduisant l'exposant peut être une des suivantes : e, E, d ou D. On préférera toutefois e et E.
3
Attention aux caractères étendus, leur valeur dépend du mode choisi : ISO 8859-1 ou code de la machine hôte.
©PrologIA
R 1 - 8
Manuel de Référence
Chaînes de caractères
Les chaînes de caractères sont encadrées par des doubles quotes """. Tous les caractères imprimables peuvent figurer dans une chaîne sans précaution particulière, sauf le caractère """ qui doit être doublé et éventuellement le caractère "\" qui doit
être doublé si l'interprétation de la lecture du "\" est active (cf. les options de comportement § U 2.3.); par exemple, la chaîne: est correcte.
"il faut traiter "" et \\ avec précaution"
De façon générale le caractère "\" ne doit pas forcément être doublé: lorsque l'interprétation de lecture du "\" est active (cf. § 2.3 du manuel d'utilisation), si avec les caractères qui le suivent, il forme une expression (séquence escape) représentant un autre caractère, il faut le doubler; dans tous les autres cas, il n'est pas utile de le doubler:
"Utiliser \ suivi de RETURN pour ignorer une fin de ligne"
"Les codes hexadécimaux doivent commencer par \\x"
Quand l'interprétation du "\" est active (règles annotées par i1), plusieurs expressions commençant par "\" permettent de représenter un caractère.
Les expressions suivantes permettent de spécifier certains caractères non imprimables dans la définition d'une chaîne :
\b espace arrière (backspace)
\f saut de page (form feed)
\n saut à la ligne (newline). Lors de son écriture, ce caractère est, le cas
échéant, remplacé par le(s) caractère(s) requis pour obtenir une nouvelle ligne sur l'unité de sortie.
\r retour en début de ligne (carriage return)
\t tabulation
D'autres expressions permettent de représenter des caractères qui n'existent pas sur la machine hôte (voir le paragraphe 1.9.5).
Au moyen du nombre qui est son code interne, tout caractère peut être spécifié dans une chaîne. Par exemple, les expressions "\033" et "\x1B" définissent toutes deux une chaîne composée de l'unique caractère dont le code est 27. Le caractère nul (i.e.: celui dont le codage interne est le nombre 0) ne doit pas figurer dans les chaînes de caractères.
Une chaîne de caractères peut s'étendre sur plusieurs lignes. Pour cela, le dernier caractère de chacune des lignes en question sauf la dernière doit être "\" ; le "\" et le caractère de fin de ligne seront ignorés. Par exemple, l'expression
A!ociation
Prolog
HERITAGE
©PrologIA
A!ociation
Prolog
HERITAGE
Eléments de base
R 1 - 9
"ceci est une chaî\ ne sur deux lignes" définit la même chaîne que "ceci est une chaîne sur deux lignes".
En Prolog, le type chaîne de caractère existe et une chaîne de caractères représente donc un objet de ce type. En syntaxe Edinburgh, une option de démarrage permet de définir l'interprétation syntaxique de cette unité lexicale, qui peut représenter un des termes suivants: un identificateur, une liste d'identificateurs d'une lettre, une liste d'entiers, une chaîne Prolog.
N.B. : En écrivant des programmes Prolog, il arrive qu'une donnée symbolique puisse être représentée soit par une chaîne de caractères, soit par un identificateur.
Les identificateurs étant eux-mêmes codés sous forme d'entités atomiques, on admet généralement qu'ils constituent une représentation des objets symboliques plus efficace que les chaînes.
1 . 5 .
Termes et arbres
Toutes les données manipulées en Prolog sont des arbres éventuellement infinis dont nous allons tout d'abord donner une description informelle. Ces arbres sont formés de nœuds étiquetés :
• soit par une constante et, dans ce cas, ils n'ont aucun fils,
• soit par le caractère "point" et, dans ce cas ils ont deux fils,
• soit par "<>" ou"<->" ou "<-->" ou "<--->" ou… et, dans ce cas, le nombre de traits d'union correspond au nombre de leurs fils.
La figure suivante présente deux exemples d'arbres finis :
• <--->
/ \ / | \
"a" • ___/ | \___
/ \ / | \
"b" • plus <---> <--->
/ \ / | \ / | \
"c" nil fois 5 8 fois 5 8
Figure 1.1
©PrologIA
R 1 - 10
Manuel de Référence
La figure 1.2 est un exemple d'arbre infini :
<--->
/ | \ ou "c" <--->
/ | \
et "a" <--->
/ | \
et <---> "b"
/ | \
ou "c" <--->
/ | \
et "a" <--->
/ | \
et <---> "b"
/ | \
ou "c" <--->
/ | \
et "a" <--->
/ | \
et <---> "b"
/ | \
Figure 1.2
Remarquons que le dessin des arbres peut être allégé comme le montre la figure 1.3.
identificateur au lieu de <--- . . . --->
/ | | \ / | | | \ x1 x2 ... xn identificateur x1 x2 ... xn
Figure 1.3
Bien entendu cette simplification présuppose que n ne soit pas nul. Les deux derniers arbres peuvent alors être représentés sous la forme classique de :
A!ociation
Prolog
HERITAGE
©PrologIA
A!ociation
Prolog
HERITAGE
Eléments de base
R 1 - 11
plus ou
/ \ / \
fois fois "c" et
/ \ / \ / \
5 8 5 8 "a" et
/ \
ou "b"
/ \
"c" et
/ \
"a" et
/ \
ou "b"
/ \
"c" et
/ \
"a" et
/ \
ou "b"
/ \
Figure 1.4
La notion d'arbre infini est suffisamment inhabituelle pour que nous nous étendions un peu dessus. Intuitivement un arbre est infini s'il possède une branche infinie.
Nous nous intéresserons plus spécialement à la fraction des arbres infinis qui ensemble avec les arbres finis forme les arbres dits rationnels : c'est à dire les arbres qui ont un nombre fini de sous-arbres. Si nous reprenons les deux derniers exemples d'arbres l'ensemble de leurs sous-arbres est décrit dans la figure 1.5.
©PrologIA
R 1 - 12
Manuel de Référence
{ <---> , <---> , plus , fois , 5 , 8 }
/ | \_____ / | \
/ | \ fois 5 8 plus <---> <--->
/ | \ / | \
fois 5 8 fois 5 8
{ <--->, <--->, <--->, ou, et, "a","b","c"}
/ | \ / | \ / | \
ou "c" <---> et "a" <---> t <---> "b"
/ | \ / | \ / | \
et "a" <---> et <---> "b" ou "c" <--->
/ | \ / | \ / | \
et <---> "b" ou "c" <---> et "a" <--->
/ | \ / | \ / | \
ou "c" <---> et "a" <---> et <---> "b"
Figure 1.5
Ces ensembles étant finis, il s'agit donc d'arbres rationnels. Le fait qu'un arbre rationnel contienne un ensemble fini de sous-arbres donne un moyen immédiat de le représenter par un diagramme fini : il suffit de fusionner tous les nœuds d'où partent les mêmes sous-arbres (figure 1.6).
A!ociation
Prolog
HERITAGE
Figure 1.6
©PrologIA
A!ociation
Prolog
HERITAGE
Eléments de base
R 1 - 13
Si on ne fait pas toutes les fusions on obtient la figure 1.7.
Figure 1.7
Il faut donc se méfier du fait que des diagrammes différents puissent représenter le même arbre.
Pour représenter les arbres nous utiliserons des formules appelées termes. Nous introduirons tout d'abord la notion de terme strict : strict_term = strict_term P = strict_term E = strict_term P = strict_term E = variable | identifier | constant
| "[ ]"
| "< >" ;
"(", strict_term , "." , strict_term , ")" ;
"[", strict_term , "|" , strict_term , "]" ;
"<", strict_term , { "," , strict_term } , ">" ;
"<>(", strict_term , { "," , strict_term } , ")" ;
Les termes stricts sont les "vrais" termes. Cependant pour des raisons de commodité on étend la syntaxe des termes stricts (sans en altérer le sens) en permettant :
• P d'ajouter et d'enlever des parenthèses mais en convenant que:
t1.t2. … .tn représente (t1.(t2.( … .tn) … ))) ;
• E d'ajouter et d'enlever des crochets mais en convenant que:
[t1,t2,…,tn] représente [t1 | [t2 | …[tn | [] ] ]] et
[t1,t2,…,tn| t] représente [t1 | [t2 | …[tn | t] ]];
• d'écrire id(t1, t2, … , tn) au lieu de <id, t1, t2, … , tn> à condition que id soit un identificateur et que n soit différent de 0.
©PrologIA
R 1 - 14
Manuel de Référence
Ceci conduit à une notion plus générale de terme :
aiment(Pierre.Paul.Jean.nil, pere_de(x))
et le terme strict correspondant est :
<aiment, (Pierre.(Paul.(Jean.nil))), <pere_de, x>>
Pour transformer un terme en un arbre il faut affecter ses variables par des arbres, d'où la notion d'affectation sylvestre, qui est un ensemble X de la forme :
X = { x1 := r1, x2 := r2, … } où les xi sont des variables distinctes et les ri des arbres. Nous introduirons aussi la notation suivante : si r1, r2 sont des arbres et si r1, r2, … , rn est une suite de n arbres alors (r1.r2) et <r1, r2, … , rn> représentent respectivement les arbres suivants :
• <-- ... ->
/ \ / | \ r1 r2 r1 r2 rn
Figure 1.8
Si t est un terme strict faisant intervenir un sous-ensemble de l'ensemble des variables de l'affectation sylvestre X = { x1 := r1, x2 := r2, … } alors l'expression
t/X désignera l'arbre obtenu en remplaçant les variables xi par les arbres correspondants ri. Plus précisément :
- t/X = ri si t = xi ;
- t/X = valeur de k si t est la constante k ;
- t/X = (t1/X . t2/X) si t = (t1 . t2) ;
- t/X = [t1/X | t2/X)] si t = [t1 | t2] ;
- t/X =<t1/X, … , tn/X> si t = <t1, … , tn>.
- t/X =<>(t1/X, … , tn/X) si t = <>(t1, … , tn).
Si t1 et t2 sont des termes alors les formules t1 = t2 et t1 ! t2 sont respectivement une équation et une inéquation. Un ensemble S de telles formules est un système
(d'équations et d'inéquations).
L'affectation sylvestre X est appelée solution du système :
S = {p1 := q1, p2 := q2, … } " {s1 ! t1, s2 ! t2, . . . }
A!ociation
Prolog
HERITAGE
©PrologIA
A!ociation
Prolog
HERITAGE
Eléments de base
R 1 - 15 si X contient les mêmes variables que S et si X est telle que les arbres pi/X sont respectivement égaux aux arbres qi/X et que les arbres si/X sont respectivement différents des arbres ti/X.
En utilisant ces notions il est possible de représenter le premier arbre de ce paragraphe par :
("a"."b"."c".nil) / {} ou ["a","b","c"] / {} suivant la syntaxe.
Le second arbre par :
plus(fois(l2, l1), fois(l2, l1)) / {} ou
plus(x, x) / X, avec X solution de {x = fois(l2, l1)} et le troisième par :
x/X, avec X solution de { x = ou("c", et("a", et(x, "b"))) }
1 . 6 .
Les opérateurs
Les opérateurs ont été introduits dans le compilateur Prolog II+, comme un moyen souple et clair d'exprimer certains arbres.
Par exemple, la représentation interne du terme mul(sub(5, 3),add(5, 3)) étant la même que celle du terme (5 - 3) * (5 + 3), la deuxième expression est certainement plus agréable à lire que la première.
La syntaxe des expressions écrites avec des opérateurs est donnée par: expr expr n n expr expr expr
0 n n
=
=
=
=
= prefix_op n,d postfix_op infix_op n,g n,g,d
=
=
= prefix_op expr expr expr g g pterm ;
; n,d
, expr
, postfix_op
, infix_op d n,g n,g,d
;
;
, expr d
; identifier | graphic_symbol ; identifier | graphic_symbol ; identifier | graphic_symbol ;
Voir la description complète au paragraphe 1.9.
©PrologIA
R 1 - 16
Manuel de Référence
1 . 7 .
Les règles et les assertions
D'un point de vue théorique, un programme Prolog sert à définir un sous-ensemble
A dans l'ensemble R de nos arbres. Les éléments de A sont appelés assertions et l'on peut généralement associer une phrase déclarative à chacun d'eux. La figure 1.9
montre quelques exemples de telles associations. L'ensemble A des assertions est généralement infini et constitue en quelque sorte une immense banque de données.
Nous verrons plus loin que l'exécution d'un programme peut être vue comme une consultation d'une fraction de cette banque. Bien entendu cette banque ne peut être enregistrée sous une forme explicite. Elle doit être représentée à partir d'une information finie mais suffisante pour pouvoir déduire la totalité de l'information contenue dans la banque. Dans ce but, la définition de l'ensemble A des assertions est faite au moyen d'un ensemble fini de règles, chacune étant de la forme :
t0 -> t1 … tn où n peut être nul et où les ti sont des termes.
est_fils_de
/ \
Jacques Marie
pour « Jacques est le fils de Marie »
plus
pour « 2 et 2 font 4 »
/ | \ suc suc suc
| | | suc suc suc
| | |
0 0 suc
|
suc
|
0 suite_infinie
|
•
/ \
1 •
/ \
1 •
/ \
1 ...
pour « 1 1 1 ... est une suite infinie »
Figure 1.9
Une syntaxe simplifiée 4 des règles est la suivante :
A!ociation
Prolog
HERITAGE
4
On trouvera au dernier paragraphe de ce chapitre la syntaxe complète des règles.
©PrologIA
A!ociation
Prolog
HERITAGE
Eléments de base
R 1 - 17
3.1
rule E =
3.2
rule E =
3.3
rule P = term , "." ; term , ":-" , term { "," , term },
"." ; term , "->", { term }, ";" ;
Avec la contrainte fondamentale suivante :
Le terme qui est le membre gauche d'une règle doit être:
soit un identificateur
soit un tuple dont le premier argument est un identificateur
Par exemple, les termes : go, pere_de(_x,_y) ou <pere_de, _x, _y> peuvent être des têtes de règle correctes, tandis que -contrairement à ce qui se passe pour Prolog IIdes termes comme <<pere_de, _x>, _y> ou <masc.sing, x, y> ne peuvent pas l'être.
Pour le moment nous ferons abstraction de la notion de parasite, qui comme nous le verrons plus tard, est un moyen ad hoc d'appeler des sous-programmes non écrits en Prolog.
Les règles de la forme :
t0 -> t1 … tn induisent un ensemble, généralement infini, de règles particulières portant sur des arbres :
t0 / X ! t1 / X … tn / X obtenues en considérant, pour chaque règle, toutes les affectations sylvestres possibles :
X = { x1 : = s1, … , xm : = sm } qui font intervenir les variables de la règle en question.
Chacune de ces règles particulières :
r0 ! r1 … rn peut s'interpréter de deux façons :
(1) Comme une règle de réécriture :
r0 se réécrit dans la suite r1 … rn, et donc, lorsque n=0, comme :
r0 s'efface.
©PrologIA
R 1 - 18
Manuel de Référence
(2) Comme une implication logique portant sur le sous-ensemble A d'arbres:
r1, r2, … , rn éléments de A, entraîne r0 élément de A.
Dans ce cas, lorsque n = 0, l'implication se résume à :
r0 élément de A.
Suivant que l'on prend l'une ou l'autre des interprétations, les assertions se définissent par :
Définition 1 : les assertions sont les arbres que l'on peut effacer, en une ou en plusieurs étapes au moyen des règles de réécriture.
Définition 2 : les assertions forment le plus petit ensemble A d'arbres qui satisfait les implications logiques.
On peut démontrer l'existence du plus petit ensemble de la deuxième définition et l'équivalence des deux définitions.
A!ociation
Prolog
HERITAGE
1 . 8 .
Les mécanismes de base de Prolog
Nous venons de montrer quelle est l'information implicite contenue dans un programme Prolog, mais nous n'avons pas montré ce qu'est l'exécution d'un programme Prolog. Cette exécution vise à résoudre le problème suivant :
Etant donné un programme qui est une définition récursive d'un ensemble A d'assertions.
Etant donné une suite de termes T0 = t1 … tn et l'ensemble de ses variables
{ x1, . . ., xm }.
Trouver toutes les affectations sylvestres X = { x1 := r1, … , xm = rm} qui sont telles que les arbres t1/X, . . ., tn/X soient des assertions.
Pour résoudre ce problème l'ordinateur doit produire toutes les dérivations de la forme :
(T0, S0) -> (T1, S1) -> (T2, S2) -> …
Les Ti étant des suites de termes appelés buts et les Si étant des systèmes d'équations et d'inéquations ayant au moins une solution. S0 est le système vide :
{ }. On peut expliquer simplement la dérivation (Ti, Si) -> (Ti+1, Si+1) au moyen des trois lignes suivantes :
(1) (q0 q1 … qn , S)
(2) p0 -> p1 … pm
(3) ( p1 … pm q1 … qn , S ! { q0 = p0 } )
©PrologIA
A!ociation
Prolog
HERITAGE
Eléments de base
R 1 - 19
La première ligne représente la forme que doit avoir le couple (Ti , Si), la seconde la règle utilisée et la troisième le résultat (Ti+1, Si+1). Avant d'utiliser une règle, il est nécessaire de renommer ses variables pour qu'aucune d'entre elles n'apparaisse dans
(Ti ,Si). Il est aussi nécessaire de vérifier que le nouveau système Si+1 qui est obtenu en ajoutant l'équation {q0 = p0} à Si possède au moins une solution.
Traditionnellement cette vérification est appelée unification de q0 avec p0.
Le but des dérivations précédentes est de trouver un couple (Tj, Sj) pour lequel la suite Tj est vide ; ce couple est donc dérivable de (T0, { }). On peut montrer que les affectations sylvestres X qui sont solution de Sj sont les réponses à notre problème.
Le résultat imprimé par l'ordinateur est alors une forme simplifiée du système Sj dans laquelle les inéquations sont omises.
On peut également montrer que Prolog II+ vérifie parfaitement si un système d'équations et d'inéquations a au moins une solution.
D'un point de vue plus pratique, quand on lance Prolog, on se trouve dans une boucle qui lit une suite de buts T0 = t1 … tn, cherche à les effacer de toutes les manières possibles ((T0, { }) -> … -> (Tj, Sj) avec Tj vide), puis imprime les systèmes Sj correspondants. L'ordinateur écrit le caractère ">" quand il attend une suite de buts. De la même manière que nous avions une contrainte sur les règles, nous avons la contrainte suivante sur les buts :
A chaque étape, les arbres représentant le but qui va être effacé doivent avoir leur branche de gauche représentée par un identificateur.
Les parasites permettent l'utilisation de sous-programmes externes. Pour expliquer comment ces sous-programmes sont appelés, il faut se référer à la première des trois lignes qui décrit le mécanisme de base de Prolog : si q0 est un parasite, alors au lieu d'essayer d'utiliser une règle, Prolog exécute le sous-programme correspondant.
Certains parasites apparaissent dans les règles prédéfinies qui font l'interface entre des sous-programmes externes et des règles Prolog. Cet ensemble de règles prédéfinies constitue un environnement de programmation très complet permettant notamment :
• de contrôler et de modifier le déroulement d'un programme (chapitre 2 : “Le contrôle de l'effacement des buts”) ;
• de structurer et modifier l'ensemble de règles qui constituent le programme
Prolog courant (chapitre 3 : “Structuration et modification des règles”) ;
• d'avoir accès aux fonctions classiques d'arithmétique et de traitement de chaînes
(chapitre 4 : “Opérations prédéfinies sur les données”) ;
• de gérer les entrées-sorties (chapitre 5 : “Les entrées / sorties”);
• de communiquer avec le système hôte (chapitre 6 : “L'environnement”).
©PrologIA
R 1 - 20
Manuel de Référence
Il est également possible au programmeur averti d'introduire de nouvelles règles prédéfinies qui font référence à de nouveaux parasites qui seront écrits dans un autre langage que Prolog (C, F
ORTRAN
, Pascal…). ( Voir chapitre 7 : "Extensions avec des langages externes" ou Annexe D : "Ajout de règles externes (méthode des parasites)").
Deux règles prédéfinies ont un lien étroit avec le mécanisme de base de Prolog II+:
dif et eq.
La règle dif est la plus importante. C'est elle qui permet d'introduire les inéquations dans les systèmes d'équations et d'inéquations. Plus précisément, l'exécution de
dif(x,y) ajoute l'inéquation x
Si+1 a au moins une solution.
!
y au système Si et vérifie que le nouveau système
De la même manière la règle eq introduit les équations.
eq(x, x) -> ;
Les règles suivantes ne sont pas exactement des règles prédéfinies, mais tout se comporte comme si elles existaient. Elles sont utilisées pour transformer une liste de buts en un seul but.
p.q -> p q ; nil -> ;
A!ociation
Prolog
HERITAGE
1 . 9 .
La syntaxe complète de Prolog II+
Nous rassemblons ici la syntaxe complète de Prolog II+ ainsi qu'un certain nombre d'exemples et de remarques additionnelles. Les notations utilisées sont celles de la commission de normalisation de Prolog (voir le premier paragraphe de ce chapitre).
©PrologIA
A!ociation
Prolog
HERITAGE
1 . 9 . 1 .
Eléments de base
R 1 - 21
Le niveau syntaxique
1 program =
2.10 directive P =7
2.21 directive E =7
3.10 rule P =
3.21 rule E =
4.1
term P =
4.2
term E =
5 termlist =
6.12 expr n
=
6.2
expr n
6.3
expr n
6.42 expr n
=
=
6.5
expr
0
=
=
7.1
pterm =
7.23 pterm =
7.3
pterm P =
7.44 pterm =
7.55 pterm =
7.66 pterm =
7.7
pterm =
7.8
pterm =
8.1
listexpr =
8.2
listexpr =
!
rule | directive " ;
"->", ! pterm" , ";" ;
":-", expr term, "." ; expr
1199
, "." ; term , "->", ! pterm ", ";" ; expr expr
1000
, [ "." , term ] ;
1200
999
;
, ! "," , expr prefix_op expr expr expr g n,d
, expr g
, infix_op
; n,g,d
999
"
; d
; n,g
;
, expr d
; pterm ;
( identifier | variable ) , [ "(" , termlist , ")"];
( identifier | variable ) , "[" , term , "]";
"<", termlist , ">" ;
"< >", [ "(", termlist ,")" ];
"!", termlist , """ ;
"[" , listexpr , "]" | "[ ]" ; constant | "!" | "/?", integer_number ;
"(" , term , ")" ; expr expr
999
999
, [ "," , listexpr ] ;
, "|" , expr
999
;
Quand Prolog est lancé, la machine est prête à exécuter un programme, elle attend un term. Quand Prolog est passé dans un mode de compilation, c'est à dire un mode d'insertion de programme (cf. chapitre 3 de ce manuel), Prolog attend alors un
program.
Notes:
0. Définit la syntaxe en mode Prolog II.
1. Définit la syntaxe en mode Edinburgh.
2. expr expr
1
n
représente la suite de règles expr
1
,...,expr
1200 en syntaxe Edinburgh.
,...,expr
1000 en syntaxe Prolog II, et
3. La règle 7.2 exprime une syntaxe alternative pour les références aux composantes des tableaux, qui permet un accès optimisé. Par exemple, si table est le nom d'un tableau (défini par l'emploi de la règle prédéfinie def_array) alors les deux expressions table(10) et table[10] sont équivalentes. Cependant, le compilateur traduit la deuxième forme de manière plus efficace.
©PrologIA
R 1 - 22
Manuel de Référence
4. Les règles 7.3 et 7.4 définissent deux syntaxes alternatives pour les tuples. En syntaxe Edinburgh seule la deuxième alternative est possible. On a donc les
équivalences:
< x , y >
!
< > ( x , y )
5. La règle 7.5 permet de décrire des grammaires non contextuelles (en vue d'écrire en Prolog des analyseurs syntaxiques).
6. En syntaxe Prolog II, les règles 4 d'une part, et 7.6, 8.1 et 8.2 d'autre part définissent deux syntaxes alternatives pour la notation des listes. On a les équivalences suivantes :
[ a | b ]
[ a , b ]
[ a , b , c , d ]
[ a , b , c | d ]
[ ]
!
!
!
!
!
a . b a . b . nil a . b . c . d . nil a . b . c . d nil
En syntaxe Prolog II, les deux syntaxes de liste peuvent toujours être mélangées dans les programmes :
[ a , b | c.d.nil ]
!
a . [b , c , d]
7. Certains termes admis au titre de directives, ne sont pas des règles prédéfinies mais simplement des déclarations (par exemple module, end_module). Ils ne doivent pas dans ce cas être précédés de "->" ou ":-" comme il est dit dans les règles 2.1 et 2.2.
1 . 9 . 2 .
Les opérateurs
Les opérateurs permettent d'étendre dynamiquement la syntaxe des termes. On distingue les opérateurs préfixés, postfixés, et infixés.
10
11
12 prefix_op postfix_op infix_op n,d n,g n,g,d
= identifier | graphic_symbol ;
= identifier | graphic_symbol ;
= identifier | graphic_symbol ;
On notera que dans la syntaxe Prolog II, les opérateurs ne sont pas autorisés au premier niveau des termes de la queue de règle, il faut parenthéser l'expression dans ce cas. En syntaxe Edinburgh, il n'y a pas de restriction.
Le type d'opérateur est indiqué par une convention permettant de définir la précédence des opérandes en fonction de la précédence n de l'opérateur:
A!ociation
Prolog
HERITAGE
©PrologIA
A!ociation
Prolog
HERITAGE
Eléments de base
R 1 - 23 type précédence type opérateur préc.opérande(s) exemple fx n fy n xf n yf n xfx n xfy n yfx n op n,d op n,d op op op op op n,g n,g n,g ,d n,g ,d n,g ,d d:= n-1 d:= n g:= n-1 g:= n g:= n-1, d:= n-1 g:= n-1, d:= n g:= n, d:= n-1
- (- 1) val(1'<'2,x) a,b,c E val(1/2/3,x)
Le tableau suivant décrit les opérateurs en syntaxe prolog II+. Le tableau indique pour chaque opérateur le terme syntaxique construit.
opérateur
'<'
'\/'
*
/
mod
rem
'<<'
'>>'
^
'=<'
'>'
'>='
=\=
=:=
+
-
'/\'
**
+
1
-
1 précédence
700
700
700
700
700
700
500
500
500
500
400
400
400
400
400
400
200
200
200
200 yfx yfx yfx yfx yfx yfx yfx yfx yfx xfy xfx fx fx xfx xfx xfx yfx type xfx xfx xfx terme construit sys:inf(t1,t2) sys:infe(t1,t2) sys:sup(t1,t2) sys:supe(t1,t2) sys:'=\='(t1,t2) sys:eql(t1,t2) sys:add(t1,t2) sys:sub(t1,t2) sys:'/\'(t1,t2) sys:'\/'(t1,t2) sys:mul(t1,t2) sys:div(t1,t2) sys:mod(t1,t2) sys:rem(t1,t2) sys:'<<'(t1,t2) sys:'>>'(t1,t2) sys:'^'(t1,t2) sys:'**'(t1,t2) sys:add(t1) sys:sub(t1)
Note 1 : Les arbres correspondant aux opérateurs unaires + et - sont évalués au moment de l'analyse si leur argument est une constante entière.
Note 2: Les opérateurs peuvent être écrits avec des quotes simples. Celles-ci n'ont donc pas d'autre fonction, en Prolog II+, que d'étendre la syntaxe des identificateurs. Il n'est donc pas possible d'utiliser une notation fonctionnelle autre que celles des tuples pour un foncteur déclaré en opérateur. Lorsque l'on a un doute sur le terme construit, on peut toujours le tester en décomposant le terme:
> eq(F(X,Y),1'<'2);
{F=inf, X=1, Y=2}
©PrologIA
R 1 - 24
Manuel de Référence
1 . 9 . 3 .
Le niveau lexical
Cette syntaxe définit les mêmes unités que celles reconnues par la primitive read_unit(x,y)
.
Notes :
1. La règle L4 définit la syntaxe de base des variables; deux extensions de cette syntaxe sont données par les règles L5.
P (syntaxe Prolog II) et L5.
E (syntaxe
Edinburgh). Dans les deux cas, le principe de l'extension est le même : un certain sous-ensemble des noms qui auraient été des représentations abrégées d'identificateurs pour la syntaxe de base, est ajouté à l'ensemble des variables.
Ces deux extensions sont facultatives et incompatibles entre elles. C'est l'utilisateur qui, au démarrage de la session Prolog, choisit la syntaxe qu'il souhaite employer: se référer au Manuel d'Utilisation.
2. Certaines combinaisons sont interdites comme "/*", "*/", "|*", "*|".
3. Une option sur la ligne de commande permet de rendre l'exposant facultatif, au prix d'une ambiguïté avec les listes en syntaxe Prolog II: 1.2 est lu comme un réel en entrée. Cette règle n'est valide que si cette option est choisie. Voir le manuel d'utilisation, paragraphe 2.3.
4. La règles L2.1 et L2.2 donnent la syntaxe de base des identificateurs. Une extension pour la syntaxe Edinburgh est donnée par les règles L2.3 et L2.4.
5. La règle L2.3 est nécessaire pour exprimer le passage de l'identificateur abrégé représenté par un graphic_symbol à sa représentation complète. En effet le caractère qui délimite le préfixe de l'identificateur abrégé, étant lui-même un caractère graphique, une ambiguïté apparaîtrait si les quotes n'étaient pas ajoutées. Par exemple, sys::- est vu par l'analyseur d'unités lexicales comme: l'identificateur sys, immédiatement suivi de l'identificateur ::- et sys:':-' est vu comme: l'identificateur prédéfini :- de la famille sys.
A!ociation
Prolog
HERITAGE
©PrologIA
A!ociation
Prolog
HERITAGE
Eléments de base
R 1 - 25
L1 unit =
L2.1 identifier =
L2.2 identifier =
L2.3
E identifier 5 =
L2.4
E identifier 4 =
L3.1 abbreviated_id =
L3.2 abbreviated_id =
L4 variable 1 =
L5.
P extended_var =
L5.
E extended_var =
L6 prefix =
L7 constant =
L8.1 integer_number =
L8.2 integer_number =
L8.3 integer_number =
L8.4 integer_number =
L8.5 integer_number =
L9 real_number =
L9.1
S real_number 3 =
];
L10 string =
L11 name =
L12 digits =
L13.
P graphic_symbol 2 =
L13.
E graphic_symbol 2 =
L14.1 comment =
L14.2 comment =
L14.3 comment = identifier | separator | variable
| constant | graphic_symbol ; prefix , prefix_limit , abbreviated_id ; abbreviated_id ; prefix , prefix_limit ,
"'", graphic_symbol, "'" ; graphic_symbol ; name - extended_var ;
"'", " (character - "'") | "' '" #, "'" ;
"_" , "alpha# | extended_var ; letter, [ (digit | "_"), "alpha# ], " "'" #!; big_letter, [ {alpha} ] ;
[ name , " prefix_limit , name # ] ; integer_number | real_number | string ; digits ;
"0b", binary_number ;
"0o", octal_number ;
"0x", hex_number ;
"0'", character ; digits, ".", digits,
("E"|"e"|"D"|"d"), [ ["+"|"-"],digits]; digits, ".", digits,
[ ("E"|"e"|"D"|"d"), [ ["+"|"-"],digits]
""" , " string_char # , """ ; letter , " alpha # ; digit , " digit # ;
"->" | graphic_c, " graphic_c | "." #;
"
graphic_c #;
"|*", " character # , "*|" ;
"/*", " character # , "*/" ;
"%", " character # , newline ;
©PrologIA
R 1 - 26
Manuel de Référence
1 . 9 . 4 .
Les caractères
Les règles dont le membre gauche est annoté par I ne sont actives que lorsque le mode d'exécution de Prolog II+ est le mode ISO(cf. § U2.3). Les règles dont le membre gauche est annoté par H ne sont actives que lorsque le mode d'exécution de
Prolog II+ est le mode hôte(cf. § U2.3).
Est désigné par host_letter, tout caractère du système hôte communément admis comme lettre et qui n'appartient pas au jeu ISO 8859-1; de la même façon, est désigné par host_graphic_char, tout caractère imprimable du système hôte n'étant ni un alpha, ni un separator, ni un special_char et inconnu du jeu ISO 8859-1.
Une description adaptée au jeu de caractères de la machine hôte sera donnée dans le manuel d'utilisation au paragraphe 3.2.
La règle C6.2 et les règles C7.2 et C8.1 représentent le même ensemble de caractères, mais elles ne sont pas valides simultanément. Celle annotée par P est valide en syntaxe Marseille, celles annotées par E sont valides en syntaxe
Edinburgh. En changeant de syntaxe, ces caractères ne jouent plus le même rôle.
La règle C5 est valide, si le caractère qui délimite dans les identificateurs complets, le préfixe et le suffixe, n'a pas été redéfini. Il peut valoir alors, un des caractères graphiques.
A!ociation
Prolog
HERITAGE
C1 big_letter =
C2 letter =
C2.1 letter H =
C2.21 letter I, i1 =
C3.1 binary_digit =
C3.2 octal_digit =
C3.3 digit =
C3.4 hex_digit =
C4 alpha =
C5 prefix_limit =
C6.1 separator =
C6.2 separator P =
C7.1 special_char=
C7.2 special_char E =
C8 graphic_c =
"A" | … | "Z" ; big_letter | "a" | … | "z"
| "À" … "ß" - "$" | "à" … "ÿ" - "÷"; host_letter;
"\", accent_escape ;
"0" | "1" ;
"0" | … | "7" ;
"0" | … | "9" ; digit | "a" | "b" | "c" | "d" | "e" | "f"
| "A" | "B" | "C" | "D" | "E" | "F"; letter | digit | "_";
":" ;
"(" | ")" | "[" | "]" | "{" | "}" |
"|" | "," ;
";" | "." | "<" | ">" ;
"%" | "'" | """ | "_" | "!" | "`" ;
";" ; graphic_char ;
©PrologIA
A!ociation
Prolog
HERITAGE
C8.1 graphic_char E =
C8.2 graphic_char =
C8.3 graphic_char H =
C9 character =
C10 string_char =
C10.1 string_char i0 =
C10.2 string_char i1 =
C10.31string_char
I, i1 =
Eléments de base
R 1 - 27
"." | "<" | ">" ;
"#" | "$" | "&" | "*" | "+" | "-" | "/" | ":"
| "=" | "?" | "\" | "@" | "^" | "~"
| NBSP … "¿" | "!" | "÷" ; host_graphic_char ; letter | digit | separator | graphic_char | special_char ; character - ( """ | "\") | """";
"\";
"\", format_escape ;
"\", accent_escape ;
C111 accent_escape = accent , accent_letter | "~a"
| "~A" | "~n" | "~N" | "~o"
| "~O" | "cc"| "CC" | "ae" | "AE"
| "BB" | "/o" | "/O" | ""y"| "'y"| "'Y"
| "-d"|"-D" | "pp" | "PP" | "oa"| "oA" ;
C123 accent =
C13 accent_letter =
C142 format_escape =
"`" | "'" | "^" | ":" ;
"a" | "e" | "i" | "o" | "u"
| "A" | "E" | "I" | "O" | "U" ;
"b" | "f" | "n" | "r" | "t" | "\"
| newline
| octal_digit, octal_digit, octal_digit
| ("x" |"X"), hex_digit, hex_digit ;
1 . 9 . 5 .
Les caractères accentués
Une option de comportement (cf. §2.3. du manuel d'utilisation) définit le mode de lecture du caractère "\". Lorsque l'interprétation du "\" est active, les règles sont annotées par i1, lorsqu'elle ne l'est pas les règles sont annotées par i0. Les règles ainsi annotées sont exclusives. Leur validité dépend de l'option choisie.
Les notes ci-après sont valides uniquement lorsque l'interprétation du "\" est active.
Notes :
1. Il existe un mode d'exécution Prolog (cf. § U2.3.) dans lequel les accent_escape ne sont pas permis et sont remplacés par les format_escape; dans ce mode, ces règles(C2.2, C10.3, C11) ne sont pas valides. Sinon les accent_escape peuvent toujours être utilisés en entrée pour spécifier des caractères accentués. En sortie
©PrologIA
R 1 - 28
Manuel de Référence
Prolog utilise un accent_escape pour les caractères accentués du jeu ISO 8859-1 n'existant pas dans le jeu de caractère du système hôte.
2. De la même manière que pour les accent_escape, les format_escape peuvent toujours être utilisés en entrée pour spécifier un caractère. En sortie Prolog utilise un format_escape pour les caractères n'existant pas dans le jeu de caractère du système hôte, et ne pouvant être représentés par un accent_escape (en mode hôte par exemple).
3. Le caractère ":" dans un accent_escape représente le diacritique tréma: cano\:e <=> canoë
6
7
4
5
2
3
0
1
8
9
10
11
12
13
14
15
128 144 160 176 192 208 224 240
À
-,D
à
Á Ñ á
Â
Ã
Ä
Å
Æ
Ç
È
É
Ê
Ë
ì Ü ì ü
í I, o í I, o
ï
î
´
Ó
,
Ò
Ô
Õ
Ö
!
Ø
Ù
Ú
Û
Y
æ
, î
ß ï
â
ã
ä
å
ç
è
é
ê
ë
´
ú
û
ø
ù
ö
÷
ô
õ
ò
ó
!
ñ
ÿ
,y
Table 1 : les caractères accentués dans le code ISO 8859-1
A!ociation
Prolog
HERITAGE
©PrologIA
A!ociation
Prolog
HERITAGE
Eléments de base
R 1 - 29
La table suivante donne la correspondance entre les caractères accentués et leur expression sous la forme de accent_escape . On y apprend, par exemple, que les deux chaînes de caractères : sont équivalentes.
"tel maître, tel élève" et "tel ma\^itre, tel \'el\`eve"
8
9
10
6
7
4
5
2
3
0
1
11
12
13
14
15
128 144 160 176 192 208 224 240
`A -D `a -d
'A ~N 'a ~n
^A `O ^a `o
~A 'O ~a 'o
:A ^O :a ^o oA ~O oa ~o
AE :O ae :o
CC cc
`E /O `e /o
'E `U 'e `u
^E 'U ^e 'u
:E ^U :e ^u
`I :U `i :u
'I 'Y 'i 'y
^I PP ^i pp
:I BB :i :y
Table 2 : «accent_escape» utilisés par
Prolog II+
1 . 1 0 .
Le macroprocesseur
Il est possible d'écrire en Prolog II+ quelques macros (ou alias) très simples afin d'augmenter la lisibilité des programmes. Cette fonctionnalité est réalisée au moyen d'une directive de compilation (et non un prédicat):
set_alias(i,t)
Définition d'un alias.
A partir du lieu et moment où cette directive est rencontrée, le lecteur remplace certaines (détails ci-dessous) occurrences de l'identificateur i (appelé alias) par le terme t (appelé valeur). Cette définition est désactivée en fin de compilation de plus haut niveau d'imbrication.
La valeur t doit être de type entier, réel ou chaîne de caractères.
L'alias i doit être de type identificateur.
©PrologIA
R 1 - 30
Manuel de Référence
Seuls les identificateurs en position d'argument (pas les têtes de règle) et non préfixés explicitement dans le texte sont remplacés par la valeur de l'alias. Il est ainsi possible de conserver (en le préfixant explicitement dans le texte) un identificateur de même nom abrégé qu'un alias. Il est donc aussi logique que le préfixe de l'alias soit ignoré dans la directive. Néanmoins, dans le cas où celui-ci est déjà défini, la lecture d'une directive avec un alias explicitement préfixé dans le texte évitera sa substitution, et permettra donc une redéfinition
(accompagnée d'un message d'avertissement). Le prédicat val/1 permet la définition d'un alias au moyen d'un autre alias.
Exemples commentés:
> insert;
set_alias(foo,44); set_alias(foo,55);
Ici redéfinition de 44 en 55
-> set_alias(44,55) : ARGUMENT DE MAUVAIS TYPE
> insert;
set_alias(macro1,22); set_alias(aa:macro1,44);
Ici le préfixage est un moyen de redéfinition
WARNING: macro1 DEJA DEFINIE, NOUVELLE VALEUR PRISE EN COMPTE
rg1(macro1)->; rg1(aa:macro1)->;
-> insert;
Ici, 2ème niveau d'imbrication des compilations
set_alias(macro2,val(2 * macro1));
définition à partir d'une autre macro
rg2(macro2)->; rg2(macro1)->;
; macro1(macro2)->; macro1(macro1)->;
;
{}
> rg1(I);
{I=44}
{I=aa:macro1}
> rg2(I);
{I=88}
{I=44}
Ici, on revient au 1er niveau de compilation
Ici protection automatique des têtes de règle
Ici la nouvelle valeur est bien prise en compte
Ici pas de substitution de l'identificateur préfixé
La macro définie au 1er niveau de compilation a
été prise en compte dans le second niveau
> macro1(I);
{I=88}
La macro définie au 2ème niveau de compilation a été prise en compte dans le premier niveau
{I=44}
> insert;
rg(macro1)->; rg(macro2)->;
;
{}
> rg(I);
{I=macro1}
{I=macro2}
Ici on démarre une nouvelle compilation
Les définitions ont bien été annulées
NB: Une macro apparaissant comme opérande gauche d'un opérateur infixé doit être parenthésée. Exemple:
?- insert.
set_alias(foo,44).
oper(X) :- foo >= X.
oper(X) :- (foo) >= X.
A!ociation
Prolog
HERITAGE
©PrologIA
A!ociation
Prolog
HERITAGE
.
list.
oper(_345) :val(foo,_348),
_348 >= _345 .
oper(_345) :-
44 >= _345 .
Eléments de base
R 1 - 31
©PrologIA
R 1 - 32
Manuel de Référence
A!ociation
Prolog
HERITAGE
©PrologIA

Link pubblico aggiornato
Il link pubblico alla tua chat è stato aggiornato.