作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一些应该是非交换的符号,但我不想在构造方程时记住哪些表达式具有这种行为。
我曾想过使用 MakeExpression 对原始框进行操作,并在适当的时候自动将乘法提升为非交换乘法(例如,当某些符号是非交换对象时)。
我想知道是否有人对这种配置有任何经验。
这是我到目前为止所得到的:
(* Detect whether a set of row boxes represents a multiplication *)
Clear[isRowBoxMultiply];
isRowBoxMultiply[x_RowBox] := (Print["rowbox: ", x];
Head[ToExpression[x]] === Times)
isRowBoxMultiply[x___] := (Print["non-rowbox: ", x]; False)
(* Hook into the expression maker, so that we can capture any \
expression of the form F[x___], to see how it is composed of boxes, \
and return true or false on that basis *)
MakeExpression[
RowBox[List["F", "[", x___, "]"]], _] := (HoldComplete[
isRowBoxMultiply[x]])
(* Test a number of expressions to see whether they are automatically \
detected as multiplies or not. *)
F[a]
F[a b]
F[a*b]
F[a - b]
F[3 x]
F[x^2]
F[e f*g ** h*i j]
Clear[MakeExpression]
During evaluation of In[561]:= non-rowbox: a
Out[565]= False
During evaluation of In[561]:= rowbox: RowBox[{a,b}]
Out[566]= True
During evaluation of In[561]:= rowbox: RowBox[{a,*,b}]
Out[567]= True
During evaluation of In[561]:= rowbox: RowBox[{a,-,b}]
Out[568]= False
During evaluation of In[561]:= rowbox: RowBox[{3,x}]
Out[569]= True
During evaluation of In[561]:= non-rowbox: SuperscriptBox[x,2]
Out[570]= False
During evaluation of In[561]:= rowbox: RowBox[{e,f,*,RowBox[{g,**,h}],*,i,j}]
Out[571]= True
RowBox[{"e","f","*",RowBox[{"g","**","h"}],"*","i","j"}]
,这需要重写为
RowBox[{"e","**","f","**",RowBox[{"g","**","h"}],"**","i","**","j"}]
这似乎是与模式匹配器和规则集有关的重要操作。
最佳答案
这不是对您的问题的最直接回答,但对于许多目的而言,与直接使用盒子一样低级工作可能是一种矫枉过正。这是另一种选择:让 Mathematica 解析器解析您的代码,然后进行更改。这是一种可能性:
ClearAll[withNoncommutativeMultiply];
SetAttributes[withNoncommutativeMultiply, HoldAll];
withNoncommutativeMultiply[code_] :=
Internal`InheritedBlock[{Times},
Unprotect[Times];
Times = NonCommutativeMultiply;
Protect[Times];
code];
Times
动态使用
NonCommutativeMultiply
,并避免了您提到的错综复杂。通过使用
Internal`InheritedBlock
,我对
Times
做了修改局部于内部执行的代码
withNoncommutativeMultiply
.
$Pre
自动应用此功能:
$Pre = withNoncommutativeMultiply;
In[36]:=
F[a]
F[a b]
F[a*b]
F[a-b]
F[3 x]
F[x^2]
F[e f*g**h*i j]
Out[36]= F[a]
Out[37]= F[a**b]
Out[38]= F[a**b]
Out[39]= F[a+(-1)**b]
Out[40]= F[3**x]
Out[41]= F[x^2]
Out[42]= F[e**f**g**h**i**j]
$Pre
以这种方式几乎不合适,因为在您的所有代码中,乘法都将被非交换乘法替换 - 我用它作为说明。您可以对
Times
进行更复杂的重新定义。 ,因此这仅适用于某些符号。
ClearAll[withNoncommutativeMultiplyLex];
SetAttributes[withNoncommutativeMultiplyLex, HoldAll];
withNoncommutativeMultiplyLex[code_] :=
With @@ Append[
Hold[{Times = NonCommutativeMultiply}],
Unevaluated[code]]
Times
的那些实例代码中明确存在的将被替换。同样,这只是原理的说明,您可以根据需要对其进行扩展或专门化。而不是
With
,它在专门化/添加特殊情况的能力方面相当有限,可以使用具有相似语义的替换规则。
关于wolfram-mathematica - Times 和 NonCommutativeMultiply,自动处理差值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8366806/
我的 C 代码有问题。我所做的就是这样: #include int main() { float zahlen[2]; for (int i = 0; i < 2; i++) {
我是一名优秀的程序员,十分优秀!