在 Prolog 中构建一个以 2 为底的指数计算器

Building a base 2 exponent calculator in Prolog

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 根本无法从第二种情况中推断出答案。

你有一个连词。在 Prolog 中,连词 a, b 表示:

Evaluate a, and if it succeeds, evaluate b.

您正在尝试做其他事情,也许:

Try a, and if it doesn't succeed, try 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? */
    ).

请注意,即使 Expr 是一个表达式而不是数字,X is Expr 仍然有效。如果你想允许这样做,那么你可能需要先尝试 eval(Expr) 并捕获错误或类似的东西。