exp是一种旧形式的expt吗?

时间:2015-10-19 19:15:32

标签: common-lisp

我在Tanimoto的使用Common Lisp的人工智能元素中找到了这个:

; sample formula:
;
;  d     2
;  --   x  + 2x
;  dx

; represented by f0 as follows:
(setf  f0 '(d (+ (exp x 2) (* 2 x)) x))

不应该是expt而不是exp吗?此计划LEIBNIZ.lisp在许多我认为应该exp的地方使用expt。我错过了什么?这只是历史问题吗?或者这是一个错误吗?

1 个答案:

答案 0 :(得分:7)

expt exp 的行为在HyperSpec条目EXPEXPT中有所描述。 (exp n)返回 e n ,而(expt xy)返回x y 。这符合你的理解。

  

exp和expt执行取幂。

     

exp返回e提升到的电源号,其中e是电源号的基数   自然对数。 exp没有分支。

     

expt返回基数增加到功率数。如果   base-number是理性的,power-number是一个整数   计算是准确的,结果将是理性的;   否则可能会产生浮点近似。对于a的经验   复数理性为整数幂,计算必须精确   结果是类型(或理性(复杂理性))。

Tanimoto也知道这一点。在词汇表中,在第519页(第一版)中,有对Common Lisp的 exp expt 的描述。然而,这里,这些符号以不同的方式使用。 Tanimoto正在开发一种符号代数系统,并使用符号 exp 来表示指数表达式。在行

(setf  f0 '(d (+ (exp x 2) (* 2 x)) x))

f0 的值只是列表 (d(+(exp x 2)(* 2 x))x)) 。这不是代码被执行。关键是它是一个代数表达式。它只是一个符号和数字的嵌套列表。 d 根本不是Common Lisp中定义的函数。后来,在第99页(第一版),Tanimoto定义了一些符号化的区分规则:

(setq exp0-rule '(
  simplify
  (exp (? e1) 0)
  1
  exp0-rule
  ) )

(setq exp1-rule '(
  simplify
  (exp (? e1) 1)
  e1
  exp1-rule
  ) )

这些是基于第96页所述的数学规则,其中:

EXP0-RULE: x 0 = 1
EXP1-RULE: x 1 = x