从Mathematica函数返回相等

时间:2011-01-31 14:22:34

标签: wolfram-mathematica equality

我有一个函数返回我想要打印的等号, 例如,x == y,或2x + 5 == 10。 这些通常对mathematica没有意义,它不能简化它。

然而,有时双方都是平等的,但我希望能够以未评估的形式打印相等:也就是说,我希望Mathematica打印x == x,而不是True。

一个非常简单的例子:

Print[printableEqual[x,y]]

应该打印x == y,而

Print[printableEqual[x,x]]

应该打印x == x

编辑: 原因是我在图表之间有关系。我想返回像

这样的内容
G1 == t*G2 + s*G3

其中t,s是整数,Gi是Mathematica中的Graphics对象。 只是返回这个很好,(因为Mathematica不能简化这些事情)除了G1 == G1这将是真的。

麻烦在于使用Defer或HoldForm提供

Private`lhs$714 == Private`rhs$714

作为输出,也就是说,我的包中的私有变量不被评估为我的图形。

4 个答案:

答案 0 :(得分:4)

您可以使用Defer执行此操作:

In[5]:= printableEqual[x_, y_] := Defer[x == y];
In[6]:= printableEqual[1, 2]
Out[6]= 1 == 2

答案 1 :(得分:3)

另一个技巧是使用Unevaluated

In[1] := Print[Unevaluated[1 == 1]]
1==1

答案 2 :(得分:2)

通常会使用HoldForm来做这类事情。 HoldForm是一个与Hold类似的头,因为它不会评估其内容,但是当它作为输出打印时它不会显示,如下所示:

In[1]:= HoldForm[x == 3]
Out[1]= x == 3

In[2]:= HoldForm[x == x]
Out[2]= x == x

Hold一样,您可以使用HoldForm或函数参数替换将内容插入With,如下所示:

In[3]:= PrintableEqual[x_, y_] := HoldForm[x == y]

In[4]:= PrintableEqual[x, x]
Out[4]= x == x

但是,这意味着在替换之前评估参数,如下所示:

In[5]:= PrintableEqual[x + x, 2 x]
Out[5]= 2 x == 2x

如果您不希望发生这种情况,可以使用SetAttributesHoldAll

In[6]:= SetAttributes[PrintableEqual, {HoldAll}]

In[7]:= PrintableEqual[x + x, 2 x]
Out[7]= x + x == 2 x

请注意,HoldForm始终存在,它不会以输出形式显示:

In[8]:= PrintableEqual[x, x] // InputForm
Out[8]= HoldForm[x == x]

如果您想评估内容,请使用ReleaseHold

In[9]:= ReleaseHold@PrintableEqual[x, x]
Out[9]= True

答案 3 :(得分:0)

你可以做的另一件事是使用Grid[]来统一你的所有平等 - 增加的优势是因为你实际上并没有使用Equal[]创建表达式,所以你不必阻止他们的评价。

In[1]:= Grid[Table[{LHS[i],"\[LongEqual]",RHS[i]},{i,2}],
             Alignment -> {Right,Center,Left}]
Out[1]= LHS[1] == RHS[1]
        LHS[2] == RHS[2]

在类似情况下,您可以使用

手动排版
printableEqual[LHS_, RHS_] := Row[{LHS, " \[LongEqual] ", RHS}]

或更一般地

printableEqual[LHS_, mid___, RHS_] := Row[Riffle[{LHS, mid, RHS}, " \[LongEqual] "]]

顺便说一句,上面定义的printableEqual[]的输出可以使用ToExpression[ToString[#]]&或类似的东西转换回真实的表达式

toRealEqual[Row[lst_List]] := Equal@@lst[[1;;-1;;2]] /; OddQ[Length[lst]] && Union[lst[[2;;-2;;2]]] == {" \[LongEqual] "}