*********MANUEL CONCEPTEUR********


Ce manuel concepteur à pour but d'aider les utilisateurs avancés qui voudraient modifier le code source afin de l'améliorer ou
de mieux l'adapter à leurs besoins,ce code étant en Open source.

Description des différentes fonctions auxiliaires:

*eval(ILF,Code): la fonction eval interpréte une fonction LF du type:+,-,*,/,if(Test,Then,Else)
Pour rajouter d'autres fonctionnalités,il suffit juste de rajouter les lignes correspondantes à celle ci:
Ex:
je veux rajouter la fonction exp(X,Y)=X^Y.


eval(X^Y,V):-
eval(X,Ex)
eval(Y,Ey)
V is Ex**Ey.


De même si l'on veux rajouter une fonction for(i,debut,fin,pas,Code).....

Le compilateur offre plus de possibilités d'améliorations:

*compilo(Nom_Fonction): Cette fonction est une simplification de la commande pour compiler:
*compile_def(Nom_Fonction,Clauses),load_clauses(Clauses).

Pour rajouter des fonctions à compiler il n'est pas nécessaire de modifier compile_def,ou compile_def1
il suffit juste de rajouter le compile_exp adéquate.
Ex:
je veux rajouter la fonction exp(X,Y)=X^Y.

compile_exp(X^Y,Z,L) :-
compile_exp(X,G,Cx),
compile_exp(Y,D,Cy),
append(Cx,Cy,C),
append(C,[Z is G**D],L).


Et de même pour d'autres fonctions qu'on voudra implémenter.
Cependant, ce n'est pas si facile, des difficultés peuvent être rencontrées sur des fonctions plus difficiles.

Ex:
Pour compiler le if,Then,Else ou encore le apply(F,Args), certaines astuces et une bonne connaisance d'ISO Prolog (ou un bon bouquin)
sont nécessaires au codage de celles ci.
Nous allons détailler ces deux fonctions pour aider à la compréhension.


Compile_exp( if(Test,Then,Else),X,Code):

 

compile_exp(if(Test,Then,Else),X,Code) :-


compile_exp(Test,Y,L1), %on transforme le Test en terme prolog que l'on met dans une liste
compile_exp(true,Y,L2), %si c'est vrai on ecrit Test=true
append(L1,L2,L3), %ici on concatene les deux listes
compile_exp(Then,X,L4), %on transforme le Then
append(L3,L4,Code). %on obtient la branche true du if,Then,Else

compile_exp(if(Test,Then,Else),X,Code) :-
compile_exp(Test,Y,L1), %même raisonnement ici
compile_exp(false,Y,L2),
append(L1,L2,L3),
compile_exp(Else,X,L4),
append(L3,L4,Code). %sauf que c'est la branche false du if,Then,Else qui est traduit


On obtient donc ici une liste de terme prolog qui après application de list_conj entre autre se transformera en Code Prolog
exécutable grâce à cette partie du code du compilateur:

list_conj(Code,Body),
Head=..[F,Args,X],
Clause=(Head :- Body). (3)


Ex:
Soit Exemple(N,if(N=0,1,0),X) qui prend en argument N,si N=0, X=1 sinon X=0par compile_exp:

[Y=(N=0),Y=true,X=1]
[Y=(N=0),Y=false,X=0]

Donne ensuite(avec C=N) par 3

Exemple(C):-
D=0
( C=D ->
E=true
; E=false
),
E=true,
F=1.
Exemple(C):-
D=0
( C=D ->
E=true
; E=false
),
E=false,
F=0.

Ce qui est le code Prolog de la fonction Exemple.

Compile_exp(apply(F,Args),X,Code):

compile_exp(apply(F,Args),X,Code) :-
compile_exp(Args,Y,L1),
T=..[F,Y,X], %ici l'astuce consiste a transforme la liste F,Y,X en terme F(Y,X).
append(L1,[T],Code). %il ne faut pas oublier que T n'est pas une liste et donc le mettre dans une liste vide afin de
%pouvoir le concatener pour avoir le resultat.


Note:
On ne s'étend pas sur les fonctions compile_def1(nécessaire à la compilation), celle ci n'étant pas codé par vos serviteurs mais provenant de la librarie privée "Mr Fred Mesnard".
De même pour list_conj qui transforme une liste en conjonctions (dans le sens de prolog).

Retour vers le menu des manuels