WOLFRAM NOTEBOOK

In[]:=
ClearAll[Rec, Smp]SetAttributes[{Rec, Smp}, HoldFirst]Rec[_] = False;Smp[_] = Infinity;Smp[s_, _] := Smp[s]
In[]:=
ClearAll[SMP, $RecCounter]SetAttributes[{SMP, $RecCounter}, HoldAll]$RecCounter[_] = 0;unTerminate = ReplaceAll[HoldPattern[TerminatedEvaluation[_, HoldForm[subExpr_]]] :> subExpr];SMP[expr : proj_Symbol[filters : PatternSequence[___, Except[_TerminatedEvaluation] ? ValueQ, ___]]] := With[ evalFilters = proj @@@ HoldForm @ Evaluate[Join @@ MapIndexed[ Function[ {filter, index}, With[{i = index[[1]]}, Which[ ! ValueQ[filter] || ! FreeQ[Unevaluated[filter], _TerminatedEvaluation], HoldForm[filter], Rec[proj] || Smp[proj, i] > $RecCounter[proj], With[evalFilter = ResourceFunction["InheritedBlock"][{$RecCounter = $RecCounter}, $RecCounter[proj]++; SMP @@ (*unTerminate @ *)Hold[filter] ], If[ unTerminate[evalFilter] === HoldForm[filter], HoldForm[Evaluate @ TerminatedEvaluation[Union @@ Cases[evalFilter, TerminatedEvaluation[p_, _] :> p, All], HoldForm[filter]]], unTerminate[evalFilter] ] ], True, HoldForm[TerminatedEvaluation[{proj}, HoldForm[filter]]] ] ], HoldFirst ], Unevaluated[{filters}] ]], If[ unTerminate[evalFilters] === HoldForm[expr], evalFilters, SMP @@ evalFilters ]]SMP[expr : proj_Symbol[___]] /; MatchQ[Unevaluated[expr], Alternatives @@ Keys[DownValues[proj]]] := ResourceFunction["InheritedBlock"][{$RecCounter = $RecCounter}, $RecCounter[proj]++; With[{newExpr = Replace[Unevaluated[expr], MapAt[HoldForm, DownValues[proj], {All, 2}]]}, SMP @@ newExpr ] ]SMP[expr_] /; ValueQ[expr] := HoldForm @ Evaluate @ exprSMP[expr_] := (*unTerminate @ *)HoldForm[expr]
In[]:=
ClearAll[f]f[x_,y_]:=x+yf/:Smp[f]=0;SMP[f[1+f[2,f[3,4]],f[5,6]]]f/:Smp[f]=1;SMP[f[1+f[2,f[3,4]],f[5,6]]]f/:Smp[f]=2;SMP[f[1+f[2,f[3,4]],f[5,6]]]
Out[]=
f[TerminatedEvaluation[{f},1+f[2,f[3,4]]],TerminatedEvaluation[{f},f[5,6]]]
Out[]=
11+TerminatedEvaluation[{f},1+f[2,f[3,4]]]
Out[]=
21
In[]:=
ClearAll[f]f[x_,y_]:=x+yf/:Smp[f,1]=2;f/:Smp[f,2]=1;SMP[f[f[f[1,2],3],f[4,f[5,6]]]]
Out[]=
6+TerminatedEvaluation[{f},f[4,f[5,6]]]
In[]:=
ClearAll[f,g]f[x_,y_]:=x+yg[x_,y_]:=x*yf/:Smp[f]=1;g/:Smp[g]=1;SMP[{g[1,g[2,3+4]],f[6,f[7,8+9]]}]
Out[]=
{TerminatedEvaluation[{g},g[1,g[2,3+4]]],TerminatedEvaluation[{f},f[6,f[7,8+9]]]}

Fibonacci

In[]:=
f[n_]:=f[n-1]+f[n-2]
In[]:=
f[1]=f[2]=1;
In[]:=
f/:Smp[f]=2;SMP[f[6]]
Out[]=
8
Does this terminate?
f[n_]:=nf[n-1]
Wolfram Cloud

You are using a browser not supported by the Wolfram Cloud

Supported browsers include recent versions of Chrome, Edge, Firefox and Safari.


I understand and wish to continue anyway »

You are using a browser not supported by the Wolfram Cloud. Supported browsers include recent versions of Chrome, Edge, Firefox and Safari.