%              ENIGME DU 21
%
% Il s'agit de trouver 21 en utilisant les 4 chiffres
% 1,5,6 et 7, une seule fois chacun, et les operations +,*,- et /.
% Il n'y a qu'une solution...
%
% Author: Guillaume CABANAC (cabanac CHEZ irit.fr)
% Website : http://g.cabanac.free.fr
% Date: 03/01/2005

% prédicats utilisés par les deux méthodes de calcul
calcule(A,+,B,R) :- R is A+B.
calcule(A,-,B,R) :- R is A-B.
calcule(A,*,B,R) :- R is A*B.
calcule(A,/,B,R) :- B \= 0, R is A/B.

%-------------------------------------------------------------------------------
% 1ere méthode : réduit les chiffres en injectant le résultat d'une opération

% enigme(A,Chiffres,Operateurs,Verbose) prend deux chiffres et un opérateur et
% ajoute le résultat aux Chiffres. Verbose explicite le choix.
enigme(ATrouver,[ATrouver],[cqfd]) :- !.
enigme(ATrouver,Ch,[S|R]) :- select(C1,Ch,Cr),
                             select(C2,Cr,Crr),
                             calcule(C1,O,C2,C1OC2),
                             swritef(S,'%w%w%w=%w', [C1,O,C2,C1OC2]),
                             enigme(ATrouver, [C1OC2|Crr],R).

resoud(R) :- enigme(21,[1,5,6,7],R).
% réponse : R = ["5/7=0.714286", "1-0.714286=0.285714", "6/0.285714=21", cqfd] ;

% time(resoud(R)).