Tutoriel Prolog

Contraintes sur les réels (solveur approché)

Prolog IV fournit un jeu de contraintes qui nous permet de raisonner sur les nombres réels. Nous prendrons bien soin de ne pas confondre les contraintes linéaires expliquées dans la section précédente avec les contraintes sur les réels que nous allons rapidement introduire ici. Il est difficile de raisonner précisement sur les nombres réels. Un nombre aussi simple quep2 n’est pas représenté exactement en machine avec Prolog IV.
Bien sûr, on peut calculer autant de chiffres que l’on veut et aller bien au delà de la précision de 1.414, mais nous ne pourrons jamais trouver (et donc à plus forte raison faire des opérations sur) toutes les décimales qui composent ce nombre.
Une alternative pourrait être d’implanter un solveur qui fait du calcul formel, mais il faut bien reconnaître que ces systêmes sont lourds et d’une certaine lenteur.
Ce qui nous reste donc est un solveur implantant un compromis entre perfor-mances (vitesse et consommation mémoire) et utilité de ce qui est déduit pour la résolution de problèmes.
Pour cette raison, ces contraintes sur les réels sont prises en compte par un solveur tout à fait différent du solveur complet des équations et inéquations linéaires.
Ceci nous amène à formuler les deux propriétés les plus importantes sur les contraintes sur les réels en Prolog IV :
– La résolution d’une contrainte de base est complète.
– La résolution d’un ensemble de contraintes est incomplète.
Par incomplet, nous voulons dire que Prolog IV peut ne pas détecter l’insolubilité de certains systèmes de contraintes qui n’ont pas de solution. Nous montrerons plus loin le pourquoi du passage de la complétude à l’incomplétude lorsqu’on passe de la résolution d’une contrainte à la résolution de plusieurs contraintes.
Bien sûr, l’incomplétude est a priori ennuyeuse, puisque décider si un système de contraintes est soluble ou pas est plus difficile. En fait, la façon dont ces contraintes sont traitées par Prolog IV nous garantit certains résultats.
Dans ce qui suit, on différencie le problème ditexact, qui est le problème originel (mathématique, physique,. . . ) du problème dit approché, qui est sa traduction naturelle en Prolog IV.
– Il est garanti que si un problème (système de contrainte) approché est déclaré insoluble par Prolog IV, alors le problème exact est tout aussi insoluble.
– Il est garanti que si le problème exact a une solution, alors elle se trouve parmi les solutions du problème approché (elle est donc trouvée par Prolog IV).
– Si Prolog IV trouve une solution au problème approché dans laquelle toutes les variables prennent une valeur unique, alors cette solution est aussi solution du problème exact.
Voyons quelques exemples. Essayons de calculer la valeur de p2. Il suffit de poser assez naturellement sous Prolog IV la contrainte X = sqrt(2) :
>> X = sqrt(2).
X ~ cc(`>1.4142135`,`>1.4142136`)
>>
L’expression sqrt(2) est un terme ensembliste dit aussi pseudo-terme. Un pseudo-terme ne se distingue d’un terme que par le fait qu’il fait intervenir, à quelque niveau que ce soit, au moins un symbole de relation dont le nom et l’arité+1 sont réservés. La définition est donc récursive : en effet soit le nœud a un nom de relation réservée, soit l’un des fils au moins du nœud est lui-même un pseudo-terme. Bien sûr tout ceci n’est pas exclusif et on peut fabriquer des imbrications assez diaboliques, avec plusieurs relations. Il faut noter qu’il n’y a pas de différences syntaxiques entre termes et pseudo-termes.
Les pseudo-termes numériques représentent des ensembles quelconques de réels. Parfois cet ensemble se réduit à un seul élément, nombre rationnel ou pas.
Pour en revenir à notre exemple, voyons qu’on peut tout aussi bien poser la contrainte à l’aide de la notation relationnelle plutôt que fonctionnelle, on obtiendra la même réponse (on voit mieux maintenant pourquoi la relation sqrt est d’arité 2) :
>> sqrt(X, 2).
X ~ cc(`>1.4142135`,`>1.4142136`)
>>
Prolog IV répond en nous donnant le domaine de valeurs possibles pour la variable X, c’est à dire un sous-ensemble de R. Il ne s’agit toutefois pas de n’importe quel sous-ensemble de réels. Seulement une partie d’entre eux est utilisée par Prolog IV :
– les singletons formés d’un nombre rationnel (on parle alors dans ce cas-là de valeur plutôt que de domaine),
– les intervalles construits à l’aide des seuls nombres flottants simples de la norme IEEE (auxquels on se réfèrera plus tard sous le vocable de nombres flottants) 7 . Ces ensembles-là sont par ailleurs en nombre fini puisque formés à l’aide des seuls nombres flottants, qui sont en quantité finie 8 .
D’après nos principes, la solution (nous savons indépendamment de Prolog IV qu’elle existe) est à l’intérieur. Prolog IV nous a donné une réponse à l’aide des relations et cc. La contrainte X E, avec X une variable signifie « X est élément de l’ensemble décrit parE ». Par exemple X cc(1; 2) signifie
« >1.4142135 » avec ces étranges décorations vaut très précisément «le premier nombre flottant arrivant après le nombre décimal 1.4142135 . »
Comme on l’a vu précédemment, il est normal d’avoir un encadrement au lieu d’une simple valeur puisqu’il n’est pas possible de calculer (et à plus forte raison d’afficher) la valeur de p2. Prolog IV ne peut que retourner l’intervalle
[1:41421353816986083984375; 1:414213657379150390625]
qui est le plus petit intervalle possible qui contienne p2 et qui est tel que les deux bornes soient des nombres flottants en simple précision 12 . En fait, lors du traitement des contraintes sur les réels, Prolog IV effectue tous ses calculs de sous-domaines avec de tels intervalles.
Toutefois, Prolog IV peut calculer des valeurs exactes (qui sont donc des nom-bres rationnels), même quand il traite de telles contraintes :
>> X = sqrt(4).
X=2.
>>
il y a donc environ 22 sous-ensembles de nombres flottants.
Dans ce cas, la valeur est précise, et nous sommessûrs que c’est la solution de notre contrainte. Bien entendu, même dans l’exemple plus haut, la réponse était juste, quoique moins précisément exprimée car irrationnelle.
Regardons maintenant l’exemple suivant :
>> X = sqrt(2) , X = sqrt(2.0000001).
X ~ oo(`>1.4142135`,`>1.4142136`).
>>
La réponse est (presque) la même qu’avant et le résultat montre un succès bien qu’il soit évident pour nous quep2 =6 p2:0000001. La raison en est qu’avec la précision donnée par les intervalles bornés par les nombres flottants, il n’est pas possible de faire la différence entre ces deux nombres, le pouvoir de réso-lution des nombres flottants 13 ne permettant pas de les distinguer. Toutefois, ce qui semble être une faiblesse respecte parfaitement un de nos principes
« s’il y a une solution du problème réel, elle se trouve dans les sous-domaines retournés par la résolution du problème approché».
Par acquis de conscience, donnons-nous le même exemple avec des nombres flottants séparables (il nous suffit d’enlever un 0) :
>> X = sqrt(2) , X = sqrt(2.000001).
false.
>>
Ouf !
Il faut toujours garder à l’esprit que le solveur des nombres réels ne travaille que sur le problème approché, pas sur le problème exact.
Voici maintenant la relation square. Elle ressemble assez à sqrt, mais ce n’est pas tout à fait la même chose puisquesqrt(X) est le nombre positif dont le carré vaut X.
Jouons un peu avec toutes deux, en les utilisant de façon imbriquée pour chan-ger :
>> square(sqrt(X)) = 2.
X ~ cc(`>1.9999998`,`>2.0000004`).
>> sqrt(square(X)) = 2, ge(X,0).
X=2.
>>
La réponse à la première question donne une bonne approximation (bien lisible) de l’équation (pX)2 = 2 dont la solution est mathématiquement
X = 2. La contrainte dans cette question n’est pas atomique, puisque for-mée de relations imbriquées.
La seconde question contient une nouvelle contrainte basée sur la relationge 14 qui nous permet d’imposer à X d’être positif X( 0). Bien que cette question comporte plusieurs contraintes approchées, sa réponse ne comporte que des valeurs (pas de domaine) ; elle est donc exacte, d’après l’un de nos principes ( Si Prolog IV trouve une solution au problème approché dans laquelle toutes les variables prennent une valeur, alors cette solution est aussi solution du problème exact).

