Re: A riddle: Functions that return unevaluated when they cannot

*To*: mathgroup at smc.vnet.net*Subject*: [mg82455] Re: A riddle: Functions that return unevaluated when they cannot*From*: Jens-Peer Kuska <kuska at informatik.uni-leipzig.de>*Date*: Sat, 20 Oct 2007 06:01:31 -0400 (EDT)*References*: <ff9sin$5vc$1@smc.vnet.net>

Hi, you don't have to do anything fact[0] = 1; fact[n_ /; n > 0] := n*fact[n - 1] will return fact[-4] because *no* rule matches. Regards Jens Szabolcs Horv=E1t wrote: > There are certain functions in Mathematica which return unevaluated whe= n > they cannot solve the task they've been given. Examples are > Integrate[], Solve[], FindInstance[], etc. > > How are these functions implemented? Mathematica should evaluate > expressions for as long as there are definitions that apply to it. > Obviously this behaviour cannot be achieved by something like > > fact[n_] := If[n >= 0, n!, fact[n]] > > because this leads to infinite evaluation for negative n. > > So I suppose that Integrate[] and similar functions cache their results= , > and can remember that a specific problem was unsolvable. I imagined > that they might be defined similarly to this: > > fun[a_] := (cachedUnsolvableQ[a] = True; fun[a]) /; > Not@cachedUnsolvableQ[a] > > cachedUnsolvableQ[_] = False (* default value *) > > But this is not true! Consider the following input: > > In[1]:= > FindInstance[ > x^3+y^3==z^3 && x>0 && y>0 && z>0, > {x,y,z}, Integers] // Timing > > During evaluation of In[1]:= FindInstance::nsmet: The methods availab= le > to FindInstance are insufficient to find the requested instances or > prove they do not exist. >> > > Out[1]= > {1.156, FindInstance[x^3+y^3==z^3&&x>0&&y>0&&z>0,{x,y,z},Integers]} > > Evaluating this expression takes a relatively long time on my system (~= 1 > sec). If FindInstance cached its result the way I described above, the= n > subsequent evaluations should be instantaneous. But they aren't! > > In[2]:= > FindInstance[x^3+y^3==z^3&&x>0&&y>0&&z>0,{x,y,z},Integers]//Timing > > During evaluation of In[2]:= FindInstance::nsmet: The methods availab= le > to FindInstance are insufficient to find the requested instances or > prove they do not exist. >> > > Out[2]= {1.063,FindInstance[x^3+y^3==z^3&&x>0&&y>0&&z>0,{x,y,z},I= ntegers]} > > The second calculation took as much time as the first one. This means > that FindInstance[] tried to solve the problem *again*, and it did not > simply stay unevaluated. But then why does the returned result (which > is the same as the input) stay unevaluated? > > Could someone explain how this behaviour is implemented? > > Of course this does not prevent me from solving some practical problem > in Mathematica, I'm just curious about it. >