Download Prolog III - Colmerauer, Alain

Transcript
A!ociation
Prolog
Arbres, tuples, chaînes et listes
HERITAGE
Divers
arg(N,T1,T2) : Cette primitive pose la contrainte {T2 = N'}, où N' est
le Nième argument du terme T1. Si N est nul, T2 est égal à l'étiquette initiale
de T1. En particulier, si T1 est un tuple T2 représente le Nième élément de ce
tuple. Echoue si N n'est pas un entier positif connu.
known_part(U1,U2,U3) : Pose la contrainte {U1 = U2.U3}, où U2 est un
tuple formé de la plus grande suite de taille connue des premiers éléments
de U1 .
split(U,L) : Pose la contrainte {L = L'}, où L' est la liste composée des
éléments qui forment le tuple U (voir la suite de ce chapitre concernant les
listes). Echoue lorsque le tuple U n'est pas connu à l'exécution.
tuple(U) : S'exécute avec succès si U représente un tuple entièrement connu
(voir le prédicat bound). Echoue dans tous les autres cas.
is_tuple(U) : Vérifie que le terme U représente un tuple c'est-à-dire que la
contrainte {U !tuple} appartient au système courant. Echoue dans le cas
contraire.
Un exemple de programme sur les tuples
Comme premier exemple de programme, nous nous proposons de
considérer le retournement (ou inversion) d'un tuple. Nous examinerons
successivement la manière habituellement utilisée en Prolog, puis la
programmation en Prolog III, et nous terminerons par l'examen d'un
programme utilisant des contraintes retardées.
Voici tout d'abord le programme classique, à ceci près que l'on utilise des
tuples au lieu de listes. On pourra en profiter pour noter la manière
d'exprimer un tuple à la mode “Prolog standard” (un couple tête-de-liste,
queue-de-liste) à l'aide de la concaténation. Le rapport, dans ce cas, entre le
E.L de Prolog II et le <E>.L de Prolog III n'est, on l'aura compris que
purement fonctionnel, la sémantique du . (point) demeurant fondamen-
© PrologIA
81