Maxima:在函数中调用 "assume()"

Maxima: Calling "assume()" in a function

定义函数

foo(a, b) := apply('assume, [a < b])$

facts();
  -> []

foo(0, a);
  -> [inconsistent]  /* why? */

foo(b, a);
  -> [b > a]  /* instead [a > b] */

foo(d, c);
  -> [c > d]

assume(0 < a);
  -> [a > 0]

为什么会出现不一致?是否可以在不更改函数变量名称 foo(aa, bb) 的情况下以某种方式解决此问题?它是如何工作的?

问题在于 Maxima 无法区分函数参数符号 ab 与同名的全局变量。目前解决它的唯一方法是给函数参数命名,这些名称被认为是不常用的,例如 a%b%.

我正在为 Maxima 实现词法作用域,这使得局部变量有别于所有其他同名变量。明年某个时候它可能会进入 Maxima 版本,这似乎是合理的。与此同时,您必须解决该问题。

这个问题的另一个方面是函数参数应该只计算一次,而 assume 在某个地方再次计算参数。仔细观察了一下,似乎处理“<”的代码再次求值——这是一个错误,它触发了另一个关于符号不明确的错误。