6

I want to define a functional E by using the property E[ E[f[x]] ] := E[f[x]] for some arbitrary function f[x]. Meaning, that I want Mathematica to evaluate every expression E[ E[f[x]] ] to E[f[x]] for all functions f[x]. How do I make this in Mathematica? I tried

E[ E[f_[x]] ] := E[f[x]]

but this gives the following error "$IterationLimit::itlim: Iteration limit of 4096 exceeded." and as output Hold[E[f[x]]]. Thanks!

user293787
  • 11,833
  • 10
  • 28
Demoncracy
  • 63
  • 3
  • 4
    Hello. First, do not use the letter E because it has built-in meaning, type ?E to see this. So let me use e instead (you can replace this by any other name that does not correspond to a symbol with built-in meaning). Then perhaps what you want is e[e[expr_]]:=e[expr]. Try typing e[e[f[x]]] now. You can also use something like Format[e]=Style["E",Blue] to change the way your e is printed in the notebook output. – user293787 Jul 26 '22 at 08:34
  • Please edit your question so that ALL code is formatted properly. I changed some of it so that you can see how it works. – user293787 Jul 26 '22 at 08:39

1 Answers1

12

The evaluation loop for f[f[x]]will first evaluate f[x]and then feed to output to f . Therefroe you must prevent the first evaluation. You can do this by giving f the attribute HoldFirst. Only then you may define f[f[x]]:

ClearAll[f]
SetAttributes[f, HoldFirst]
f[f[x_]] = f[x];
f[x_] = x^2;
f[f[3]]

(* 9 *)

Daniel Huber
  • 51,463
  • 1
  • 23
  • 57