Mathematicaで次のことを最もよく達成するにはどうすればよいですか?
In[1] := Solve[f[2,3]==5,f ∈ {Plus,Minus,Divide}]
Out[1] := Plus
Mathematicaで次のことを最もよく達成するにはどうすればよいですか?
In[1] := Solve[f[2,3]==5,f ∈ {Plus,Minus,Divide}]
Out[1] := Plus
Solve目的の式の構文は、一連の式に変換できます。
fSolve[expr_, f_ ∈ functions_List] :=
Map[Solve[(expr /. f -> #) && f == #, f] &, functions] // Flatten
使用例:
In[6]:= fSolve[f[2,3] == 5, f ∈ {Plus, Subtract, Divide}]
Out[6]= {f -> Plus}
In[7]:= fSolve[f[4,2] == 2, f ∈ {Plus, Subtract, Divide}]
Out[7]= {f -> Subtract, f -> Divide}
このアプローチの利点は、Solveより複雑な式でのフルパワーを引き続き利用できることです。
In[8]:= fSolve[D[f[x], x] < f[x], f ∈ {Log, Exp}]
Out[8]= {f -> ConditionalExpression[Log, x Log[x]∈Reals && x>E^ProductLog[1]]}
In[9]:= fSolve[D[f[x], x] <= f[x], f ∈ {Log, Exp}]
Out[9]= {f -> ConditionalExpression[Log, x Log[x]∈Reals && x>=E^ProductLog[1]],
f -> ConditionalExpression[Exp, E^x ∈ Reals]}
これがあなたが望むことをするかどうか教えてください:
findFunction[expr_, head_ ∈ {ops__}] :=
Quiet@Pick[{ops}, expr /. head -> # & /@ {ops}]
findFunction[f[2, 3] == 5, f ∈ {Plus, Minus, Divide}]
(* Out [] = {Plus} *)
組み込み関数については知りませんが、自分で書くのは難しくありません。使用できるアプローチの1つは次のとおりです。
Clear@correctOperatorQ;
correctOperatorQ[expr_, value_,
operators_] := (expr == value) /. Head[expr] -> # & /@ operators
ちなみに、の正しい演算子2-3はSubtract、ではなくMinusです。あなたの例の結果:
correctOperatorQ[f[2, 3], 5, {Plus,Subtract,Divide}]
Out[1]={True, False, False}