14

我最近重新发现了 Roman Maeder 的一个小程序包,它告诉 Mathematica 自动将算术和类似函数应用于表达式,例如 x == y。链接到 Maeder 的包。

首先,为了演示,这是 Maeder 给出的一个例子:

In[1]:= Needs["EqualThread`"]

现在继续使用线程行为来“手动”求解 x 的以下方程:

In[7]:= a == b Log[2 x]
In[8]:= %/b
Out[8]:= a/b == Log[2 x]

现在取幂:

In[9]:= Exp[%]
Out[9]= E^(a/b) == 2 x

并除以 2:

In[10]:= %/2
Out[10]= (E^(a/b))/2 == x

问:从设计的角度来看,有人能解释一下为什么 Mathematica 会默认设置为这种行为吗?自动线程似乎是 Mathematica 初学者所期望的行为类型——至少对我而言——也许有人可以提供一两个会导致整个系统出现问题的示例。(并随时指出任何数学无知......)

4

2 回答 2

11

考虑算术运算时似乎很自然。但情况并非总是如此。

当我写

Boole[a==b]  

我不想

Boole[a] == Boole[b]  

这就是 Maeder 的软件包所做的。

编辑

在下面回答您的评论:

我注意到 Boole[] 是在 v.5.2 中添加的,而 Maeder 的包是为 v.3 编写的。我想我的问题的核心仍然围绕着“设计”问题。我的意思是,如何解决您指出的问题?对我来说,最清晰的方法是声明你正在使用的变量,不是吗?- 令我困惑的是,您通常只能通过假设(全局或作为简化等的选项)来做到这一点。还有人认为拥有一整套数字属性会更自然吗?(在这方面,Constant Attribute 是个逗比)

我的回答绝不是对 Maeder 包的批评,这很好,但声明它不应该成为Mma 中处理Equal[ ]的主流方式。

Equal[ ] 是一个函数,刚开始不是特别容易掌握:

  • 如果 lhs 和 rhs 相同,则返回 True
  • 如果通过数字或其他原始数据(如字符串)之间的比较确定 lhs 和 rhs 不相等,则返回 False。
  • 当 lhs 或 rhs 包含诸如 Indeterminate 和 Overflow 之类的对象时,仍然不求值。
  • 用于表示符号方程,可以使用 Solve 等函数进行操作。

我理解 Maeder 软件包的意图与您的完全一致,是赋予表达式lhs == rhs与人类在做数学时使用的相同含义和操作规则。

在数学中,等式是等价关系,在集合中施加偏序,等式是断言表达式通过这种特定关系相关联。

将这些差异与其他 Mma“功能”进行比较。Sin[x]在 Mma 中,在通常的数学中也是一样的(嗯,几乎),对于大多数 Mma 野兽来说也是如此。然而,有一些 Mma 结构与数学概念并不完全同构:Equal、SameQ、Equivalent 等。它们是从数学世界到编程世界的桥梁。它们不是严格的数学概念,而是修改了编程概念来容纳它们。

对不起,如果我在哲学方面有点。

于 2011-04-18T11:21:47.947 回答
8

我想这部分是因为这种行为不能扩展到不平等。还因为在评估平等时,行为应该是有意义的:

会好的:

In[85]:= Thread[Power[a == b, 2], Equal]

Out[85]= a^2 == b^2

In[86]:= Thread[Power[a == b, c == d], Equal]

Out[86]= a^c == b^d

但:

In[87]:= Thread[Power[a == b, c == d] /. {c -> 2, d -> 2}, Equal]

Out[87]= a^True == b^True
于 2011-04-18T11:41:19.363 回答