Un Exemple: SEND + MORE = MONEY

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.

Etape 1:

On reprend le prédicat select qui avait été défini dans le casse-tête précédent:
select(X,Vals,Restes) :- ...

Etape 2:

On définit un prédicat affecter qui permet d'assigner à une liste de variables une liste de valeurs:
affecter(Vars,Vals) :- ...

Etape 3:

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) :- ...

Etape 4:

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]) :- ...

Affiner la recherche de la solution.

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.

Essayer sur d'autres problèmes.

DONALD + GERALD = ROBERT

FORTY + TEN + TEN = SIXTY

ALPHABET + LETTERS = SCRABBLE

Un corrigé sommaire est proposé: ne le regardez pas tout de suite!