Prolog可逆算术

时间:2013-11-18 07:28:09

标签: math prolog

prolog有什么方法可以提问4 is 2^X之类的问题,然后回到X=2?我尝试使用====:=都没有成功(只获得falsearguments not sufficiently instantiated)。

4 个答案:

答案 0 :(得分:6)

使用SWI-Prolog和库(clpfd),您可以提出类似的问题。

 ?- [library(clpfd)].
%  library(apply_macros) compiled into apply_macros 0,00 sec, 39 clauses
%  library(assoc) compiled into assoc 0,03 sec, 143 clauses
% library(clpfd) compiled into clpfd 0,11 sec, 1,456 clauses
true.

 ?- 4 #= 2 * X.
X = 2.

答案 1 :(得分:2)

您可以检查变量的实例化状态

% E is X^Y
% here are accepted patterns
%
% exp(+,+,-)
% exp(-,+,+)
% exp(+,-,+)
%
exp(X,Y,E) :-
     var(E)
  -> E is X^Y % note: will throw an error if either X or Y are not bound to number
  ;  var(X)
  -> compute_base_of_exp_here(Y,E,X) % note: as above, with E in place of X
  ;  var(Y)
  -> (   X =:= e % we are lucky, only natural logarithms are available as ISO builtin
      -> Y is log(X)
      ;  X =:= 2 % again, we could be lucky, log2 can be rather easy to compute...
      -> compute_log2_here(E,Y)
      ;  compute_some_complex_math_here(X,E,Y)
     )
   ; E is X^Y . % no vars? 

但如果没有合适的内置设备,这将是一条相当困难的路线......

答案 2 :(得分:1)

因为你之前似乎问了同样的问题,简短的回答:

不,你不能这样问这个问题。

你必须自己实现这一点。提到的library(clpfd)几乎可以满足您的需求。至少,您可以尝试查看实现的灵感。

答案 3 :(得分:1)

您可以使用between/3生成整数:

?- between(1,1000,Y), X is 2 ^ Y, X == 4.
Y = 2,
X = 4 ;
false.

?- between(1,1000,Y), X is 2 ^ Y, X == 32.
Y = 5,
X = 32 ;
false.

您还可以使用inf作为between/3的第二个参数,但没有一些限制条件会导致这些查询在给出第一个答案后循环。 (numlist/3,是另一种选择,如果您发现使用数字列表更有意义,而不是每次回溯时生成新数字。)

为此编写通用谓词可能看起来像

within_range(Low-High, X=Operation) :-
    between(Low, High, V1),
    between(Low, High, V2),
    Operation =.. [_, V1, V2],
    Y is Operation,
    Y = X.

当然,这只适用于2个位置的操作而没有相当大的调整。一些示例查询:

?- within_range(1-100, 8=X*Y).
X = 1,
Y = 8 ;
X = 2,
Y = 4 ;
X = 4,
Y = 2 ;
X = 8,
Y = 1 ;
false.

?- within_range(1-100, 8=14-X).
X = 6 ;
false.