Multiplier une liste par 2
Bonjour,
je dois réaliser des petites fonctions en Prolog :
1) dm(R,D,M,Reste) : R*10+D=2*M+Reste
=> ici pas de problème, je l'ai fait et ça marche.
2) A toute liste L, d'entiers compris entre 0 et 9, on associe sa valeur entière v(L) telle que :
v[nk,n(k-1) ... n1, n0] = nk * 10^k + ... + n1*10 + n0
Le but est d'écrire les clauses définissant le prédicat suivant :
dm(R,Ds,Ms) : R est une retenue (0<=R<=1), la division entière par 2 de la valeur entière de la liste Ds a pour quotient la valeur entière de la liste Ms et pour reste 0, ou encore : v([R|Ds])=2*v(Ms).
=> si vous pouviez m'aider pour ça ... merci beaucoup car là je sèche ! :(
=> j'ai un peu de mal à comprendre les listes ... comment ça marche.
Merci.
Re: Double des entiers en PROLOG
Citation:
Envoyé par mdswiuf
dm(R,Ds,Ms) : R est une retenue (0<=R<=1), la division entière par 2 de la valeur entière de la liste Ds a pour quotient la valeur entière de la liste Ms et pour reste 0, ou encore : v([R|Ds])=2*v(Ms).
Salut, déjà il y a une incohérence de définition, car d'après ta déf de v(L), v([R|Ds]) = 2*v(Ms) ne correspond pas à la clause telle que tu la définis en français. En effet, v([R|Ds]) vaut R*10^k+v(Ds) où k est la taille de Ds, je pense qu'il faut plutôt formellement considérer "v([Ds|R])" où R est à la fin de la liste, ou bien tu t'es trompé dans ta définition de v ?
De plus si R=1, et dm(R, Ds, Ms) alors v(Ds)+1 = 2 * v(Ms) ce qui n'est pas vraiment une division euclidienne de v(Ds) par 2 ! Est ce qu'il faut prendre 0>=R>=-1 ou est-ce que j'ai rien compris au problème ?
Si tu as défini v à l'envers en tt cas, et avec R le vrai reste de la div euclidienne, ca doit faire qque chose du genre
Code:
1 2 3 4 5 6 7 8
|
/* définit v */
v([],0).
v([X|Tail],Z) :- v(Tail,Y), X <= 9, X >= 0, Z=X+10*Y.
/* définit dm */
dm(0,L,M) :- v(L,X), v(M,Z), X=2*Z.
dm(1,L,M) :- v(L,X), v(M,Z), X=2*Z+1. |
et ce sans aucune garantie, surtout aux bords, car il est bien trop tôt encore pr moi :)
et pour les listes qu'est ce que tu ne comprends pas exactement ?