prolog有什么方法可以提问4 is 2^X
之类的问题,然后回到X=2
?我尝试使用=
,==
,=:=
都没有成功(只获得false
或arguments not sufficiently instantiated
)。
答案 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.