%% Folosind doar +, -, *, / si paranteze, %% sa se aranjeze numerele din lista Nums %% a.i. rezultatul evaluarii expresiei sa fie Res. % solve(Nums, Res, Formula) solve(Nums, Res, Formula) :- perm(Nums, Ps), % permuta Nums arrange(Ps, Formula), % plaseaza semne in permutare Res =:= Formula. % verifica rezultatul evaluarii %% permutarile listei de numere % del se poate folosi si pentru a sterge X din L1, % si pentru a insera X pe toate pozitiile in L2 % del(X, L1, L2) del(X, [X|Rest], Rest). del(X, [Y|Rest], [Y|Res]) :- del(X, Rest, Res). % permuta restul listei, % apoi insereaza head-ul in toate pozitiile perm([], []). perm([X|Rest], P) :- perm(Rest, PR), del(X, P, PR). % conc e append fara liste vide conc([X|Xs], [Y|Ys], Res) :- append([X|Xs], [Y|Ys], Res). %% plasarea de semne si paranteze % sparge aleator lista in 2 liste nevide, % care se "aranjeaza" recursiv, % apoi pune +, -, * sau / intre parti arrange([X], X) :- !. arrange(Nums, (F1) + (F2)) :- conc(A, B, Nums), arrange(A, F1), arrange(B, F2). arrange(Nums, (F1) - (F2)) :- conc(A, B, Nums), arrange(A, F1), arrange(B, F2). arrange(Nums, (F1) * (F2)) :- conc(A, B, Nums), arrange(A, F1), arrange(B, F2). arrange(Nums, (F1) / (F2)) :- conc(A, B, Nums), arrange(B, F2), F2 =\= 0, arrange(A, F1).