I have the below functions.
When I call it with final_filter([(2, 2)], R)
, it prints a lot of "2 2" pairs. When I comment get_all_sums(S, _)
it works fine, however if I test separately get_all_sums(4, R)
. I works also fine, what could be the problem?
get_all_sums_R(NR, IT, []):- IT > NR - 2.
get_all_sums_R(NR, IT, R):-
A is IT,
B is NR-IT,
A >= B,
NEXT_IT is IT + 1,
get_all_sums_R(NR, NEXT_IT, R_NEXT),
append([(A, B)], R_NEXT, R).
get_all_sums_R(NR, IT, R):-
A is IT,
B is NR-IT,
A < B,
NEXT_IT is IT + 1,
get_all_sums_R(NR, NEXT_IT, R).
get_all_sums(NR, R):-get_all_sums_R(NR, 2, R).
get_all_divisors(X, IT, []):-IT > X/2.
get_all_divisors(X, IT, R):-
IT =< X/2,
TMP_RES is mod(X, IT),
TMP_RES =:= 0,
NEXT_IT is IT + 1,
get_all_divisors(X, NEXT_IT, R_NEXT),
append([IT], R_NEXT, R).
get_all_divisors(X, IT, R):-
IT =< X/2,
NEXT_IT is IT + 1,
get_all_divisors(X, NEXT_IT, R).
get_all_products_R([], _, []).
get_all_products_R([H|L], NR, R):-
A is H,
B is NR/H,
A >= B,
get_all_products_R(L, NR, NEXT_R),
append([(A, B)], NEXT_R, R).
get_all_products_R([H|L], NR, R):-
A is H,
B is NR/H,
A < B,
get_all_products_R(L, NR, R).
get_all_products(NR, R):-
get_all_divisors(NR, 2, R_LEFT),
get_all_products_R(R_LEFT, NR, R).
single_element([_]).
final_filter([(A, B)|_], _):-
write(A),
P is A*B,
S is A+B,
get_all_products(P, PRODUCTS),
get_all_sums(S, _),
write(A),write(' '), write(B), write('\n'),
not(single_element(PRODUCTS)).