我最近重新发现了Roman Maeder的一个小包,它告诉Mathematica在x == y等表达式上自动对算术和类似函数进行线程化。 Link to Maeder's package.
首先,为了演示,这是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初学者所期望的行为类型 - 对我来说,至少---也许有人可以提供一两个会导致整个系统出现问题的例子。 (并随意指出任何mathematica无知......)
答案 0 :(得分:11)
在考虑算术运算时似乎很自然。但情况并非总是如此。
写作时
Boole[a==b]
我不想要
Boole[a] == Boole[b]
这就是Maeder的包装。
修改
在下面回答你的评论:
我注意到在第5.2节中添加了Boole [],而Maeder的包是为第3版创作的。我想我的问题的核心仍然围绕着“设计”问题。我的意思是,如何解决你指出的问题?对我来说,最明确的方法是宣布你正在使用的变量,不是吗? - 让我感到困惑的是你通常只能通过假设(全局或作为简化等选项)来实现这一点。其他人认为拥有一整套数字属性会更自然吗? (在这方面,常量属性是一个挑逗)
我的回答绝不是对Maeder的包的批评,这很好,但是声明它不应该是在Mma中对待 Equal [] 的主流方式。
Equal []是一个函数,起初并不是特别容易掌握:
Maeder的包的目的,我理解与你的一致,就是给表达式 lhs == rhs 人类在进行数学运算时使用的相同含义和操作规则。
在数学中,等式是等价关系,在集合中强加偏序,而等式是表达式与这种特定关系相关的断言。
将这些差异与其他Mma“功能”进行比较。 Sin [x] 在Mma中,并且在通常的数学中是相同的(好吧,几乎),并且对于大多数Mma野兽也是如此。然而,有一些Mma构造不能保持与数学概念完全同构:Equal,SameQ,Equivalent等。它们是从数学世界到编程世界的桥梁。它们不是严格的数学概念,而是修改了编程概念来保存它们。
对不起,如果我在哲学方面有所了解。
HTH!
答案 1 :(得分: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