Vous êtes sur la page 1sur 38

4

Prdicats prdnis Prolog IV


DANS CE CHAPITRE sont dcrits les prdicats prdnis et les prdicats dnumration de Prolog IV. Aprs des prliminaires explicitant des gnralits sur ces primitives et les concepts qui les entoure, une liste dtaille de ces primitives est donne dans lordre alphabtique an den faciliter les recherches.

4.1 Prliminaires
La prsente section donne un aperu des diverses catgories de prdicats prdnis en Prolog IV. On touvera quelques explications sur les primitives traitant les rgles, les affectations statiques (variables globales et tableaux) ainsi que les primitives de mta-programmation sur les intervalles (dont les numrations).

4.1.1

Lentre des rgles


Voici tout dabord quelques notions lmentaires sur les rgles prolog.

Paquets de rgles On appelle nom et arit dune rgle le nom et larit de la tte de cette rgle. On appelle paquet de rgles un ensemble de rgles de mmes nom et arit. Un paquet est donc parfaitement repr par ce couple (nom, arite). Lusage veut que les rgles de mmes nom et arit soient regroupes en un seul paquet, et non pas parpilles dans un ou plusieurs chiers. La description dun paquet sera souvent not nom=arite . Compilation, consultation Il existe en Prolog IV trois faons dentrer des rgles : en compilant un chier, en consultant un chier (ou la console, qui nest autre chose quun chier spcial toujours ouvert),

213

214

Prdicats prdnis Prolog IV


en effectuant des assertions de rgles 1 ( partir de termes) pendant lexcution dun programme Prolog IV. Il existe deux formes de codage de rgle en Prolog IV, dues la prsence dimpratifs techniques contradictoires : la forme compile (au moyen des primitives de la famille compile). Elle a pour avantage la vitesse dexcution de ces rgles, une fois appeles. Son inconvnient est limpossibilit de traduire ces rgles en termes, et de modier dynamiquement les paquets de rgles ainsi compils (autrement quen les dtruisant). la forme interprte (ou asserte) (au moyen des primitives des familles consult ou assert). Son avantage est la possibilit de traduire ces rgles en termes, et de modier dynamiquement les paquets de rgles (en ajoutant ou supprimant une rgle donne du paquet). Son inconvnient est une moins grande rapidit dexcution, ainsi quune plus grande consommation mmoire. On ne peut pas suivre avec le dbogueur le droulement de lexcution des programmes entrs sous cette forme. Malgr ce qui a t montr tout au long du tutoriel, cest le mode dentre de rgles par compilation qui est fortement prconis. Il est en effet beaucoup plus rare davoir besoin dune gestion dynamique de rgles.

Les primitives de lecture de rgles consult lit une suite de rgles dans lentre courante. Si un paquet de rgles ayant mmes nom et arit fait dj partie de la base de rgles, une erreur indiquant une tentative de rednition survient. Si on souhaite vraiment rednir ce paquet, il faut utiliser la primitive reconsult. consult(F ) se comporte comme consult sans argument, mais les paquets de rgles sont lus dans un chier de nom F . reconsult lit une suite de paquets de rgles dans lentre courante. Ceux qui existaient dj avec ces mmes nom et arit sont dtruits si ce sont des rgles utilisateurs 2 seulement. reconsult(F ) se comporte comme reconsult sans argument, mais les paquets de rgles sont lus dans un chier de nom F . compile(F ), compile(F; Options) se comporte comme consult, mais utilise la compilation des rgles comme forme de codage interne. recompile(F ), compile(F; Options) se comporte comme reconsult, mais utilise la compilation des rgles comme forme de codage interne. Quand une erreur survient pendant la (re)compilation, la base de rgles est laisse dans ltat o elle se trouvait avant la compilation.
1. Par abus de langage, on dira asserter des rgles et rgles assertes . 2. Ce sont toutes les rgles qui ne font pas partie du systme Prolog IV.

4.1 Prliminaires
Dans tous les cas :

215

La n de chier ou le terme end_of_file. arrtent le lecteur de rgles. Les rgles sont codes en mmoire. Tenter de rednir des rgles prdnies mne une erreur. Note : On ne peut pas compiler de rgles dans la console, il faut passer par un chier 3.

4.1.2

Affectation, variables globales et tableaux


On a en Prolog IV la possibilit de conserver des termes dans ce quon appelle variables globales. Ces variables globales sont nommes laide didenticateurs, ou laide dune notation fonctionnelle qui rappelle lindiage dun tableau une dimension. Les termes conservs sont des copies. Cette remarque prend toute son importance lorsque le terme contient une ou plusieurs variables, puisque celles-ci sont dconnectes du contexte o elles ont t cres. Retrouver un terme conserv cre galement une copie. Les sous-domaines ne sont en gnral pas conservs.
>> record(toto, f(g(X), [3,5,7])). X ~ tree. >> recorded(toto,X). X ~ f(g(tree),[3,5,7]).

Rappel : Le pseudo-terme tree reprsente une variable muette. record(I ,T ) associe une copie du terme T lidenticateur I . Le terme T peut contenir des variables, peut tre un arbre inni et peut mme contenir des variables soumises des contraintes linaires. recorded(I ,T ) avec T . cre une copie du terme associ lidenticateur I et lunie

Il existe aussi la notion de tableau. On doit dclarer son nom et sa taille avant de pouvoir lutiliser. On peut ensuite se servir de chacun de ses lments (dindice entre 1 et taille) au travers des primitives prcdentes record/2 et recorded/2. Utiliser un tableau non dclar, ou un indice hors des bornes du tableau mne une erreur. def_array(I ,N ) dnit le tableau de nom lments.
>> def_array(tab,10). true. >> record(tab(1), f(g,100/3)). true. >> recorded(tab(1),X). X = f(g,100/3).
3. On peut cependant, lorsquon est sous unix et dans un terminal tty (comme une fentre xterm ou cmdtool) utiliser le pseudo-chier /dev/tty, comme dans compile(/dev/tty), qui attendra des buts dans le terminal, et ce jusqu la n de chier (gnralement obtenue en tapant CTRL-D)

I (un identicateur) de taille N

216 redef_array(I ,N ) undef_array(I )

Prdicats prdnis Prolog IV


redimensionne le tableau de nom I la taille N . dtruit le tableau de nom I .

4.1.3

Retard
La fameuse primitive freeze/2. freeze/2 retarde lexcution dun littral tant quune variable est libre.

4.1.4

Divers

Mesure de temps Ces primitives permettent la mesure de temps CPU lors de lexcution dun programme Prolog IV. reset_cpu_time rinitialise le chronomtre.

cpu_time(T ) unie T avec le temps cpu en millisecondes coul depuis le dernier appel reset_cpu_time. Commandes systmes chdir(D) positionne le rpertoire de travail de Prolog IV la chane reprsente par latome D. command(C ) effectue la commande systme contenue dans la chane reprsente par latome C .

4.1.5

