SEND + MORE = MONEY est un casse-tête classique: les variables S, E, N, D, M, O, R, Y représentent des chiffres entre 0 et 9, et le but est de leur trouver des valeurs de telle manière que l'opération suivante soit correcte:
S | E | N | D | |
+ | M | O | R | E |
M | O | N | E | Y |
De plus, toutes les variables doivent avoir des valeurs différentes, et tous les nombres doivent être plausibles (ce qui implique que M > 0 and S > 0).
Comme dans le casse-tête précédent, nous allons utiliser la puissance de recherche de Prolog pour écrire une base de règles qui résout ce problème.
On reprend le prédicat select qui avait
été défini dans le casse-tête
précédent:
select(X,Vals,Restes) :- ...
On définit un prédicat affecter qui permet d'assigner
à une liste de variables une liste de valeurs:
affecter(Vars,Vals) :- ...
On définit le coeur du problème: que doivent
vérifier les variables S,
E, N, D, M, O, R, Y
pour qu'elles constituent une solution. Le prédicat somme
exprime cela.
somme(S,E,N,D,M,O,R,Y) :- ...
Il ne reste qu'à définir le prédicat solution
qui exprime ce qu'est une solution, à partir des
éléments précédents:
solution([S,E,N,D],[M,O,R,E],[M,O,N,E,Y]) :- ...
On peut ensuite se servir des retenues, qui on l'avantage de ne pouvoir valoir que 0 ou 1, pour diminuer la combinatoire de recherche.
DONALD + GERALD = ROBERT
FORTY + TEN + TEN = SIXTY
ALPHABET + LETTERS = SCRABBLE
Un corrigé sommaire est proposé: ne le regardez pas tout de suite!