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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
|
% Auteur: Thierry Bertrand
% Date: 02/06/2011
%
%
% lancement : resoud([a,b,c,d,e,f], But).
% exemple: resoud([3,75,2,4,1,1],888).
% [[75,-,2,=,73],[1,+,73,=,74],[3,*,74,=,222],[4,*,222,=,888]]
% NB: une autre solution: 6 * 100 = 600,
% 8 * 10 = 80,
% 600 + 80 = 680,
% 680 + 3 = 683
%
/*
6 ?- resoud([3,100,8,8,10,6],683).
[[6,+,10,=,16],[100,-,16,=,84],[8,*,84,=,672],[3,+,672,=,675],[8,+,675,=,683]]
true.
7 ?- resoud([3,100,8,5,10,6],683).
[[100,+,3,=,103],[10,+,103,=,113],[6,*,113,=,678],[5,+,678,=,683]]
true.
8 ?- resoud([3,100,8,1,10,6],683).
[[10,-,1,=,9],[6,+,9,=,15],[100,-,15,=,85],[8,*,85,=,680],[3,+,680,=,683]]
true.
*/
:- dynamic(soluce/2). % pour stocker la meilleure : total, liste
meilleure(But, Solution, Detail) :- soluce(S, _),
Diff1 is abs(S - But),
Diff2 is abs(Solution - But),
meilleure(Diff1, Diff2, Solution, Detail).
meilleure(Ref, New, Sol, Detail) :- New < Ref,
retractall(soluce(_,_)),
assert(soluce(Sol, Detail)).
meilleure(_, _, _, _).
renardeau([Total | _], But, Z, Z) :- Total = But, !.
renardeau(L, But, Z, R) :- testPlus(L, But, Z, R), !.
renardeau(L, But, Z, R) :- testMoins(L, But, Z, R), !.
renardeau(L, But, Z, R) :- testMult(L, But, Z, R), !.
renardeau(L, But, Z, R) :- testDiv(L, But, Z, R), !.
renardeau(_,_,_,_,_) :- !, fail .
testPlus([A, B | Qs], But, Z, Res) :- Calcul is A + B,
meilleure(But, Calcul, [[B , '+' , A , '=' , Calcul] | Z]),
renardeau([Calcul | Qs ] , But, [[B , '+' , A , '=' , Calcul] | Z], Res).
testMoins([A, B | Qs ], But, Z, Res) :- B > A,
Calcul is B - A,
meilleure(But, Calcul, [[B , '-' , A , '=' , Calcul] | Z]),
renardeau([ Calcul | Qs ] , But, [[ B , '-' , A, '=', Calcul] | Z], Res).
testMoins([A, B | Qs ], But, Z, Res) :- A > B,
Calcul is A - B,
meilleure(But, Calcul, [[A , '-' , B , '=' , Calcul] | Z]),
renardeau([ Calcul | Qs ] , But, [[ A , '-' , B, '=', Calcul] | Z], Res).
testMult([A, B | Qs], But, Z, Res) :- Calcul is B * A,
meilleure(But, Calcul, [[B , '*' , A , '=' , Calcul] | Z]),
renardeau([Calcul | Qs ] , But, [[B , '*' , A, '=', Calcul] | Z], Res).
testDiv([A, B | Qs ], But, Z, Res) :- A \= 0, B >= A, Calcul is B / A,
integer(Calcul),
meilleure(But, Calcul, [[B , '/' , A , '=' , Calcul] | Z]),
renardeau([ Calcul | Qs ] , But, [[B , '/' , A, '=', Calcul] | Z], Res).
testDiv([A, B | Qs ], But, Z, Res) :- B \= 0, A >= B, Calcul is A / B,
integer(Calcul),
meilleure(But, Calcul, [[A , '/' , B , '=' , Calcul] | Z]),
renardeau([ Calcul | Qs ] , But, [[A , '/' , B, '=', Calcul] | Z], Res).
resoud(L, But) :- retractall(soluce(_,_)),
assert(soluce(9999, [])),
select(A, L, L1),
select(B, L1, L2),
select(C, L2, L3),
select(D, L3, L4),
select(E, L4, L5),
select(F, L5, _),
renardeau([A, B, C, D, E, F, 0], But, [], Tempo),!,
reverse(Tempo, Resultat),
writeln('le compte est bon ...'),
edite(Resultat).
resoud(_ , _) :- soluce(Total, Sol),
write('meilleur total possible:'),
writeln(Total),
reverse(Sol, Resultat),
edite(Resultat).
edite([]).
edite([Calcul | Reste]) :- editeOp(Calcul), edite(Reste).
editeOp([ A , Operateur , B , _, Resultat]) :- write(A),
write(' '),
write(Operateur),
write(' '),
write(B),
write(' = '),
writeln(Resultat). |
Partager