Termes composés – notation opérationnelle
Les termes composés dont le symbole du foncteur est un opérateur défini dans la table 7.4 peuvent être écrits dans une notation opérationnelle.
Un opérateur est défini par son nom, son spécificateur et sa priorité.
La priorité d’un opérateur est un nombre entierr vérifiant 1 r 1200.
Le spécificateur d’un opérateur est une chaîne de caractères mnémonique qui définit la classe (préfixe, infixe ou postfixe) et l’associativité (associativité à gauche, associativité à droite ou sans associativité) de l’opérateur. La table 7.1 récapitule les différents spécificateurs.
Un opérande avec une priorité égale ou inférieure à celle d’un opérateur asso-ciatif à droite, écrit à droite de cet opérateur, n’a pas besoin d’être écrit entre parenthèses. Un opérande avec une priorité inférieure à celle d’un opérateur associatif à gauche, écrit à gauche de cet opérateur, n’a pas besoin d’être écrit entre parenthèses. Un opérande avec une priorité égale à celle d’un opérateur associatif à gauche, écrit à gauche de cet opérateur, doit être écrit entre pa-renthèses uniquement si le foncteur principal de l’opérande est un opérateur associatif à droite. Un opérande avec la même priorité qu’un opérateur non as-sociatif, écrit à droite ou à gauche de cet opérateur, doit être écrit entre paren-thèses. Dans les tables 7.2 et 7.3 on suppose que chaque atome fx, fy, xfx, xfy, yfx, xf et yf est un opérateur ayant le spécificateur correspondant. La table 7.2 montre quelques termes invalides et la manière dont ils doivent être parenthésés pour devenir valides.
La table 7.3 montre des termes (valides) non parenthésés en correspondance avec des termes parenthésés équivalents. On suppose ici que les opérateurs xfy et yfx (resp. fy et yf) ont même priorité.
Opérande
Un opérande est un terme.
Ci-après, le non-terminalgterme représente le sous-ensemble de l’ensemble
Terme invalide terme valide
fx fx 1 fx (fx 1)
1 xf xf (1 xf) xf
1 xfx 2 xfx 3 (1 xfx 2) xfx 3
1 xfx 2 xfx 3 1 xfx (2 xfx 3)
Termes Termes
non parenthésés équivalents parenthésés
fy fy 1 fy (fy 1)
1 xfy 2 xfy 3 1 xfy (2 xfy 3)
1 xfy 2 yfx 3 1 xfy (2 yfx 3)
fy 2 yf fy (2 yf)
1 yf yf (1 yf) yf
1 yfx 2 yfx 3 (1 yfx 2) yfx 3
des termes formé des termes qui peuvent être l’opérande gauche d’un opéra-teur associatif à gauche ayant une priorité donnée.
terme = gterme ;
Abstr. a a
Prior. n n
gterme = terme ;
Abstr. a a
Prior. n n , 1
A tout endroit où un terme de priorité n est permis peut figurer un terme de priorité inférieure àn.
Opérateurs comme fonctions
gterme = terme , oper , terme ;
Abstr. f (a; b) a f b
Prior. n n , 1 n n , 1
Spécif. xfx
gterme = gterme , oper , terme ;
Abstr. f (a; b) a f b
Prior. n n n n , 1
Spécif. yfx
terme = terme , oper , terme ;
Abstr. f (a; b) a f b
Prior. n n , 1 n n
Spécif. xfy
gterme = gterme , oper ,
Abstr.f (a) a f
Prior. n n n
Spécif. yf
gterme = terme , oper ,
Abstr.f (a) a f
Prior. n n , 1 n
Spécif. xf
terme = oper , terme ,
Abstr.f (a) f a
Prior. n n n
Spécif. fy
gterme = oper , terme ,
Abstr.f (a) f a
Prior. n n n , 1
Spécif. fx
Opérateurs
Un opérateur est un nom ou une virgule.
oper = nom ;
Abstr. a a
Prior. n n
Spécif. s s
Cond. a est un opérateur (cf. table 7.4)
oper = virgule ;
Abstr. ;
Prior. 1000
Spécif. xfy
Il ne peut pas exister deux opérateurs avec la même classe (préfixe, infixe ou postfixe) et le même nom.
Il ne peut pas y avoir un opérateur infixe et un opérateur postfixe avec le même nom.
Priorité Spécificateur Opérateur(s)
1200 xfx :- –>
1200 fx :- ?-
1100 xfy ;
1050 xfy ->
1000 xfy ,
900 fy \+
700 xfx = \=
700 xfx == \== @< @=< @> @>=
700 xfx =..
700 xfx is =:= =\= < =< > >=
500 yfx + – /\ \/
400 yfx * / // rem mod << >>
200 xfx **
200 xfy ^
200 fy – \
100 xfx @
50 xfx :
La table des opérateurs
La table des opérateurs détermine quels atomes doivent être considérés comme des opérateurs
lorsque – une suite d’unités lexicales est analysée comme un terme lisible par le prédicatread_term/3, ou bien
– un texte Prolog est préparé pour l’exécution, ou bien
– l’expression écrite d’un terme Prolog est produite par un des prédicats write_term/: : :, write/: : :, etc. La table 7.4 montre les opérateurs prédéfinis, c’est-à-dire ceux qui constituent l’état initial de la table des opérateurs.
Cette table peut être modifiée à l’exécution, grâce au prédicat prédéfiniop/3.
Elle contient les opérateurs associés aux :
1. Prédicats définis comme des opérateurs :
– unification de termes ‘=/’2, ‘n=’/2
– comparaison de termes ‘==’/2, ‘n=’/2, ‘@<‘/2, ‘@=<‘/2,
‘@>’/2, ‘@>=’/2,
– décomposition de termes (univ) ‘=..’/2,
– évaluation arithmétiqueis/2,
– comparaison arithmétique ‘=:=’/2, ‘=n=’/2, ‘<‘/2,
‘=<‘/2, ‘>’/2, ‘>=’/2,
– négation par échec’n+’/1
2. Structures de contrôle définies comme des opérateurs :
– conjonction ‘,’/2,
– disjonction ‘;’/2,
362 La syntaxe complète de Prolog ISO
– si-alors ‘->’/2
3. Fonctions évaluables définies comme des opérateurs :
– les opérateurs arithmétiques binaires ‘+’/2, ‘-‘/2, ‘*’/2,
‘//’/2, ‘/’/2, rem/2, mod/2, ‘**’/2,
– les opérateurs arithmétiques unaires’-‘/1,
– les fonctions logiques ‘>>’/2, ‘<<‘/2, ‘/n’/2, ‘n/’/2, ‘n’/1
Termes composés – notation de liste
Une liste est soit la liste vide, soit un terme composé dont le foncteur principal est ‘.’/2.
terme = Abstr. l
crochet gauche , éléments ,
l
crochet droit ;
Prior. 0
éléments = argument,
Abstr. :(h; l) h
virgule,
éléments ;
l
éléments = argument,
sépar tête queue, éléments ;
Abstr. :(h; t) h
t
éléments = argument ;
Abstr. :(t; [])
t
Exemples
Voici des termes exprimés en notation de liste et en notation fonctionnelle
[a] == .(a, []).
[a, b] == .(a, .(b, [])).
[a | b] == .(a, b).
7.3.6 Termes composés – notation avec une paire d’accolades
terme = accolade gauche , terme , accolade droite ;
Abstr. (l)
l
Prior. 0
Exemples
Voici des termes exprimés en notation avec une paire d’accolades et en nota-tion fonctionnelle
{a} == ‘{}'(a).
{a, b} == ‘{}'(‘,'(a, b))
Termes composés – notation en liste à guillemets
Une liste à guillemets est soit un atome, soit une liste non vide.
Si l’indicateur double_quotes a la valeur chars, une unité lexicale de type liste à guillemets ldq contenant L caractères est une listel de L éléments dont le nième est le caractère représenté par le nième caractère ldqde.
Si l’indicateur double_quotes a la valeur codes, une unité lexicale de type liste à guillemets ldq contenant L caractères est une listel de L éléments dont le nième est le nombre entier associé au nième caractère deldq.
Si l’indicateur double_quotes a la valeur atoms, une unité lexicale de type liste à guillemets ldq contenant L caractères est un atome l formé par la concaténation d’une suite de L caractères dont le nième est le caractère représenté par le nième caractère deldq.