为何Wolfram Mathematica 14.0中Divide优先级高于Times?
现象背景
输入a*b/c时,Mathematica会优先计算b/c,再执行a*(b/c)。通过FullForm@Hold[a*b/c]可得到内部结构:Hold[Times[a,Times[b,Power[c,-1]]]]。
在Mathematica 14.0中,用未公开的内置函数Precedence检测到:
- Divide优先级为470.,高于Times的400.
- Plus与Subtract优先级均为310.
这和多数编程语言中*与/优先级相同的情况不同,以下针对两个疑问逐一解答:
1. 为什么Divide优先级高于Times?
Mathematica的设计更贴合数学符号的传统书写习惯。手写数学表达式时,a*b/c默认的理解就是a*(b/c)——虽然两种分组在数值计算上等价,但从符号表达式的结构来看,让除法拥有更高优先级,能让表达式的内部结构更贴近手写时的直观分组逻辑。
另外,Mathematica内部会把Divide转换为「乘以倒数」的形式(即Times[b, Power[c, -1]]),这种设计下给Divide更高优先级,能避免不必要的括号嵌套,让符号表达式的化简、代数处理更高效。比如在合并分式项、符号约分的场景中,这种优先级设定能更自然地匹配代数运算的常规流程。
2. 为什么Plus与Subtract优先级相同?
在Mathematica的内部实现里,Subtract并不是独立的二元运算,而是「加上负数」的语法糖。用FullForm@Hold[a - b]可以验证,其内部结构是Hold[Plus[a, Times[-1, b]]]。
既然Subtract本质是Plus的变体,让两者优先级相同能保证表达式解析逻辑的一致性。比如a + b - c会被解析为Plus[a, b, Times[-1, c]],完全符合数学中加减同级、从左到右运算的传统规则;如果让Subtract优先级更高,反而会破坏这种直观的运算逻辑,导致表达式解析结果和数学直觉相悖。
内容的提问来源于stack exchange,提问作者cppHusky