Mta-prdicats et intervalles
Lutilisation des techniques de rduction de domaines pour rsoudre des problmes numriques est en gnral constitue deux phases : 1. La phase de pose des contraintes, qui utilise principalement les relations de Prolog IV. 2. La phase dnumration qui permet de cerner les solutions du systme de contraintes, ou de dmontrer quil ny en a pas. Cette phase dnumration est absolument ncessaire dans la plupart des problmes car les informations quapporte le solveur approch seul sont en gnral bien insufsantes pour tre utiles. Supposons que lon cherche rsoudre le systme de contraintes fX = ,X g. Voici ce que lon obtient :
>> X = .-. X. X ~ real.

La rponse de Prolog IV nest manifestement pas convainquante. On peut par contre noter que Prolog IV est beaucoup plus prolixe si on lui demande :

4.1 Prliminaires
>> X = .-. X, le(X,0). X = 0. >> X = .-. X, gt(X,0). false.

217

On peut alors noter que fX  0g et fX 0g forment une partition des nombres rels, et en dduire que les deux requtes prcdentes permettent de conclure quand aux solutions du systme fX = ,X g.

Ce petit exemple laisse apparatre clairement le principe de base dune numration : diviser un problme trop difcile rsoudre en sous-problmes plus petits, donc, on lespre, plus faciles rsoudre. Dans le cadre des intervalles, on scindera volontiers les problmes en dcoupant les domaines associs aux variables, comme sur cet exemple. Il existe bien sr mille et une manires de concevoir et de programmer une numration. Prolog IV propose, parmi ses prdicats, un certain nombre doutils permettant : 1. De programmer ses propres numrations : ce sont les mta-prdicats de bas niveau. Ils permettent de manipuler les domaines des variables, les rationnels IEEE 754, ou bien encore dobtenir des informations statistiques sur la rsolution des problmes numriques par les intervalles. 2. De disposer dnumrations prprogrammes : ce sont les prdicats de haut niveau. Ils permettent dnumrer sans avoir programmer sa propre numration des systmes de contraintes de nature boolens, entiers, ou rels.

Le principe des prdicats dnumration prdnis que sont boolsplit, intsplit, et realsplit est le mme. Ces numrations reposent sur trois paramtres fondamentaux : la condition darrt, le choix de la variable dont le domaine va tre scind en deux, et la manire dont ce dcoupage va tre fait. Voici le programme Prolog IV qui implante et dcrit ces procds dnumration :
mon_enum(L):condition_d_arret(L), !. mon_enum(L):choix_variable(L,X), milieu(X,M), decouper(X,M), mon_enum(L). decouper(X,M):le(X,M). decouper(X,M):gt(X,M).

Avec : condition_d_arret(L), un prdicat dont la russite signie que la condition darrt est atteinte.

218

Prdicats prdnis Prolog IV


choix_variable(L,X), un prdicat qui unie X avec la variable de la liste L sur laquelle la dichotomie va tre effectue. milieu(X,M) qui calcule le milieu du domaine de X. Limplantation effective des mta-prdicats dnumration de Prolog IV est un peu plus complexe que le petit programme que lon vient de prsenter, mais celui-ci rete bien la mthodologie utilise.

4.1.6

Mta-prdicats sur les rels


De faon gnrale, les primitives dont le nom se terminent en lin travaillent exclusivement avec le solveur linaire, et ne tiennent donc pas compte des contraintes de type intervalle . Rciproquement, celles qui ne se terminent pas en lin ignorent les contraintes linaires.

Enumration dans un domaine boolsplit/1 /2 numrent les valeurs possibles boolennes des lments dune liste de variables. intsplit/1 /2 /3 numrent les valeurs possibles entires dune liste de variables. realsplit/1 /2 /3 /4 numrent les valeurs possibles relles dune liste de variables. enum/1 /3 numrent les valeurs possibles entires dune variable. enumlin/1 /3 numrent les valeurs possibles entires dune variable (en ne tenant compte que des contraintes linaires). Bornes dun domaine bounds/3, glb/2, lub/2 rcuprent les bornes dun domaine. ebounds/3, eglb/2, elub/2 rcuprent les bornes dun domaine, avec des conventions pour indiquer le type de celles-ci. boundslin/3, glblin/2, lublin/2 calculent les bornes dune variable (en ne tenant compte que des contraintes linaires). Taille dun domaine bas sur les intervalles oat_size/2 rend la mesure dun domaine en nombre dintervalles (ottants) atomiques. int_size/2 rend la mesure dun domaine en nombre dentiers relatifs. real_size/2 rend la mesure dun domaine dans R.
IEEE

4.2 Liste alphabtique


Rationnels IEEE (ottants)

219

max_oat/1 rend le plus grand rationnel IEEE (le plus grand ottant simple). min_positive_oat/1 rend le plus petit rationnel ottant simple positif).
IEEE