Le pourquoi de l’incomplétude
Voyons informellement comment se passe la résolution d’une contrainte :
1. A partir de la contrainte, on considère les domaines des arguments de sa relation (qu’on note par exemple R) ; supposons la relation d’aritén, et appelons les domaines D1, . . . , Dn.
2. La contrainte est résolue complètement, c.à.d. on cherche le sous-en-semble E de Rn tel que E = R \ D1 Dn. On supposera que E est non-vide (il y a sinon un échec.) Pour fixer les idées, imaginons que l’on est dans R3 et que notre ensemble ressemble à une patate.
3. On effectue une approximation de cet ensemble par le plus petit pavé de Rn qui l’englobe. Avec notre exemple, on obtient un parallèlépipède contenant la patate au plus près, c.à.d. la touchant sur chaque face 15.
4. Le pavé en question est bien sûr un produit cartésien d’intervalles de R; on va approcher ceux-ci par des sous-domaines réels de Prolog IV. Chacune de ses dimensions fait l’objet d’une approximation par un en-semble :
Si l’intervalle est réduit à un nombre, on le transforme en le plus petit intervalle flottant qui le contient.
Sinon c’est un véritable intervalle et on arrondi chacune des bornes par le flottant le plus proche 16 par défaut ou par excès selon qu’il s’agit de la borne inférieure ou supérieure.
Bref, quand les deux bornes d’un intervalle ne sont pas des nombres flottants, on approche celui-ci par un intervalle de nombres flottants, pris un peu plus large (juste ce qu’il faut) afin ne pas perdre de valeurs.
5. Ces domaines sont attribués aux variables qui apparaissaient en tant qu’argument. Le domaine de chacune des variables n’a pu que dimi-nuer.
En plus de cette résolution existe un mécanisme prenant en compte exclusi-vement les nombres rationnels. Quand suffisamment d’arguments de la con-trainte sont des nombres rationnels, il peut être déduit les valeurs (elles aussi rationnelles) des autres arguments.
La résolution d’un ensemble de contraintes se passe très simplement en trai-tant chaque contrainte (c’est une relation et des variables ou constantes en argument) comme indiqué ci-dessus. Les variables servent seules d’interface entre les contraintes, aussi un sous-domaine « surévalué » (qui approche trop grossièrement l’ensemble exact) peut éventuellement cacher une absence de solution mathématique. En effet, l’intersection de l’approximation de deux ensembles disjoints peut être non-vide.
Prenons par exemple la requête avec les contraintes suivantes :
>> X = oo(-1,1), Y = oo(-1,1), gt(X,Y).
Y ~ oo(-1,1),
X ~ oo(-1,1).
>> X = oo(-1,1), Y = oo(-1,1), lt(X,Y).
Y ~ oo(-1,1),
X ~ oo(-1,1).
>>
On obtient en réponse aux deux requêtes que les sous-domaines pourX et Y sont inchangés17. Ceci signifie que l’ensemble approximant la conjonction des trois contraintes de chaque requête est le pavé ouvert(,1; 1) (,1; 1).
Et quand on met ensemble les quatres contraintes, on obtient. . .
>> X = oo(-1,1), Y = oo(-1,1), gt(X,Y), lt(X,Y).
Y ~ oo(-1,1),
X ~ oo(-1,1).
. . . un succès ! Alors que cet ensemble de contraintes est mathématiquement insoluble.
Nos ennuis viennent de la conjonction des deux contraintes gt(X; Y ) et lt(X; Y ). Chacune est traitée parfaitement, mais le traitement de l’ensemble des deux passe par l’utilisation de domaines grossiers (parce que se sont des pavés) qui servent d’interface (par le biais de variables communes). C’est cette faiblesse de représentation des domaines (voulue pour une implantation effi-cace) qui rend notre solveur incomplet.
Notes :
– Les contraintes de domaines (utilisant des relations comme cc, oo,. . . ) ne posent pas de problèmes dans la mesure où ce qui est passé en argu-ment est représentable par des nombres flottants.
– Il y a une autre cause d’incomplétude car il y a deux moments où il est fait une approximation pendant le traitement d’une contrainte (les points 3 et 4). Celle décrite au point 4 se présente moins fréquemment que celle que l’on vient de montrer : il s’agit de l’exemple avec p2 et p2:0000001, vu dans une section antérieure.
– Une contrainte de la forme rel(X; X) n’est pas autre chose que la conjonction de contraintes (9A) rel(X; A); eq(A; X) qui comporte donc deux contraintes et est donc soumise aux problèmes d’incomplé-tude précités.

