在Prolog中构建一个基数2指数计算器

时间:2016-04-25 13:28:46

标签: prolog logarithm

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

1 个答案:

答案 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)并抓住错误或其他内容。