是否有Mathematica包用于提供证明/推导?

时间:2009-08-28 03:44:42

标签: wolfram-mathematica

当我在纸上写出证据或推稿时,我经常会在我从一步到下一步时发出符号错误或删除条款。我想用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

有人能指出一个支持这种操作的软件包吗?

修改

感谢您的投入,但不是我想要的。符号操作并不是真正的问题。我真的在寻找能够明确推导出每个步骤的代数或数学证明的东西。我的目标是教学。

2 个答案:

答案 0 :(得分:3)

Mathematica还提供了许多用于操作代数的高级函数。其中包括ExpandApartTogether以及Cancel,但还有更多。

此外,对于将等同变换应用于等式两边的具体示例(即头部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函数的推广,它利用了Map处理任何头部表达式而不只是头部List的事实。如果您正在尝试与不熟悉Mathematica的受众进行交流,使用这些名称可以帮助您更清晰地沟通。相反,如果你想使用Ira Baxter建议的替换规则,写出Replace或ReplaceAll而不是使用/.语法糖可能会有所帮助。

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

如果您认为在输入中使用实际等式(而不是变量名expression)更清楚,并且您正在使用笔记本界面,请使用您的突出显示单词expression鼠标,调出上下文菜单,然后选择“就地评估”。

笔记本界面也是一个非常愉快的“文字编程”环境,因此您也可以解释任何不会立即明显的步骤。我相信无论媒介如何,在编写数学证明时这都是一种很好的做法。

答案 1 :(得分:2)

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

f ./ I 

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

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