How to set a function as a parameter?

In case I want to know whether a given function $f(t)$ have some property, I tried to write something like this:

IsSuppFun[f_[t_]] := Resolve[
ForAll[t, 0 <=t <= 2&&t\[Element] Reals,
f[t] + D[f[t], {t, 2}] >= 0]]

Which means, if the given function satisfies the condition: $f(t)+f''(t)\geq 0$ for all $0\leq t\leq 2$, then return TRUE, else return False.

The problem is that it is not work as I supposed, for example, if I define

F[t_]:=t^2-3

then the output is:

IsSuppFun[-3 + t^2]

If I separate the code as

Resolve[ForAll[t, 0 <= t <= 2 Pi && t \[Element] Reals, F[t] + F''[t] >= 0]]

Which will get the Right Answer!

Where did I go wrong?

Solution is use the HoldAll attribute for the function IsSuppFun, Please see below for the answer!

there is my another problem in the same line: If I have tried to add another condition as:

SetAttributes[IsSuppFun, HoldAll]
IsSuppFun[f_[t_]] :=
Resolve[ForAll[t, 0 <= t <= 2 && t \[Element] Reals, (f[t] + D[f[t], {t, 2}] >= 0)&&(f==f)]]

then with the same test function:

F[t_] := t^2 - 3

the output is not as desired True or False, but as:

\!$$\*SubscriptBox[\(\[ForAll]$$, $$t$$]$$! \((0 <= t <= 2 && t \[Element] Reals)$$\)\)

May be I should change the last question as (to make things clear and simple):

SetAttributes[{IsSuppFun}, HoldAll]
IsSuppFun[f_[t_]] := Resolve[
ForAll[t,
0<= t <= 2 && t \[Element] Reals,
f >= 0]
]

with the test function as:

F[t_] := Sin[t]

then the output of

IsSuppFun[F[t]]

is True; But if I have change it as

SetAttributes[{IsSuppFun}, HoldAll]
IsSuppFun[f_[t_]] := Resolve[
ForAll[t,
0<= t <= 2 && t \[Element] Reals,
f <= 0]
]

Then the same test function gives neither True nor False. (I Suppose it False!) Why?

• I think the problem is specifying the function's argument in IsSuppFun. Try : bigF[t_] = t^2 - 3; IsSuppFun[bigF]. – b.gates.you.know.what Oct 19 '12 at 10:38
• van abel, I think you are still confusing the second and third arguments of ForAll perhaps? In your added example you are essentially doing: Resolve[ForAll[t, 0 <= t <= 2 && t \[Element] Reals, False]] because F==F is False. – Mr.Wizard Oct 19 '12 at 11:21

This answer intends to answer both parts of the question. Originally it answered only the first part. Below is the original answer. Scroll down for the second part.

I interchanged the third and second argument of ForAll and gave the function IsSuppFun attribute HoldAll, and it worked!

So I wrote

SetAttributes[IsSuppFun, HoldAll]
IsSuppFun[f_[t_]] :=
Resolve[
ForAll[
t,
0 <= t <= 2 ,
f[t] + D[f[t], {t, 2}] >= 0
]
]

(*testcase*)

f[t_] := t^4

Then

IsSuppFun[f[x]]

Evaluates to True.

Second part

I removed the t \[Element] Reals, because it seemed redundant, or possibly wrong syntax. As it turned out, the new function worked.

SetAttributes[IsSuppFunGE, HoldAll]
IsSuppFunGE[f_[t_]] :=
Resolve[ForAll[t, 0 <= t <= 2, f >= 0]];

(* testcases*)
f[t_] := Sin[t];
g[t_] := Sin[t] - 2;
h[t_] := Cos[t] + 1;

Given these definitions,

{IsSuppFunGE[f[x]] , IsSuppFunGE[g[x]], IsSuppFunGE[h[x]]}

evaluates to

{True, False, True}

The question may arise if Mathematica is still using real numbers, as this is now not specified. The fact that the expression

Resolve[ForAll[t, 0 <= t <= 4, t != Pi]]

evaluates to False, may add confidence that it does indeed use real numbers (already).

• Jacob, you can select your block of code in the editor and click the { } symbol above it to format your code. – Mr.Wizard Oct 19 '12 at 10:44
• Ok, I will try. Thanks! – Jacob Akkerboom Oct 19 '12 at 10:47
• Don't miss this: mathematica.stackexchange.com/editing-help – Mr.Wizard Oct 19 '12 at 10:48
• Yes, I have made some mistake in the first edition, in which I have misplace the second and third parameter of ForAll. – van abel Oct 19 '12 at 10:48
• @Mr.Wizard thanks, I have checked it out. Now, as our answers are equivalent (I guess t \[Element] Reals only makes a difference if it is put before the inequalities), I suppose I should delete my answer. Correct? – Jacob Akkerboom Oct 19 '12 at 11:09

You may be able to get what you want by setting a Hold attribute on your function:

SetAttributes[IsSuppFun, HoldAll]

IsSuppFun[f_[t_]] :=
Resolve[ForAll[t, 0 <= t <= 2 && t \[Element] Reals, f[t] + D[f[t], {t, 2}] >= 0]]

f[t_] := t^2 - 3

IsSuppFun[f[t]]

False

• That works, Thanks! – van abel Oct 19 '12 at 10:46
• Sorry, there still some problem, if I replace f by F in the test case, then the output has changed! – van abel Oct 19 '12 at 10:51
• @vanabel your comment got cut off -- I changed F to f just as a matter of habit, but I forgot to try it the other way first. I'll do that now. – Mr.Wizard Oct 19 '12 at 10:53
• @van abel it seems to still work the same for me. Perhaps you could to do a ClearAll[IsSuppFun, f, F, t] and test it again? – Mr.Wizard Oct 19 '12 at 10:55
• Yes, I have tested again, it works for me too! Thanks, but there is another problem, if I have tried to add a condition to the third parameter, why it not works? :(f[t] + D[f[t], {t, 2}] >= 0) && (f == f) – van abel Oct 19 '12 at 11:02

I would use this Convert an expression to a Function as follows

IsSuppFun[F_] := Module[{t,f= extractPureFunction[F]}, Resolve[
ForAll[t, 0 <=t <= 2&&t\[Element] Reals,
f[t] + D[f[t], {t, 2}] >= 0]]]

so that I don't have to worry about which variable is used.

The credit for the extractPureFunction that I use goes to Daniel Lichtblau