Bonjour à tous.
Je suis en train de me familiariser avec les règles de grammaire de Prolog (sicstus) : les DCGs
J'ai essayé de faire un petit programme pour interpréter une chaine de caractère contenant une expression mathématique.
ça marche très bien si on fait la somme, différence, produit ou rapport de chiffre, mais dès qu'on essaye de mettre un nombre, ça plante (le programme boucle à l'infini)
Voila le code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 calcul(Z) --> expr(X), "-", term(Y), part_exp(W), {Z is X - Y + W}. calcul(Z) --> expr(X), "-", term(Y), {Z is X - Y}. calcul(Z) --> expr(Z). part_exp(Z) --> "+", calcul(Z). part_exp(Z) --> "-", calcul(X), {Z is -X}. expr(Z) --> term(X), part_exp(Y), {Z is X + Y}. expr(Z) --> term(Z). term(Z) --> number(X), "*", term(Y), {Z is X * Y}. term(Z) --> number(X), "/", term(Y), {Z is X / Y}. term(Z) --> number(Z). number(C) --> "+", nb(C,_). number(C) --> "-", nb(X,_), {C is -X}. number(C) --> nb(C,_). nb(C,A) --> digit(X), nb(Y,A1), {pow(10,A1,R), C is X*R+Y, A is A1+1}. nb(C,1) --> digit(C). digit(X) --> [C], {"0"=<C, C=<"9", X is C - "0"}. pow(Nb, 1, Nb). pow(Nb, P, R):- P1 is P-1, pow(Nb, P1, R1), R is R1*Nb.
Si on essaye d'exécuter
Tout marche bien et on obtient bien Z = 2phrase(calcul(Z), "-1-2*2+2*3+1").
Par contre, ça plante si on fait simplement
J'ai isolé un peu le problème
Code : Sélectionner tout - Visualiser dans une fenêtre à part phrase(calcul(Z), "421").
Si on teste
Tout marche bien. Z vaut 421
Code : Sélectionner tout - Visualiser dans une fenêtre à part phrase(nombre(Z), "421").
Par contre, si on teste
Là, ça boucle...
Code : Sélectionner tout - Visualiser dans une fenêtre à part phrase(term(Z), "421").
Je ne comprend pas bien pourquoi. Auriez-vous une idée ??
Black Templar
P.S. : Ma fonction pow est naïve, je ne l'ai pas encore optimisé, c'est normal.
Partager