<div class="notebook"> <div class="nb-cell markdown" name="md1"> See https://swi-prolog.discourse.group/t/fun-equation-that-evaluates-to-n/ </div> <div class="nb-cell program" name="p1"> :- table equation/4. equation_matching_target(List, Target, Eq) :- permutation(List, RList), between(1, 10, MaxDepth), equation(MaxDepth, RList, Eq, _), catch(Target =:= Eq, error(_,_), fail). equation(0, _, _, _) :- !, fail. equation(_, [H | T], H, T). equation(N, In, Eq, Out) :- succ(NN, N), member(Op, [ '+', '-', '*', '/']), Eq =.. [Op, A, B], equation(NN, In, A, Mid), equation(NN, Mid, B, Out). </div> <div class="nb-cell query" data-tabled="true" name="q1"> List = [2.1,8.3,2.5,0.4], Target = 13.3, equation_matching_target(List, Target, Eq) </div> <div class="nb-cell markdown" name="md2"> # Trying a smarter generator </div> <div class="nb-cell program" name="p2"> list_fomula(List, Formula) :- select2(A1, A2, List, List1), formula(A1, A2, F1), ( Formula = F1 ; list_fomula([F1|List1], Formula) ). select2(A1, A2, [A1|L1], Rest) :- select(A2, L1, Rest). select2(A1, A2, [H|L1], [H|Rest]) :- select2(A1, A2, L1, Rest). formula(A1, A2, A1+A2). formula(A1, A2, A1-A2). formula(A1, A2, A2-A1). formula(A1, A2, A1*A2). formula(A1, A2, A1/A2) :- A2 =\= 0. formula(A1, A2, A2/A1) :- A1 =\= 0. </div> <div class="nb-cell query" data-tabled="true" name="q2"> List = [2.1,8.3,2.5,0.4], Target = 13.3, list_fomula(List, Formula), Formula =:= Target. </div> <div class="nb-cell query" data-tabled="true" name="q3"> aggregate_all(count, (List = [2.1,8.3,2.5,0.4], Target = 13.3, list_fomula(List, Formula), Formula =:= Target), Count). </div> </div>