positif (le plus petit

oat_rank/2 associe un nombre ottant et son rang. Optimisation sur le linaire minimizelin/1, maximizelin/1 effectuent une minimisation ou une maximisation dune variable soumise des contraintes linaires. Statistiques sur les intervalles get_istats/2 /3 rendent des statistiques sur lusage des intervalles. reset_istats/0 initialise des compteurs statistiques sur lusage des intervalles.

4.2 Liste alphabtique

220

Prdicats prdnis Prolog IV

boolsplit/1 boolsplit/2

Enumration dune liste de boolens

Description : boolsplita; b enumre les boolens du domaine des lments de la liste a et les unie avec les lments de a dans lordre de cette liste. La premire valeur essaye est b. Si b est libre, elle est unie avec la valeur par dfaut, soit 0. boolsplita enumre les boolens du domaine des lments de la liste a et les unie avec les lments de a dans lordre de cette liste. La premire valeur essaye est 0 (faux). Dans les deux cas, une erreur est provoque quand variables compatibles avec des nombres rels. Exemples :

a nest pas une liste de

>> or(B,C), boolsplit([B,C]). C = 1, B = 0; C = 0, B = 1; C = 1, B = 1. >> or(B,C), boolsplit([B,C],1). C = 1, B = 1; C = 0, B = 1; C = 1, B = 0. >> A ~ band(B,C), boolsplit([A,B,C]). C = 0, B = 0, A = 0; C = 1, B = 0, A = 0; C = 0, B = 1, A = 0; C = 1, B = 1, A = 1.

Voir galement : intsplit/3, realsplit/4.

bounds/3

Bornes dun domaine

Description : boundsa; b; c sert rcuprer les bornes du domaine de a. Les bornes infrieure et suprieure du domaine de a sont unies respectivement avec b et c. Un appel boundsa; b; c choue dans les cas suivants :

a nest pas dun type compatible avec un type numrique,

boundslin/3
un des cts du domaine de a nest pas born.

221

Les deux conditions reviennent dire que a doit tre une variable numrique borne des deux cts. Il est important de remarquer que les valeurs retournes par bounds/3 sont des bornes infrieure et suprieure. Ces bornes ne font donc pas toujours partie du domaine de la variable, en particulier quand une variable est contrainte appartenir un intervalle ouvert. Exemples :
>> bounds(1, B, C). C = 1, B = 1. >> bounds(cc(1,2), B, C). C = 2, B = 1. >> bounds(oo(1,2), B, C). C = 2, B = 1. >> bounds(pi, B, C). C = 13176795/4194304, B = 6588397/2097152. >> bounds(le(0), B, C). false. >> bounds(ge(0), B, C). false.

Voir galement : glb/2, lub/2.

boundslin/3

Bornes dun domaine linaire

Description : boundslina; b; c sert rcuprer les bornes du domaine de a. Les bornes infrieure et suprieure du domaine de a sont unies respectivement avec b et c. Seules les contraintes linaires sont prises en compte.

a nest pas dun type compatible avec un type numrique, un des cts du domaine de a nest pas born. Les deux conditions reviennent dire que a doit tre une variable numrique
borne des deux cts. Il est important de remarquer que les valeurs retournes par boundslin/3 sont des bornes infrieure et suprieure. Ces bornes ne font pas toujours partie du domaine de la variable, en particulier quand la variable a t contrainte au moyen dingalits strictes (ou avec dif). Exemples :

Un appel boundslina; b; c choue dans les cas suivants :

222

Prdicats prdnis Prolog IV


>> boundslin(1, B, C). C = 1, B = 1. >> gelin(X,1), lelin(X,2), boundslin(X, B, C). X ~ real, C = 2, B = 1. >> gtlin(X,1), ltlin(X,2), boundslin(X, B, C). X ~ real, C = 2, B = 1. >> boundslin(lelin(0), B, C). false. >> boundslin(gelin(0), B, C). false.

Voir galement : glblin/2, lublin/2.

chdir/1
Types : chdir(+atome)

Changement de rpertoire courant

Description : chdira effectue un changement de rpertoire courant : aprs la commande, Prolog IV est positionn dans le rpertoire dont la chane est contenu dans latome a. On fait appel au systme dexploitation pour lexcution de cette commande. Elle gnre une erreur si largument nest pas un atome. Elle choue si le systme dexploitation retourne une erreur en lanant la commande (si le rpertoire nexiste pas ou nest pas accessible). Elle russit dans les autres cas. Exemples : On suppose tre sous Unix.
>> system(pwd). /mon/repertoire/de/travail true. >> system(cd /mon/repertoire). true. >> system(pwd). /mon/repertoire/de/travail true. >> chdir(/mon/repertoire). true. >> system(pwd). /mon/repertoire true. >>

Notes : 1. Il faut quoter latome avec des apostrophes sil contient des blancs ou des caractres autres que des lettres ou des chiffres. 2. Si le systme dexploitation exige lemploi de caractres \ pour nommer les chemins (comme sous DOS ou Windows), il faut les doubler pour pouvoir les utiliser dans les atomes quots (ils sont sinon interprts comme des caractres dchappement).

compile/1
Voir galement : system/1

223

compile/1 compile/2
Types : compile(+atome) compile(+atome, @liste)

Compilation dun chier

Description : compilea lit une suite de rgles dans le chier de nom a. Les rgles lues sont compiles et entres en mmoire. Si un paquet de rgles de mmes nom et arit gure dj dans la base de rgles, une erreur indiquant une tentative de rednition survient. Si on souhaite vraiment rednir ce paquet, il faut utiliser la primitive recompile. Dans la version avec un second argument, on donne au compilateur une liste doptions. Celle-ci peut tre constitue des options suivantes : debug(off), debug(on) pour compiler le programme en conservant (ou pas) des informations pour un ventuel usage par le dbogueur. Par dfaut, on a debug(off). syntax(prolog4), syntax(iso) pour indiquer dans quel mode le programme est lu. Par dfaut, les rgles sont lues en tenant compte du mode syntaxique courant de Prolog IV, c..d. au moment o la primitive compile est appele. Le mode syntaxique de compilation (iso ou prolog4) dpend des facteurs suivants, par priorit croissante : Le mode courant (indiqu par le prompt courant). Loption passe dans la commande de compilation (syntax(x)). Les directives lues dans le chier compil comme :- syntax(iso) ou :- syntax(prolog4). Ces directives nont pour porte que la commande de compilation, et ce partir de lendroit o elles sont trouves. Une directive prsente dans le chier outrepasse loption correspondante partir de ce point. En cas derreur pendant la compilation, la base de rgles reste dans ltat o elle tait avant lappel compile. Notes : Loption debug(on) vite lemploi de la directive debug (qui impose une modication du chier source par le programmeur). Loption syntax permet dtre indpendant du mode (prompt) courant. Exemples :

224

Prdicats prdnis Prolog IV

>> compile(menu.p4). true. >> compile(menu.p4, [debug(on)]). ### error (procedure lightMeal/3) : illegal redefinition of a static procedure. error: normal_error >> recompile(menu.p4, [debug(on)]). true.

Voir galement : recompile/n, consult/n, debug/0.

consult/0 consult/1
Types : consult consult(+atome)

Consultation dun chier

Description : consulta lit une suite de rgles dans le chier de nom a. Les rgles lues sont traduites puis entres en mmoire. Si un paquet de rgles de mmes nom et arit gure dj dans la base de rgles, une erreur indiquant une tentative de rednition survient. Si on souhaite vraiment rednir ce paquet, il faut utiliser la primitive reconsult. Les rgles lues ont le statut dynamique, ce qui veut dire que les primitives de gestion de rgles (comme retract, assert, clause) peuvent tre utilises avec elles. Les rgles lues ne sont pas compiles, cest l la diffrence avec les primitives compile/n. Il est fait appel la primitive assert pour le codage des rgles. Lexcution de ces rgles seffectue moins vite, et on ne peut pas utiliser le dbogueur pour la suivre. Dans la version sans argument, le chier est lentre courante. En cas derreur pendant la consultation, la base de rgles reste dans ltat o elle tait avant lappel consult. On ne peut rednir de paquet ayant t entr avec les primitives compile. Exemples :
>> consult(menu.p4). true. >> consult(menu.p4). Consulting ... error: consult_error(error(permission_error(modify, static_procedure,lightMeal(_857,_858,_859)),assert/2)) >> reconsult(menu.p4). true.

Voir galement : reconsult/n, compile/n.

cpu_time/1

225

cpu_time/1
Types : cpu_time(?terme)

Mesure du temps CPU

Description : cpu_time(T) unie T avec le temps cpu (en millisecondes) coul depuis le dernier appel reset_cpu_time. Exemples :
>> reset_cpu_time, travail, cpu_time(T). T = 16500. % soit 16,5 seconde CPU >>

Voir galement : reset_cpu_time/0.

debug/0

Passage en mode debug

Description : debug rend actif le dbogueur. Celui-ci va collecter des informations et effectuer des surveillances qui nont habituellement pas lieu lors de lexcution normale des programmes. Ces derniers peuvent donc sexcuter moins vite dans ce mode. Le dbogueur ne peut montrer des informations que sur les rgles qui ont t compiles avec les primitives de la famille compile. Voir le chapitre Environnement pour de plus amples dtails sur le dbogueur. Voir galement : no_debug/0, compile/n.

def_array/2
Types : def_array(+atome, +entier)

Dnition dun tableau

Description : def_arraya; b dnit dynamiquement un tableau de constantes P ROLOG de nom a et de longueur b. Ce tableau se comportera comme une variable globale (ultrieurement accessible pendant leffacement de nimporte quel but) et statique (rsistante au backtracking). Les valeurs lgales de lindice sont inclues dans f1; : : :; bg. Si un tableau de mme nom existe dj : sil sagit dun tableau de mme taille, il ne se passe rien, si les tailles diffrent, alors il se produit une erreur. Laccs et laffectation sont analogues ceux des autres langages de programmation. Exemples :

226

Prdicats prdnis Prolog IV


>> def_array(tab, 10). true. >> N ~ cc(1, 10), enum(N), record(tab(N), N.*.N). N = 1; N = 2; N = 3; N = 4; N = 5; N = 6; N = 7; N = 8; N = 9; N = 10. >> recorded(tab(6), X). X = 36. >> undef_array(tab). true.

Voir galement : record/2, recorded/2, redef_array/2, undef_array/1.

ebounds/3

Bornes dun domaine

Description : eboundsa; b; c est utilis pour rcuprer les bornes infrieures et suprieures du domaine de a, dans lextension des rels. Les bornes infrieures et suprieures du domaine de a sont unies respectivement avec b et c. Un appel boundsa; b; c choue si un type numrique. un nombre rel x,

a nest pas dun type compatible avec

Un rel tendu peut prendre les valeurs suivantes : +1, not pinfinity en Prolog IV,

,1, not minfinity en Prolog IV, pour chaque nombre rel x, lobjet x+ , qui est strictement plus grand que x, et strictement plus petit que tous les rels strictement plus grands que x. On note x+ up(x) en Prolog IV. pour chaque nombre rel x, lobjet x, , qui est strictement plus petit que x, et strictement plus grand que tous les rels strictement plus petits que x. On note x, dn(x) en Prolog IV.

Dun point de vue pratique, lextension des rels est utilise dans deux cas : pour pouvoir faire une analyse des bornes qui fonctionne mme quand le domaine dune variable est non-born ; pour savoir si un intervalle est ouvert ou ferm. En fait, on peut reprendre tous les types possibles dintervalles, et voir les

eglb/2
rponses effectues par Prolog IV dans ces diffrents cas : Intervalle

227

a; b a b a; b a dn(b) a; b up(a) b a; b up(a) dn(b) a; +1 a pinfinity a; +1 up(a) pinfinity ,1; b minfinity b ,1; b minfinity dn(b) ,1; +1 minfinity pinfinity
Les quatre informations retenir sont les suivantes : ebounds/4 renvoie minfinity quand une variable nest pas borne infrieurement, ebounds/4 renvoie pinfinity quand une variable nest pas borne suprieurement, ebounds/4 renvoie up(a) quand une variable a une borne infrieure quelle ne peut pas atteindre, ebounds/4 renvoie dn(a) quand une variable a une borne suprieure quelle ne peut pas atteindre. Exemples :
>> ebounds(1,B,C). C = 1, B = 1. >> ebounds(cc(1,2),B,C). C = 2, B = 1. >> ebounds(oo(1,2), B, C). C = dn(2), B = up(1). >> ebounds(pi, B, C). C = dn(13176795/4194304), B = up(6588397/2097152). >> ebounds(ge(0), B, C). C = pinfinity, B = 0. >> ebounds(ge(0), B, C). C = pinfinity, B = 0.

Borne inf.

Borne sup.

Voir galement : eglb/2, elub/2.

228

Prdicats prdnis Prolog IV

eglb/2

Borne infrieure

Description : eglba; b sert rcuprer la borne infrieure (en anglais, greatest lower bound) du domaine de a dans lextension des rels. Le rsultat est stock dans la variable b.

Un appel eglba; b choue si a nest pas dun type compatible avec un type numrique. Voir ebounds/3 pour une dnition accompagne de remarques importantes concernant les rels tendus.

Exemples :

>> eglb(1, B). B = 1. >> eglb(cc(1,2), B). B = 1. >> eglb(oo(1,2), B). B = up(1). >> eglb(pi, B). B = up(6588397/2097152). >> eglb(ge(0), B). B = 0. >> eglb(le(0), B). B = minfinity.

Voir galement : ebounds/3, elub/2.

elub/2

Borne suprieure

Description : eluba; b sert rcuprer la borne suprieure (en anglais, lowest upper bound du domaine de a dans lextension des rels. Le rsultat est stock dans la variable b. Un appel eluba; b choue si a nest pas dun type compatible avec un type numrique.

Voir ebounds/3 pour une dnition accompagne de remarques importantes concernant les rels tendus. Exemples :
>> elub(1, B). B = 1. >> elub(cc(1,2), B). B = 2. >> elub(oo(1,2), B). B = dn(2). >> elub(pi, B). B = dn(13176795/4194304). >> elub(ge(0), B). B = pinfinity. >> elub(le(0), B). B = 0.

Voir galement : ebounds/3, eglb/2.

enum/1

229

enum/1 enum/3

Enumration dentiers

Description : enuma; b; c enumre les entiers du domaine de a compris entre b et c et les unie avec a. Lordre dans lequel lnumration est effectue nest en aucun cas garanti. enuma enumre les entiers du domaine de a et les unie avec a. enum/3 est dnie en fonction de enum/1 de la manire suivante :
enum(X,L,U) :cc(X, L, U), enum(X).

Pour les deux prdicats, une erreur est dclenche quand des arguments ne sont pas compatibles avec des nombres rels. Exemples :
>> X ~ cc(0,5), enum(X). X = 0; X = 1; X = 2; X = 3; X = 4; X = 5. >> enum(X, .-. pi, pi). X = -3; X = -2; X = -1; X = 0; X = 1; X = 2; X = 3. >> enum(toto). error: error(Real variable expected,enum)

Voir galement : enumlin/3, intsplit/3.

enumlin/1 enumlin/3

Enumration dentiers

Description : enumlina; b; c enumre les entiers du domaine de a compris entre b et c et les unie avec a. Lordre dans lequel lnumration est effectue nest en aucun cas garanti. Ici, ce sont les contraintes linaires qui sont prises en compte pour contrler lnumration. enumlina enumre les entiers du domaine de a et les unie avec a. enumlin/3 est dnie en fonction de enumlin/1 de la manire suivante :
enumlin(X,L,U) :gelin(X, L), lelin(X, U), enumlin(X).

230

Prdicats prdnis Prolog IV


Pour les deux prdicats, une erreur est dclenche quand des arguments ne sont pas compatibles avec des nombres rels. Exemples :
>> X ~ gelin(0) n lelin(5), enumlin(X). X = 0; X = 1; X = 2; X = 3; X = 4; X = 5. >> enumlin(X, -3, 3). X = -3; X = -2; X = -1; X = 0; X = 1; X = 2; X = 3. >> enumlin(toto). error: error(Real variable expected,enumlin)

Voir galement : enumlin/3, intsplit/3.

oat_rank/2

Rang dun nombre ottant

Description : oat_ranka; b tablit une correspondance entre un ottant a et son rang b. A lappel de ce prdicat, au moins un des arguments doit avoir une valeur connue. Par ailleurs, si a a une valeur qui nest pas un nombre ottant IEEE ou si b a une valeur qui nest pas le rang dun ottant, une erreur de type est dclenche. Le rang dun ottant est une numrotation des ottants, tels que le rang de 0 est 0. Le plus petit ottant positif est donc de rang 1, et le plus grand ottant ngatif 4 est de rang ,1. Cette numrotation sert par exemple dterminer le nombre de ottants entre deux nombres. Exemples :
>> float_rank(0, B). B = 0. >> float_rank(B, 1), min_positive_float(B). B = 1/713623846352979940529142984724747568191373312. >> float_rank(1,X). X = 1065353216. >> float_rank(1,X1), float_rank(2, X2), Diff = X2 - X1 . Diff = 8388608, X2 = 1073741824, X1 = 1065353216. >> float_rank(A, B). error: error(instantiation_error,float_rank/2) >> float_rank(1/3, B). error: error(type_error(ieee754(single),1/3),float_rank/2)

4. Donc le plus proche de 0

oat_size/2
Voir galement : max_oat/1, min_positive_oat/1.

231

oat_size/2

Mesure dans les ottants dun domaine

Description : oat_sizea; b retourne dans b une mesure du domaine de a, qui reprsente le nombre dintervalles IEEE atomiques (cest--dire les intervalles dont les bornes sont deux rationnels IEEE identiques ou successifs) inclus dans le domaine de a. oat_size/2 sert mesurer la taille du domaine dune variable, et est en particulier utile lors de la phase de slection dune variable sur laquelle numrer. En mode inervalles simples, si L est le rang de la borne infrieure du domaine de a, que U le rang de la borne suprieure de a, et que N est le nombre de ces bornes que a ne peut atteindre, alors la mesure b peut tre calcule par :

b = U , L  2 , N + 1
En mode unions dintervalles, la mesure du domaine dune variable est la somme des mesures de chaque intervalle le composant. Exemples :
>> float_size(1,S). S = 1. >> float_size(pi,S). S = 1. >> float_size(real,S). S = 8556380159. >> float_size(oo(1,2), S). S = 16777215. >> float_size(cc(1,2), S). S = 16777217. >> cc(X,1,2), float_size(X,S), float_rank(1,S1), float_rank(2,S2), S = (S2 - S1)*2 + 1 . S2 = 1073741824, S1 = 1065353216, S = 16777217, X ~ cc(1,2). >> set_prolog_flag(interval_mode,union). true. >> float_size( pi u 2 .*. pi, S). S = 2. >> float_size(cc(1,1000) n int, S). S = 1000. >> float_size(cc(1,2) u cc(4,7), S). S = 29360130. >> set_prolog_flag(interval_mode,simple). true.

Voir galement : int_size/2, real_size/2, oat_rank/2.

232

Prdicats prdnis Prolog IV

freeze/2

Retardement de lexcution dun but

Types : freeze(@terme, @terme_excutable) Description : freezea; b retarde lexcution du but b tant que la valeur de ltiquette de a nest pas connue. Par connue, on entend le fait que cette tiquette ne peut prendre quune seule valeur. Cette notion est la mme que celle utilise dans nonvar/1. Note : Lorsque a devient connu, lensemble des buts gels sur a vient sinsrer en tte de la rsolvante. Pour des raisons defcacit, lordre dans lequel ils sont excuts nest pas spci. Exemples :
>> freeze(X, write(toto)). X ~ tree. >> freeze(X, write(toto)), X = 1 . totoX = 1.

Un appel gel ne se dgle pas quand une variable est contrainte mais que son tiquette nest pas connue :
>> freeze(X, dif(X,1)), X ~ cc(1,3). X ~ cc(2,3).

Par contre, il se dgle ds que cette valeur est connue :


>> freeze(X, dif(X,1)), X = 1 . false.

La valeur na cependant pas besoin dntre entirement connue. On note de plus dans cet exemple lusage des parenthses pour inscrire une suite de buts dans le second argument de freeze/2 :
>> freeze(X, (write(toto),nl)), X = toto(Y). toto X = toto(Y), Y ~ tree.

Voir galement : nonvar/1.

get_istats/3 get_istats/2

Lecture des statistiques sur les intervalles

Description : get_istatsa; b unie respectivement suivants :

a et b avec les valeurs des compteurs

Le nombre de points xes excuts, Le nombre de rvaluations de relations primaires effectues dans le point xe. get_istatsa; b; c unie respectivement a, teurs suivants : Le nombre de points xes excuts,

b et c avec les valeurs des comp-

glb/2

233 Le nombre de rvaluations de relations primaires effectues dans le point xe. La taille de la plus grande union dintervalles. Exemples :
>> reset_istats, intsplit([cc(1,4), cc(3, 6)]), false. false. >> get_istats(A, B). B = 253, A = 93. >> get_istats(A, B, C). C = 0, B = 253, A = 93. >> set_prolog_flag(interval_mode,union). true. >> X ~ square(int n cc(1,10)). X ~ 1 u 4 u 9 u 16 u 25 u 36 u 49 u 64 u 81 u 100. >> get_istats(A,B,C). C = 10, B = 268, A = 99. >> set_prolog_flag(interval_mode,simple). true.

Voir galement : get_istats/2, reset_istats/0.

glb/2
Un appel glba; b choue dans les cas suivants :

Borne infrieure

Description : glba; b sert rcuprer la borne infrieure (en anglais, greatest lower bound du domaine de a dans la variable b.

a nest pas dun type compatible avec un type numrique, le domaine de a na pas de borne infrieure. Les deux conditions reviennent dire que a doit tre une variable numrique
avec une borne infrieure. Il est important de remarquer que la valeur retourne par glb/2 est une borne infrieure. Cette borne ne fait donc pas toujours partie du domaine de la variable, et en particulier quand la variable est contrainte appartenir un intervalle ouvert. Exemples :
>> glb(1,B). B = 1. >> glb(cc(1,2), B). B = 1. >> glb(oo(1,2), B). B = 1. >> glb(pi, B). B = 6588397/2097152. >> glb(le(0), B). false. >> glb(ge(0), B). B = 0.

234 Voir galement : bounds/3, lub/2.

Prdicats prdnis Prolog IV

glblin/2

Borne infrieure (linaire)

Description : glblina; b sert rcuprer la borne infrieure (en anglais, greatest lower bound) du domaine de a dans la variable b. Seules les contraintes linaires sont prises en compte.

a nest pas dun type compatible avec un type numrique, le domaine de a na pas de borne infrieure. Les deux conditions reviennent dire que a doit tre une variable numrique
avec une borne infrieure. Il est important de remarquer que la valeur retourne par glblin/2 est une borne infrieure. Cette borne ne fait donc pas toujours partie du domaine de la variable, en particulier quand la variable a t contrainte au moyen dingalits strictes (ou avec dif). Exemples :
>> glblin(1,B). B = 1. >> glblin(lelin(0), B). false. >> glblin(gelin(7), B). B = 7.

Un appel glblina; b choue dans les cas suivants :

Voir galement : boundslin/3, lublin/2.

int_size/2

235

int_size/2

Mesure dans Z dun domaine

Description : int_sizea; b unie b avec une mesure du domaine de a, qui est le nombre dentiers contenus dans a. Si le domaine nest pas born, alors b est uni avec pinfinity. int_size/2 sert mesurer la taille du domaine dune variable, et est en particulier utile lors de la phase de slection dune variable sur laquelle numrer. Exemples :
>> int_size(1,S). S = 1. >> int_size(pi,S). S = 0. >> int_size(real,S). S = pinfinity. >> int_size(cc(1,2), S). S = 2. >> int_size(oo(1,2), S). S = 0. >> set_prolog_flag(interval_mode,union). true. >> int_size(cc(1,1000) n int, S). S = 1000. >> int_size(cc(1,2) u cc(4,7), S). S = 6. >> set_prolog_flag(interval_mode,simple). true.

Voir galement : oat_size/2, real_size/2.

intsplit/1 intsplit/2 intsplit/3

Enumration dune liste dentiers

Description : intsplita; b; c enumre les entiers du domaine des lments de la liste a en coupant en deux chaque tape le domaine de la variable choisie suivant la valeur de b : maine,

b = smallest_domain : Choix de la variable ayant le plus petit dob b


= greatest_domain : Choix de la variable ayant le plus grand domaine,

= list_order : Choix de la premire variable de la liste qui ne remplit pas la condition darrt,

Cette numration sarrte suivant la valeur de c :

b = my_choice : Utilisation du prdicat my_choicea; x dni par lutilisateur , qui unie x avec lune des variables de a. c = depth(n) : Arrt quand larbre dnumration a atteint une pro-

236

Prdicats prdnis Prolog IV


fondeur de n, cest--dire quand n choix ont t effectus.

= my_stop : Utilisation du prdicat my_stopa dni par lutilisateur , un succs de ce prdicat signie que la condition darrt est atteinte.

= prec(p), ou c = p : Arrt quand toutes les variables de a ont un domaine de mesure infrieure p, cest--dire quand leur domaine contient au plus p entiers.

c c

Quand des prdicats dnis par lutilisateur sont utiliss, que ce soit pour la slection de la variable ou pour le test darrt, la liste a passe en argument contient ltat actuel de la liste a passe en paramtre de intsplit/3. Lutilisateur peut donc pendant son traitement faire toutes les oprations dsires sur cette liste. Toutefois, les algorithmes de slection de variables et de test darrt doivent tre prudemment crits, de manire viter des bouclages. intsplita; b enumre les entiers du domaine des lments de la liste a en coupant en deux chaque tape le domaine de lentier choisi suivant la valeur de b, qui peut prendre les mmes valeurs que pour intsplit/3. Lalgorithme sarrte quand chaque lment de la liste a ne contient plus quun seul entier. intsplit/2 peut donc se dnir partir de intsplit/3 par :
intsplit(A, B) :intsplit(A, B, prec(1)).

intsplita enumre les entiers du domaine des lments de la liste a en coupant en deux chaque tape le domaine de lentier dont le domaine est le plus petit, jusqu ce que chaque lment de la liste a ne contienne plus quun seul entier. intsplit/1 peut donc se dnir partir de intsplit/3 par :
intsplit(A) :intsplit(A, smallest_domain, prec(1)).

Exemples :

>> A ~ cc(1,20), intsplit([A], smallest_domain, prec(5)). A ~ cc(1,5); A ~ cc(6,10); A ~ cc(11,15); A ~ cc(16,20). >> A ~ cc(1,20), B ~ cc(1,20), B ~ square(A), intsplit([A,B]). B = 1, A = 1; B = 4, A = 2; B = 9, A = 3; B = 16, A = 4. >> A ~ cc(1,20), B ~ cc(1,20), B ~ square(A), intsplit([A,B], greatest_domain, depth(1)). B ~ cc(1,4), A ~ cc(1,2); B ~ cc(9,16), A ~ cc(3,4).

Voir galement : boolsplit/2, realsplit/4.

iso/0

237

iso/0

Passage en mode iso


Description : iso permet le passage vers le mode iso, c..d. le mode syntaxique de la norme. Dans ce mode, les foncteurs prdnis sont laisss inchangs dans les rgles et les requtes (ils sont interprts en mode prolog4). Exemples :
>> X+2 = 2*X-4. X = 6. >> iso. true. ?- X+2 = 2*X-4. false.

Voir galement : prolog4/0, :-iso/0 (directive).

lub/2
Un appel luba; b choue dans les cas suivants :

Borne suprieure

Description : luba; b sert rcuprer la borne suprieure (en anglais, lowest upper bound) du domaine de a dans la variable b.

a nest pas dun type compatible avec un type numrique, le domaine de a na pas de borne suprieure. Les deux conditions reviennent dire que a doit tre une variable numrique
avec une borne suprieure. Il est important de remarquer que la valeur retourne par lub/3 est une borne suprieure. Cette borne ne fait donc pas toujours partie du domaine de la variable, en particulier quand elle est contrainte appartenir un intervalle ouvert. Exemples :
>> lub(1, B). B = 1. >> lub(cc(1,2), B). B = 2. >> lub(oo(1,2), B). B = 2. >> lub(pi, B). B = 13176795/4194304. >> lub(le(0), B). B = 0. >> lub(ge(0), B). false.

Voir galement : bounds/3, glb/2.

238

Prdicats prdnis Prolog IV

lublin/2

Borne suprieure (linaire)

Description : lublina; b sert rcuprer la borne suprieure (en anglais, lowest upper bound) du domaine de a dans la variable b. Seules les contraintes linaires sont prises en compte.

a nest pas dun type compatible avec un type numrique, le domaine de a na pas de borne suprieure. Les deux conditions reviennent dire que a doit tre une variable numrique
avec une borne suprieure. Il est important de remarquer que la valeur retourne par lublin/2 est une borne suprieure. Cette borne ne fait donc pas toujours partie du domaine de la variable, en particulier quand la variable a t contrainte au moyen dingalits strictes (ou avec dif). Exemples :
>> lublin(1, B). B = 1. >> lublin(lelin(3), B). B = 3. >> lublin(ltlin(3), B). B = 3. >> lublin(gelin(3), B). false.

Un appel lublina; b choue dans les cas suivants :

Voir galement : boundslin/3, glblin/2.

maximizelin/1

Borne suprieure (linaire)

Description : maximizelina impose la variable a datteindre sa borne suprieure. Les contraintes linaires sont seules prises en compte. Un appel maximizelina choue dans les cas suivants :

a nest pas dun type compatible avec un type numrique, le domaine de a na pas de borne suprieure. cette borne suprieure ne peut tre atteinte par a. Les deux conditions reviennent dire que a doit tre une variable numrique

avec une borne suprieure atteignable. Cette borne ne fait pas toujours partie du domaine de la variable, en particulier quand la variable a t contrainte au moyen dingalits strictes (ou avec dif). Exemples :

minimizelin/1
>> maximizelin(1). B = 1. >> X ~ lelin(3), maximizelin(X). X = 3. >> dif(X, 3), X ~ lelin(3), maximizelin(X). false. >> X ~ ltlin(3), maximizelin(X). false. >> maximizelin(gelin(3)). false.

239

Voir galement : boundslin/3, lublin/2, minimizelin/1.

minimizelin/1

Borne infrieure (linaire)

Description : minimizelina impose la variable a datteindre sa borne infrieure. Les contraintes linaires sont seules prises en compte. Un appel minimizelina choue dans les cas suivants :

a nest pas dun type compatible avec un type numrique, le domaine de a na pas de borne infrieure. cette borne infrieure ne peut tre atteinte par a. Les deux conditions reviennent dire que a doit tre une variable numrique
avec une borne infrieure atteignable. Cette borne ne fait donc pas toujours partie du domaine de la variable, en particulier quand la variable a t contrainte au moyen dingalits strictes (ou avec dif).

Exemples :

>> minimizelin(1). B = 1. >> X ~ gelin(3), minimizelin(X). X = 3. >> dif(X, 3), X ~ gelin(3), minimizelin(X). false. >> X ~ gtlin(3), minimizelin(X). false. >> minimizelin(lelin(3)). false.

Voir galement : boundslin/3, glblin/2, maximizelin/1.

240

Prdicats prdnis Prolog IV

max_oat/1

Plus grand rationnel IEEE


IEEE ,

Description : max_oata unie a avec le plus grand rationnel 340282346638528859811704183484516925440. Exemples :

qui est lentier

>> max_float(A). A = 340282346638528859811704183484516925440.

Voir galement : oat_rank/2, min_positive_oat/1.

min_positive_oat/1

Plus petit nombre ottant positif reprsentable

Description : min_oata unie Exemples :

1 713623846352979940529142984724747568191373312 .

avec le plus petit rationnel

IEEE

positif, soit

>> min_positive_float(A). A = 1/713623846352979940529142984724747568191373312.

Voir galement : oat_rank/2, max_oat/1.

no_debug/0

Sortie du mode debug

Description : no_debug rend inactif le dbogueur. Les afchages du dbogueur ainsi que ses surveillances sont dsactives. On rappelle que le dbogueur ne peut montrer des informations que sur les rgles qui ont t compiles avec les primitives de la famille compile. Voir le chapitre Environnement pour de plus amples dtails sur le dbogueur. Voir galement : debug/0, compile/n.

prolog4/0

Passage en mode prolog4

Description : prolog4 permet le passage vers le mode prolog4, c..d. le mode syntaxique naturel de Prolog IV. Dans ce mode, certains foncteurs prdnis sont interprts dans les rgles et les requtes. Exemples :
?- 1+2 = 7-4. false. ?- prolog4. true. >> 1+2 = 7-4. true.

Voir galement : iso/0, :-prolog4/0 (directive).

real_size/2

241

real_size/2

Mesure dans R dun domaine

Description : real_sizea; b unie b avec une mesure du domaine de a, qui est la taille du domaine de a dans R. Si le domaine nest pas born, alors b est uni avec pinfinity. real_size/2 sert mesurer la taille du domaine dune variable, et est en particulier utile lors de la phase de slection dune variable sur laquelle numrer. En mode intervalles simples, si L est le rang de la borne infrieure du domaine de a et que U le rang de la borne suprieure de a, alors la mesure b peut tre calcule par :

b = U , L si le domaine de a est born des deux cts,

pinfinity sinon. En mode unions dintervalles, la mesure du domaine dune variable est la somme des mesures de chaque intervalle le composant. Exemples :
>> real_size(1,S). S = 0. >> real_size(pi,S). S = 1/4194304. >> real_size(real,S). S = pinfinity. >> real_size(cc(1,2),S). S = 1. >> real_size(oo(1,2),S). S = 1. >> set_prolog_flag(interval_mode,union). true.

Dans lexemple ci-dessous, on voit que les intervalles rduits un singleton ont une taille de 0, et que 1000  0 = 0.
>> real_size(cc(1,1000) n int, S). S = 0. >> real_size(cc(1,2) u cc(4,7), S). S = 4. >> set_prolog_flag(interval_mode,simple). true.

Voir galement : oat_size/2, int_size/2.

242

Prdicats prdnis Prolog IV

realsplit/1 realsplit/2 realsplit/3 realsplit/4

Enumration dune liste de rels

Description : realsplita; b; c; d enumre les rels du domaine des lments de la liste a en coupant en deux chaque tape le domaine de la variable choisie suivant la valeur de b :

b = smallest_domain : Choix de la variable ayant le plus petit domaine, b = greatest_domain : Choix de la variable ayant le plus grand domaine, b = list_order : Choix de la premire variable de la liste dont la mesure
du domaine est suprieure la prcision requise,

Cette numration sarrte suivant la valeur de c :

= my_choice : Utilisation du prdicat my_choicea; x dni par lutilisateur , qui unie x avec lune des variables de a.

c = depth(n) : Arrt quand larbre dnumration a atteint une profondeur de n, cest--dire quand n choix ont t effectus. c c = my_stopa : Utilisation du prdicat my_stopa dni par lutilisateur , une russite de ce prdicat signie que la condition darrt est atteinte. d = real_mode : Mesure sur R (voir real_size/2), d = float_mode : Mesure sur les ottants (voir oat_size/2).
= prec(p) ou c = p : Arrt quand tous les rels de domaine de mesure infrieure p,

a sont dans un

La mthode de mesure des domaines est fonction de d :

La mthode de mesure est utilise la fois pour slectionner les variables sur lesquelles porte lnumration et pour effectuer les tests darrt. Si certains des arguments b, c et d ne sont pas instancis lors de lappel realsplit/4, ils sont unis avec la valeur par dfaut slectionne. realsplita; b; c enumre les rels du domaine des lments de la liste a en coupant en deux chaque tape le domaine du rel choisi suivant la valeur de b. Lnumration sarrte quand une condition indique par c est atteinte. Les valeurs possibles de b et c sont les mmes que ci-dessus. Toutes les mesures sont effectues sur R, ce qui correspond au real_mode de realsplit/4. realsplita; b enumre les rels du domaine des lments de la liste a en coupant en deux chaque tape le domaine du rel choisi suivant la valeur de b. Lnumration sarrte quand La prcision des calculs est de 10,4 . Toutes les mesures sont effectues sur R, ce qui correspond au real_mode de realsplit/4.

recompile/1

243 realsplita enumre les rels du domaine des lments de la liste a en coupant en deux chaque tape le domaine du rel dont le domaine est le plus petit, ce qui correspond loption smallest_domain de realsplit/4. Lnumration sarrte quand La prcision des calculs est de 10,4 . Toutes les mesures sont effectues sur R, ce qui correspond qu real_mode de realsplit/4. Ces trois versions peuvent donc aisment tre dnies partir de realsplit/4 de la manire suivante :

realsplit(A, B, C) :realsplit(A, B, C, real_mode). realsplit(A, B) :realsplit(A, B, prec(1/10000), real_mode). realsplit(A) :realsplit(A, smallest_domain, prec(1/10000), real_mode).

[large] Exemples :
>> A ~ cc(1,pi), realsplit([A], B, prec(1)). B = smallest_domain, A ~ cc(1,>1.5353982); B = smallest_domain, A ~ oc(>1.5353982,>2.0707964); B = smallest_domain, A ~ oo(>2.0707964,>2.6061944); B = smallest_domain, A ~ co(>2.6061944,>3.1415927).

Voir galement : boolsplit/2, intsplit/3.

recompile/1 recompile/2
Types : recompile(+atome) recompile(+atome, @liste)

Recompilation dun chier

Description : Trs similaire la primitive compile/n, recompilea lit une suite de rgles dans le chier de nom a. Les rgles lues sont compiles et entres en mmoire. Si un paquet de rgles de mmes nom et arit gure dj dans la base de rgles, il serait simplement redni sans quune erreur ne soit gnre. recompile/2 est le pendant le la primitive compile/2. Voir les primitives compile/n pour la description des options et les exemples. Voir galement : compile/n, consult/n, debug/0.

244

Prdicats prdnis Prolog IV

reconsult/0 reconsult/1
Types : reconsult reconsult(+atome)

Reconsultation dun chier

Description : reconsulta lit une suite de rgles dans le chier de nom a. Les rgles lues sont traduites puis entres en mmoire. Si un paquet dynamique de rgles de mmes nom et arit gure dj dans la base de rgles, il serait simplement redni sans quune erreur ne soit gnre. reconsult/0 est le pendant le la primitive consult/0. Voir la description et les exemples donns pour consult/n pour complments dinformation. Voir galement : consult/n, compile/n.

record/2
Types : record(+atome, @terme)

Affectation de variable globale

Description : recorda; b associe le terme b latome donn dans a. Tout se passe comme si a tait le nom dune variable globale prennant b comme valeur. Il sagit donc bien de laffectation classique, comme elle se pratique en FORTRAN, PASCAL, etc... Exemples :
>> record(age, 21). true. >> write(age), nl. age true. >> recorded(age, X). X = 21.

Voir galement : recorded/2.

record/2

245

record/2

Affectation dun lment de tableau

Types : record(+lment_de_tableau, @terme) Description : recordai; b associe le terme b llment de rang i du tableau a. Exemples :
>> def_array(tab, 10). true. >> N ~ cc(1, 10), enum(N), record(tab(N), N.*.N). N = 1; N = 2; N = 3; N = 4; N = 5; N = 6; N = 7; N = 8; N = 9; N = 10. >> recorded(tab(6), X). X = 36. >> undef_array(tab). true.

Voir galement : def_array/2, recorded/2, undef_array/1.

246

Prdicats prdnis Prolog IV

recorded/2

Evaluation dune variable globale

Types : recorded(+atome,?terme) recorded(+lment_de_tableau,?terme) Description : recordeda; b produit le rsultat b, en fonction de a qui doit tre un identicateur ou un lment de tableau, en respectant les rgles suivantes : la valeur associe un tableau indic est gale la valeur associe llment correspondant de ce tableau, la valeur associe un identicateur i est dnie comme suit : si un terme t a t associ i (au moyen de la primitive record/2), alors la valeur associe est t, sinon, i na pas fait lobjet dune association pralable, et la valeur associe i est lui-mme.

Exemples :

>> record(age, 21). true. >> write(age), nl. age true. >> recorded(age, X). X = 21. >> def_array(tab, 10). true. >> N ~ cc(1, 10), enum(N), record(tab(N), N.*.N). N = 1; N = 2; N = 3; N = 4; N = 5; N = 6; N = 7; N = 8; N = 9; N = 10. >> recorded(tab(6), X). X = 36. >> undef_array(tab). true.

Voir galement : def_array/2, record/2, undef_array/1.

redef_array/2

247

redef_array/2
Types : redef_array(+atome, +entier)

Rednition dun tableau

Description : redef_arraya; b (re)dnit dynamiquement un tableau de termes, de nom a et de longueur b. Si un tableau de mme nom existe dj, aucune erreur nest produite ( moins que la taille rserver ne soit trop grande). Dans ce cas, soit le tableau est redni de plus petite taille, et les lments de rang suprieur la nouvelle taille sont perdus, soit le tableau est redni de plus grande taille, et les nouveaux lments sont initialiss zro. Voir la primitive def_array/2 pour dautres informations. Exemples :
>> def_array(tab, 10). true. >> N ~ cc(1, 10), enum(N), record(tab(N), N.*.N). N = 1; N = 2; N = 3; N = 4; N = 5; N = 6; N = 7; N = 8; N = 9; N = 10. >> recorded(tab(5), X). X = 25. >> recorded(tab(6), X). X = 36. >> redef_array(tab,5). true. >> recorded(tab(5), X). X = 25. >> recorded(tab(6), X). error: error(prologIV_error(array,6),recorded/2) >> redef_array(tab,10). true. >> recorded(tab(5), X). X = 25. >> recorded(tab(6), X). X = 0.

Voir galement : def_array/2, record/2, recorded/2, undef_array/1.

248

Prdicats prdnis Prolog IV

reset_istats/0

Rinitialisation des statistiques sur les intervalles

Description : reset_istats remet trois compteurs zro : Le nombre de points xes excuts, Le nombre de rvaluations de relations primaires effectues dans le point xe, La taille de la plus grande union dintervalles. Cette primitive est utilise en conjonction avec get_istats/2 et get_istats/3. Exemples :
>> reset_istats. true.

Voir galement : get_istats/2, get_istats/3.

reset_cpu_time/0

Rinitialisation du chronomtre

Description : reset_cpu_time remet le chronomtre zro. Cette primitive est utilise en conjonction avec cpu_time/1. Exemples :
>> reset_cpu_time, cpu_time(T). T = 0.

Voir galement : cpu_time/1.

system/1
Types : system(+atome)

Appel systme

Description : systema effectue la commande contenue dans la chane repsente par latome a. On fait appel au systme dexploitation pour lexcution de cette commande. Les commandes effectues par le biais de cette primitive sont en gnral locales celle-ci ; en particulier, on ne peut changer le rpertoire de travail courant de faon durable avec cette primitive : il faut utiliser pour cela chdir/1. Le comportement prcis de cette primitive, notamment en ce qui concerne ses effets de bord, est bien sr non-portable. Toutefois : Elle gnre une erreur si largument nest pas un atome. Elle choue si le systme dexploitation retourne une erreur en lanant la commande. Elle russit dans les autres cas. Exemples :

undef_array/1
>> system(pwd). /mon/repertoire/de/travail true. >> system(cd /mon/repertoire). true. >> system(pwd). /mon/repertoire/de/travail true. >>

249

Note : Il faut entourer latome avec des apostrophes sil contient des blancs ou des caractres autres que des lettres ou des chiffres, ou sil commence par une majuscule. Voir galement : chdir/1

undef_array/1
Types : undef_array(+atome)

Destruction de tableau

Description : undef_arraya libre le tableau de nom a cr par la primitive def_array/2. Le tableau a ne peut plus tre utilis sans une nouvelle dnition au moyen de def_array/2. Exemples :
>> def_array(tab, 10). true. >> N ~ cc(1, 10), enum(N), record(tab(N), N.*.N). N = 1; N = 2; N = 3; N = 4; N = 5; N = 6; N = 7; N = 8; N = 9; N = 10. >> recorded(tab(6), X). X = 36. >> undef_array(tab). true. >> recorded(tab(6), X). error: error(prologIV_error(undefined_array,tab(6)), recorded/2)

Voir galement : def_array/2, record/2, recorded/2.

250

Prdicats prdnis Prolog IV