我在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
。我错过了什么?这只是历史问题吗?或者这是一个错误吗?
答案 0 :(得分:7)
expt 和 exp 的行为在HyperSpec条目EXP,EXPT中有所描述。 (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