log2(I,E):-
I is 2.0**E,
E is log(I)/log(2).
我正在尝试使用Prolog计算功率2被提升到'I'或2提升到'E'功率等于'I'。我对这种语言非常陌生,根据我的理解,它根据所提供的信息推断出答案。
Queries:
log2(I,3).
-->false.
log2(I,3.0).
-->I = 8.0.
log2(8,E).
-->ERROR: is/2: Arguments are not sufficiently instantiated
log2(8,E).
-->ERROR: is/2: Arguments are not sufficiently instantiated
我很困惑,为什么我必须在第一种情况下提供一个浮动来获得正确答案,以及为什么Prolog无法从第二种情况推断答案。
答案 0 :(得分:3)
你在那里有一个结合。在Prolog中,结合a, b
表示:
评估
a
,如果成功,请评估b
。
你正在尝试做别的事,也许:
尝试
a
,如果不成功,请尝试b
。
您应该考虑的第一件事是使用library(clpr)
,如果它在您的Prolog实现中可用。
使用SWI-Prolog:
?- use_module(library(clpr)).
true.
?- {I = 2^3}.
I = 8.0 ;
false.
?- {8 = 2^E}.
E = 3.0 ;
false.
你真的没有问题了。
如果这不是一个选项,你需要做以下几点:
log2(I, E) :-
( number(I)
-> E is /* expression here, now that I is a number */
; number(E)
-> I is /* expression here, now that E is a number */
; /* what do you do if both are variables? */
).
请注意,即使X is Expr
是表达式而非数字,Expr
也会有效。如果您想允许这样做,那么您可能需要首先尝试eval(Expr)
并抓住错误或其他内容。