exp是一种旧形式的expt吗?

147*_*7pm 1 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))
Run Code Online (Sandbox Code Playgroud)

这难道不该是expt不是exp?这个程序,LEIBNIZ.lispexp在我认为它应该是的许多地方使用expt.我错过了什么?这只是历史问题吗?或者这是一个错误?

Jos*_*lor 7

exptexp的行为在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的expexpt的描述.然而,这里,这些符号以不同的方式使用.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