gpt4 book ai didi

wolfram-mathematica - 所有人的中缀(叶子)

转载 作者:行者123 更新时间:2023-12-04 02:08:18 26 4
gpt4 key购买 nike

Infix[]仅适用于第一级:

Infix[(c a^b)^d]
(*
-> (a^b c) ~Power~ d
*)

由于我想(不要问为什么)将完整表达式切换为中缀表示法,因此我尝试了以下操作:
SetAttributes[toInfx, HoldAll];
toInfx[expr_] := Module[{prfx, infx},
prfx = Level[expr, {0, Infinity}];
infx = Infix /@ prfx /. {Infix[a_Symbol] -> a, Infix[a_?NumericQ] -> a};
Fold[ReplaceAll[#1, #2] &, expr, Reverse@Thread[Rule[prfx, infx]]]
]
k = toInfx[(c a^b)^d]
(*
-> (c ~Times~ (a ~Power~ b)) ~Power~ d
*)

但这有两个明显的问题,因为
  • (c a^b)^d == a~Power~b~Times~c~Power~d所以我得到的不是中缀的有效使用。
  • 它不健壮,并且无法用于简单的表达式,例如 k = toInfx[a/b + ArcTan[a/b]]

  • 有没有简单的方法可以获取 Infix[]为所有人工作(叶子)?

    最佳答案

    这是一种方法:

    ClearAll[toInfixAlt];
    SetAttributes[toInfixAlt, HoldAll];
    toInfixAlt[expr_] :=
    First@MapAll[Infix, HoldForm[expr]] //.
    Infix[a : _?(Function[s, AtomQ[Unevaluated@s], HoldAll]) | _[_]| _[]] :> a

    我用过 HoldForm因为您可能希望代码保持未评估状态。下面是一个例子:
    In[781]:= toInfixAlt[(c a^b)^d/(1/2)]
    Out[781]= ((c ~Times~ (a ~Power~ b)) ~Power~ d) ~Times~ (1/((1/2)))

    编辑

    和,
    In[792]:= toInfixAlt[a/b+ArcTan[a/b]]
    Out[792]= (a ~Times~ (b ~Power~ (-1))) ~Plus~ ArcTan[a ~Times~ (b ~Power~ (-1))]

    结束编辑

    至于多余的括号,删除它们比较困难,因为由于各种运算符的优先级,它们确实经常需要,但应该是可能的。

    编辑 2

    为了优先考虑,这里是一个尝试:
    ClearAll[toInfixAlt];
    SetAttributes[toInfixAlt, HoldAll];
    toInfixAlt[expr_] :=
    First@MapAll[Infix, HoldForm[expr]] //.
    Infix[a : _?(Function[s, AtomQ[Unevaluated@s],HoldAll]) | _[_] | _[]] :> a //.
    {
    Infix[f_[a__, Infix[r : (h_[___])],b___]] /;
    Precedence[Unevaluated[f]] <= Precedence[Unevaluated[h]] :> Infix[f[a, r, b]],
    Infix[b___,f_[Infix[r : (h_[___])], a__]] /;
    Precedence[Unevaluated[f]] <= Precedence[Unevaluated[h]] :> Infix[f[b, r, a]]
    };

    现在,我得到:
    In[963]:= toInfixAlt[a/b+ArcTan[a/b]]
    Out[963]= (a b ~Power~ (-1)) ~Plus~ ArcTan[a ~Times~ (1/b)]

    关于wolfram-mathematica - 所有人的中缀(叶子),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8286477/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com