7

当我在纸上写出证明或推导时,我经常会在从一个步骤到下一步的过程中出现签名错误或放弃条款。我想使用 Mathematica 来避免这些愚蠢的错误。我不想让 Mathematica 解决表达式,我只想用它来执行和显示一系列代数运算。对于一个(微不足道的)示例

In[111]:= MultBothSides[Equal[a_, b_], c_] := Equal[c a, c b];

In[112]:= expression = 2 a == a b

Out[112]= 2 a == a b

In[113]:= MultBothSides[expression, 1/a]

Out[113]= 2 == b

谁能给我指出一个支持这种操作的包?

编辑

感谢您的输入,虽然不是我想要的。符号操作并不是真正的问题。我真的在寻找能够明确推导每一步的代数或数学证明的东西。我在这里的目标是真正的教学。

4

2 回答 2

3

Mathematica 还提供了许多用于处理代数的高级函数。其中包括Expand,ApartTogether, 和Cancel, 尽管还有很多。

此外,对于将相同变换应用于等式两边(即带有 head 的表达式Equal)的具体示例,您可以使用该Thread函数,该函数的工作原理与您的MultBothSides函数一样,但具有更大的通用性。

In[1]:=  expression = 2 a == a b
Out[1]:= 2 a == a b

In[2]:=  Thread[expression /a, Equal]
Out[2]:= 2 == b

In[3]:=  Thread[expression - c, Equal]
Out[3]:= 2 a - c == a b - c

在所提出的任一解决方案中,应该相对容易看出该步骤需要什么。如果你想要一些更明确的东西,你可以编写自己的函数,如下所示:

In[4]:=  ApplyToBothSides[f_, eq_Equal] := Map[f, eq]

In[5]:=  ApplyToBothSides[4 * #&, expression]
Out[5]:= 8 a == 4 a b

它是对您的函数的概括MultBothSides,它利用了适用于任何 head 的表达式的事实Map,而不仅仅是 head List。如果您尝试与不熟悉 Mathematica 的观众交流,使用这些名称可以帮助您更清楚地交流。在相关方面,如果您想使用 Ira Baxter 建议的替换规则,写出 Replace 或 ReplaceAll 而不是使用/.语法糖可能会有所帮助。

In[6]:=  ReplaceAll[expression, a -> (x + y)]
Out[6]:= 2 (x + y) == b (x + y)

如果您认为expression在输入中使用实际方程式而不是变量 name 会更清楚,并且您正在使用笔记本界面,expression请用鼠标突出显示该单词,调出上下文菜单,然后选择“Evaluate in地方”。

笔记本界面也是一个非常愉快的“文学编程”环境,所以你也可以用语言解释任何不是立即显而易见的步骤。我相信在编写数学证明时,无论使用何种媒介,这是一个很好的做法。

于 2009-08-31T14:18:28.273 回答
2

我不认为你需要一个包裹。您要做的是根据推理规则操纵每个公式。在 MMa 中,您可以使用转换对公式的推理规则进行建模。所以,如果你有一个公式f,你可以通过执行来应用推理规则I(我的 MMa 语法是 15 年生锈的)

f ./ I 

生成序列中的下一个公式。

如果公式包含标准代数运算符和项,例如常数和算术运算符,MMa 当然会尝试简化您的公式。您可以通过将公式包含在Hold[...]表单中来防止 MMa 应用其自己的“推理”规则。

于 2009-08-28T05:57:33.577 回答