我在Tanimoto的使用Common Lisp的人工智能元素中找到了这个:
; sample formula:
;
; d 2
; -- x + 2x
; dx
; represented by f0 as follows:
(setf f0 '(d (+ (exp x 2) (* 2 x)) x))
Run Code Online (Sandbox Code Playgroud)
这难道不该是expt不是exp?这个程序,LEIBNIZ.lispexp在我认为它应该是的许多地方使用expt.我错过了什么?这只是历史问题吗?或者这是一个错误?
expt和exp的行为在HyperSpec条目EXP,EXPT中描述. (exp n)返回e n,而(expt xy)返回x y.这符合您的理解.
exp和expt执行取幂.
exp返回e上升到幂数,其中e是自然对数的基数.exp没有分支切割.
expt返回基数增加到功率数.如果base-number是有理数且power-number是整数,则计算是精确的,结果将是rational类型; 否则可能会产生浮点近似.对于整数幂的复数有理,计算必须精确,结果是类型(或理性(复合理性)).
Tanimoto也知道这一点.在词汇表中,在第519页(第一版)中,有Common Lisp的exp和expt的描述.然而,这里,这些符号以不同的方式使用.Tanimoto正在开发一个符号代数系统,并使用符号exp表示指数表达式.在线
(setf f0 '(d (+ (exp x 2) (* 2 x)) x))
Run Code Online (Sandbox Code Playgroud)
f0的值只是列表 (d(+(exp x 2)(*2 x))x)).这不是代码被执行.关键是它是一个代数表达式.它只是一个符号和数字的嵌套列表. d根本不是Common Lisp中定义的函数.后来,在第99页(第一版),Tanimoto定义了一些符号区分规则:
(setq exp0-rule '(
simplify
(exp (? e1) 0)
1
exp0-rule
) )
Run Code Online (Sandbox Code Playgroud)
(setq exp1-rule '(
simplify
(exp (? e1) 1)
e1
exp1-rule
) )
Run Code Online (Sandbox Code Playgroud)
这些基于第96页所述的数学规则,其中:
EXP0-RULE:x 0 = 1
EXP1-RULE:x 1 = x