1
$\begingroup$

Say I have an expression like

expr = g1[i1, j1] h1[k, l] f1[i, j1, k1, l] + g2[k1, j] f2[i, l, k1, l1] + f3[i, j, l, l1] + ...

and in each term above I want to do some transformations such that the f functions inputs are f[i,j,k,l]. For example one transformation for the f2 term would be {l->j, j->l}, changing the f2 term to g2[k1, l] f2[i, j, i, l1]. Note that the inputs of the other functions in the same term must also undergo the same transformations.

I've been attempting this by doing something along the lines of

patt = pre_. f_[I1_,I2_,I3_,I4_] post_. Map[(# // With[{ I1 = Cases[{#}, patt -> I1][[1]], I2 = Cases[{#}, patt -> I2][[1]], I3 = Cases[{#}, patt -> I3][[1]], I4 = Cases[{#}, patt -> I4][[1]]}, Which[ !(I1 === i), ReplaceAll[{i -> I1, I1 -> i}], !(I2 === j), ReplaceAll[{j -> I2, I2 -> j}], !(I2 === k), ReplaceAll[{k -> I3, I3 -> k}], !(I2 === l), ReplaceAll[{l -> I4, I4 -> l}], ]]) &, expr] 

The idea here is to, on a term by term basis, identify the input positions which are incorrect and flip what's in that position with the correct symbol.

This might work if Which went through all the conditionals rather than stopping on the first one and if I had something to chain apply the resulting list of ReplaceAll functions. Case does not seem to to be the right tool to use here either, but after scouring the documentation for a more appropriate function I came up with nothing.

$\endgroup$
2
  • $\begingroup$ Something like: Replace[expr, subexpr : ___ f2[___] :> Replace[subexpr, {l -> j, j -> l}, {2}], {1}]? $\endgroup$ Commented Sep 19, 2016 at 11:42
  • $\begingroup$ Thank you, the : was just what I needed. Currently my solution to this problem is Replace[expr, subexpr : pre_. f_[I1_, I2_, I3_, I4_] post_. :> ReplaceAll[subexpr, {i -> I1, I1 -> i, j -> I2, I2 -> j, k -> I3, I3 -> k, l -> I4, I4 -> l}], {1}] $\endgroup$ Commented Sep 20, 2016 at 2:39

1 Answer 1

2
$\begingroup$

For your example:

expr = g1[i1, j1] h1[k, l] f1[i, j1, k1, l] + g2[k1, j] f2[i, l, k1, l1] + f3[i, j, l, l1] (* f3[i, j, l, l1] + f2[i, l, k1, l1] g2[k1, j] + f1[i, j1, k1, l] g1[i1, j1] h1[k, l] *) 

you can do

Replace[expr, subexpr : ___ f2[___] :> Replace[subexpr, {l -> j, j -> l}, {2}], {1}] (* f3[i, j, l, l1] + f2[i, j, k1, l1] g2[k1, l] + f1[i, j1, k1, l] g1[i1, j1] h1[k, l] *) 
$\endgroup$
1
  • $\begingroup$ This doesn't handle the general case I was looking for, but it sent me down the right track. $\endgroup$ Commented Sep 24, 2016 at 0:39

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.