A очень базовое решение для вашей проблемы, используя between/3
из swi prolog, без значительных изменений вашей программы:
sum(A,B,M) :- M is A+B.
prod(A,B,N) :- N is A*B.
q(M,N) :-
between(0,1000,A),
between(0,1000,B),
sum(A,B,M),
prod(A,B,N).
В этом случае все числа от 0
до 1000
считаются для A
и B
. Тем не менее, есть некоторые недостатки. Например, можно поменять значения для A
и B
(q(18,45)
успешно для A = 3
и B = 15
и A = 15
и B = 3
). Для устранения этой избыточности вы можете наложить B < A
. Для дальнейшего улучшения алгоритма вы можете установить диапазон для A и B на основе значения суммы и произведения. Конечно, и A
, и B
должны быть меньше значения M
в вашем коде. Как:
q(M,N) :-
between(0,M,A),
between(0,A,B),
M is A+B,
N is A*B.
Вы можете добавить дополнительные ограничения для улучшения характеристик, например, учитывая случаи, когда продукт равен 0 и т. Д. *
Вы также можете использовать clpfd library для решения этой проблемы.