【发布时间】:2014-11-09 20:10:49
【问题描述】:
我有以下功能。
当我用final_filter([(2, 2)], R) 调用它时,它会打印很多“2 2”对。当我评论get_all_sums(S, _) 时,它工作正常,但是如果我单独测试get_all_sums(4, R)。我的工作也很好,可能是什么问题?
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)).
【问题讨论】:
-
你期待什么?
get_all_sums(S, _).产生实例化错误,get_all_sums(4, R), false不会终止 -
我试过了 %d:/newl 编译了 0,00 秒,14 个子句 1 ?- get_all_sums(4, R)。 R = [ (2, 2)] 。 2 ?- get_all_sums(4, _)。真的。
标签: prolog failure-slice