Prolog枚举和测试,会递归工作吗?

时间:2013-12-12 16:15:55

标签: prolog

NM为正数时,我必须制作一个带有2个数"yes"N的谓词,并输出M是两个数字ABA+B = MA*B = N

已编辑的代码:

例如M = 18N = 45

A = 0B = 18M = 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).

我不知道如何枚举AB变量。任何帮助将不胜感激。

2 个答案:

答案 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)
  .