当N
,M
为正数时,我必须制作一个带有2个数"yes"
,N
的谓词,并输出M
是两个数字A
,B
,A+B = M
和A*B = N
。
已编辑的代码:
例如M = 18
,N = 45
:
A = 0
,B = 18
,M = 0+18
(真),N = 0*18
(false)因此必须使用A = 1
& B = 17
再次检查......
numbers(M,N) :-
M>0 ,
N>0 ,
A is 0,
B is M,
numbers(N,M,A,B).
numbers(M,N,A,B) :-
M =:= A+B,
N =:= A*B.
numbers(M,N,A,B) :-
M =:= A+B,
not( N =:= A*B),
A is A+1,
B is B-1,
numbers(M,N,A,B).
我不知道如何枚举A
和B
变量。任何帮助将不胜感激。
答案 0 :(得分:0)
只需添加并乘以检查...请参阅is / 2算术
编辑我的建议有点过分简单,我完全忘记了使用非确定性在Prolog中轻松生成整数范围的提示:
numbers(M,N) :-
between(1,M,A),between(1,N,B), M =:= A+B, N =:= A*B, writeln((A,B)).
?- numbers(18,45).
3,15
true ;
15,3
true ;
false.
答案 1 :(得分:0)
我将其视为一个保理问题:
%
% are M and N magic?
%
magic(M,N) :-
M > 0 ,
N > 0 ,
factor(N,A,B),
M is A+B
.
%
% factor/3: compute the factors of a positive integer
%
factor(N,F1,F2) :-
N > 0 ,
Limit is floor(sqrt(N)) ,
factor(1,Limit,N,F1,F2)
.
factor(F1,Limit,N,F1,F2) :-
F1 =< Limit ,
F2 is N div F1 ,
0 is N mod F1
.
factor(X,Limit,N,F1,F2) :-
X < Limit ,
X1 is X+1 ,
factor(X1,Limit,N,F1,F2)
.