Union d’intervalles

Oublions temporairement l’incomplétude en examinant d’autres requêtes et leurs réponses dans deux modes de fonctionnement du solveur de contraintes sur les réels.
>> X = sqrt(2).
X ~ cc(`>1.4142135`,`>1.4142136`).
>> square(X) = 2.
X ~ cc(-`>1.4142136`,`>1.4142136`)
>>
La première requête (qu’on connait déjà) rend un petit domaine alors que la dernière requête rend pourX un domaine de taille environ 2.8 d’amplitude (le premier nombre est négatif !). Nous savons que l’équationX2 = 2 a deux racines ,p2 et p2, et le plus petit intervalle qui les contient toutes deux est mathématiquement [,p2; p2], intervalle dont Prolog IV donne une bonne approximation à travers le sous-domaine de la variable X.
Passons dans le mode Prolog IV union d’intervalles pour voir comment les choses se passent 18 :
>> set_prolog_flag(interval_mode, union).
true.
>> sqrt(square(X)) = 2.
X ~ -2 u 2.
>>
Nous rend X appartenant au sous-domaine formé des deux nombres,2 et 2, qui est une forme allégée def,2g [ f2g. Au passage, nous découvrons l’existence du pseudo-terme t1 u t2 (avec u pour union) qui est l’ensemble des arbres qui appartiennent à t1 ou à t2 (de façon non-exclusive).
En mode « intervalles simples » cette requête aurait pour réponse X ~ cc(-2,2), et donc l’intervalle [,2; 2].
La question suivante avait déjà été posée plus haut, en mode « intervalles simples ». Il y est maintenant répondu, en mode «union d’intervalles » :
>> square(X) = 2.
X ~ cc(-`>1.4142136`,-`>1.4142135`)u cc(`>1.4142135`,`>1.4142136`).
>>
Cette fois-ci, on obtient une union de deux petits intervalles respectivement autour de ,p2 et de p2, au lieu de l’intervalle [,p2; p2], obtenu en mode « intervalles simples ». Dans certains cas, on a donc une meilleure séparation des solutions à l’aide du mode «union d’intervalles ».

Le quantificateur existentiel

Le quantificateur existentiel sert à construire une contrainte de la forme X ex P dans laquelle X est une variable muette (ou existentielle) et P une contrainte (ou une conjonction de contraintes comme une requête). Elle se lit « il existe X tel que P » et a même valeur de vérité queP. Cette construction est une extension qui ne fait pas partie de la norme ISO. Pragmatiquement, cette construction signale à Prolog IV que la variable X n’a pas d’intérêt aux yeux du programmeur et que l’on n’est pas intéressé par sa valeur ou son sous-domaine, qui ne seront donc pas affichés en réponse quand on utilise cette construction dans une requête. Par exemple :
>> X=Y.
X=Y,
Y ~ tree.
>> X ex X = Y.
Y ~ tree.
>> X ex X = f(g(2),g(2)).
true.
>>
En réponse à la seconde requête, rien n’est affiché pourX. Dans la troisième, Prolog IV se contente de répondre que la requête est soluble.
Les variables existentielles permettent d’avoir à sa disposition des sortes de « variables locales », complètement déconnectées du contexte, elles ne sont donc pas liées avec l’extérieur de la constructionex.
Dans la requête suivante, la variableX joue deux rôles, dont un rôle tout à fait local dans la contrainte parenthésée. Il ne faut pas être étonné queXpuisse valoir à la fois 1 et 3, puisqu’en fait il ne s’agit pas du tout du mêmeX.
>> X = Y, (X ex X = 1), Y = 3.
Y=3,
X=3.
>>
Voici encore trois exemples utilisant la quantification existentielle.
>> X ex Y = f(X,X)
A ex
Y = f(A,A),
A ~ tree.
>> X ex Y = f(X).
Y ~ f(tree).
>> X ex Y ex Z = f(X,Y).
Z ~ f(tree,tree).
>>
Dans la première requête, on crée une contrainte comportant deux occurrences d’une même variable existentielle. Dans la réponse, une variable existentielle est créée (avec pour domaine l’ensemble des arbres) puisqu’elle est nécessaire pour refléter le fait que deux sous-arbres identiques inconnus figurent dans la valeur de Y .
Dans la seconde requête au contraire, il n’est pas nécessaire de créer une va-riable existentielle puisque l’arbre complètement inconnu n’apparait qu’une fois, Prolog IV s’est contenté de mettre à cette place le pseudo-terme tree, qui représente l’ensemble de tous les arbres.
La troisième requête ne sert ici qu’à montrer une imbrication de quantifica-teurs, et se lit : il existe X tel que : il existe Y tel que : Z égale . . ., l’associa-tivité se faisant de la droite vers la gauche.

Utiliser compatible ou egal ?

Quand doit-on mettre « » ou «= » dans les contraintes ?
Ces deux relations (compatible) et = (égal) sont très similaires et il faut bien avouer qu’elles semblent faire la même chose, dans le sens où le pro-grammeur peut se tromper et écrire l’un pour l’autre, Prolog IV rectifiant de lui-même . Par contre, Prolog IV ne se permet pas en sortie cet abus de no-tation et utilise toujours la bonne relation pour les réponses, en utilisant= le plus souvent possible, et quand c’est nécessaire. La relation= ne s’em-ploie qu’avec des termes, alors que seule accepte les pseudo-termes en membre gauche ou droit. Bref = est l’égalité (unification dans les prologs standard) ordinaire, alors que se comporte selon le contexte de l’une des façons suivantes :
– terme terme est l’égalité (c’est exactement =« »).
– terme pseudoterme est vraie si l’individu représenté parterme ap-partient à l’ensemble représenté parpseudoterme, fausse sinon.
– pseudoterme terme est vraie si l’individu représenté parterme ap-partient à l’ensemble représenté parpseudoterme, fausse sinon.
– pseudoterme pseudoterme est vraie si l’intersection des deux en-sembles est non-vide, fausse sinon.

Les variables muettes underscore

Les variables underscore sont des variables muettes qui s’écrivent à l’aide du seul caractère «_». Chacune des occurrences représente une variable différente des autres. Ces variables sont tout simplement des variables existentielles qu’il n’est pas nécessaire de nommer et de quantifier.
>> X = f(_,_).
X ~ f(tree,tree).
>>

Relations et pseudo-termes

On a parfois montré à travers les exemples précédents des formes fonction-nelles (pseudo-terme) ou relationnelles (littéral) d’une même contrainte. Il faut savoir que toute contrainte peut être notée sous forme de relation ou de pseudo-terme (ensemble), la seule différence étant la position syntaxique et, bien sûr, l’arité.
Voici le rapport entre les deux concepts (et notations) que sont la relation et l’opération :
nom(X0; X1; : : : ; Xn) X0 nom(X1; : : : ; Xn)
Comme on le voit, l’argument qui sert de «résultat» à l’opération est le premier de la relation. La formule précédente conserve l’ordre des arguments quand on lit chaque membre de l’équivalence de gauche à droite. Par exemple, les contraintes :
ge(X; 0) X ge(0) avec ge(0) l’ensemble des nombres supérieurs ou égaux à zéro.
u(X; 1; 2) X u(1; 2) avec u(1; 2) 20 l’ensemble des deux nombres f1; 2g.
La présence de l’argument «résultat» en première position peut surprendre les habitués de prolog pour qui l’usage veut que les arguments de sortie viennent après ceux d’entrées, donc vers la fin du littéral, mais il faut se rappeler les points suivants :
– ce qu’on appelle «résultat »n’est pas plus un argument de sortie qu’un autre, c’est tout au plus un argument privilegié quant à son extraction.
– Les relations sont rarement utilisées telles quelles, il faut leur préfé-rer les notations fonctionnelles (pseudo-termes) qui sont la plupart du temps plus lisibles 21.
– L’argument «résultat »se trouve toujours au même endroit .

Des requêtes aussi puissantes qu’étonnantes

Dans tout ce qui suit, le programme consiste à chaque fois en une requête, sans avoir à définir de règles. On supposera sauf indication contraire qu’on est dans le mode «union d’intervalles ».
L’ensemble des X tels que leur carré est strictement plus grand que1 : (Ce qui suit un caractère % jusqu’à la fin de ligne est un commentaire prolog.)
>> gt(square(X),1). % ou encore » square(X) ~ gt(1).
X ~ lt(-1)u gt(1).
X a pour domaine l’ensemble des nombres strictement plus petits 23 que ,1 ou strictement plus grands que 1.
Une déduction élégante
Si Y est un carré . . .
>> X ex square(X) = Y.
Y ~ ge(0).
. . . alors il est positif ou nul !
Il a été utilisé ici un quantificateur existentiel afin de ne pas voir apparaître inutilement X dans la réponse.
Quelques requêtes sur les nombres entiers
Voici le pseudo-terme XnY dont le n rappele le symbole \ de l’intersection. Il construit l’ensemble dont les éléments appartiennent à chacun des deux en-sembles donnés en arguments24. Le pseudo-terme int représente l’ensemble des entiers relatifs. Quels sont les réels entre 1 et 9 qui sont des entiers ? (au-trement dit quel est l’ensemble : fXjX 2 [1; 9] \ Ng)
>> X ~ cc(1,9) n int.
X ~ 1 u 2 u 3 u 4 u 5 u 6 u 7 u 8 u 9.
Comme on est en mode «union », on obtient la liste en extension 25; 26.
>> X ~ cc(1,9) n times(2,int). % les entiers pairs entre 1 et 9
X ~ 2 u 4 u 6 u 8.
>> X ~ cc(1,9) n int n times(2,nint). % les entiers impairs de 1..9
X ~ 1 u 3 u 5 u 7 u 9.
Le pseudo-terme nint 27 représente l’ensemble des réels qui ne sont pas des entiers. Le pseudo-terme times(X; Y ) construit l’ensemble des produits pos-sibles de ses deux arguments. Pour exprimer que P est un nombre pair, il suffit de contraindre P a être le double d’un entier. Pour avoir un nombre impair, il faut le contraindre a être un entier qui est le double d’un nombre non-entier.
Les nombres premiers entre 10 et 100 (les diviseurs possibles à tester ne peuvent être que les nombres premiers de 2 à 7) :
>> X
~
cc(10,100) n int n times(2,nint) n times(3,nint)
n times(5,nint) n times(7,nint).
X ~ 11 u 13 u 17 u 19 u 23 u 29 u 31 u 37 u 41 u 43 u 47 u 53 u 59 u 61 u 67 u 71 u 73 u 79 u 83 u 89 u 97
Nombres rationnels et irrationnels
Le pseudo-terme pi représente l’ensemble des nombres égaux à . Dans le monde réel, il n’y a bien sûr qu’une valeur possible, laquelle n’est pas repré-sentable en Prolog IV, puisque irrationnelle. La seule déduction possible pour Prolog IV est le domaine de la relation, un petit intervalle ouvert.
>> X ~ pi.
X ~ oo(`>3.1415925`,`>3.1415927`).
Il ne faut pas croire pour autant que Prolog IV se laisse abuser facilement en lui donnant un nombre rationnel «humainement » proche de 28 :
>> pi ~ 3.141592653589793238462643383279502884197169399375105820974944.
false.
Bien que l’on ait une réponse affirmative à la question :
>> oo(`>3.1415925`,`>3.1415927`) ~
3.141592653589793238462643383279502884197169399375105820974944.
En effet, une relation numérique dont tous les arguments sont des constantes est complètement vérifiée par Prolog IV. Dans le cas très simple depi, les seules constantes numériques de Prolog IV étant les nombres rationnels et étant irrationnel, la relation pi(nombre) est toujours fausse, puisque nombre ne peut être qu’un rationnel.
Un peu de trigonométrie avec cosinus.
Quels sont les cosinus entiers d’angles compris entre 1 et 100 ? On peut for-maliser cet ensemble par fy j 9x; x 2 [1; 100]; y = cos x; y 2 Ng, et le traduire immédiatement en la requête :
>> X ex X ~ cc(1,100), Y ~ cos(X) n int.
Y ~ -1 u 0 u 1
On pouvait tout aussi bien taper la requête suivante :
« Y ~ cos(cc(1,100)) n int».
Quels sont les x tels que cos x = 1 avec ,10 x 10?
>> X ~ cc(-10,10), cos(X) ~ 1.
X ~ oo(-`>6.2831854`,-`>6.283185`)u 0 u oo(`>6.283185`,`>6.2831854`) qui se traduirait mathématiquement par l’ensemble :
] , (2 + « ); ,(2 , « )[ [ f0g [ ]2 , « ; 2 + « [ On y reconnait l’approximation de l’ensemble f,2 ; 0; 2 g.
Il y a bien entendu d’autres fonctions trigonométriques. Citons en vrac, outre cos, les fonctions sin, tan, cot, leurs réciproquesarcsin, arccos, arctan et les fonctions hyperboliques cosh, sinh, tanh et coth.
Pour clôturer la liste des fonctions transcendentales, on citera aussi exp, ln et log (logarithme décimal).

Fonctions algébriques et autres

Sans grandes explications, voici quelques fonctions et opérations sur les réels. Les quatre opérations classiques sur les réels +(, ,, , =) deviennent quatre relations plus, minus, times, div) sur les arbres. Le plus et moins unaires deviennent quant à eux respectivement les relations uplus et uminus.
Les notations avec pseudo-termes permettent de voir ces relations comme étant des opérations partielles sur les réels.
Pour des raisons pratiques, certaines relations ont un raccourci synonyme. En voici quelques-uns :
– La relation de symbole .+. est un synonyme 29 de la relation plus, l’ensemble des sommes de ses deux arguments ; c’est aussi un raccourci pour la relation uplus 30.

Cours gratuitTélécharger le cours complet

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *