具有非标准评估的自定义函数(表现得像表)

Yar*_*tov 3 wolfram-mathematica

我想一个函数AnyTrue[expr,{i,{i1,i2,...}}]用来检查是否exprTrue任何的i1,i2...它应该是就好像AnyTrueTable其次Or@@%,与它只评价差异expr直到第一次True被发现.

短路部分是可选的,我真正想知道的是模拟Table非标准评估序列的正确方法.

更新11/14

这是Michael的解决方案,您可以使用它来链接"for all"和"there exists"支票

SetAttributes[AllTrue, HoldAll];
SetAttributes[AnyTrue, HoldAll];
AllTrue[{var_Symbol, lis_List}, expr_] := 
  LengthWhile[lis, 
    TrueQ[ReleaseHold[Hold[expr] /. HoldPattern[var] -> #]] &] == 
   Length[lis];
AnyTrue[{var_Symbol, lis_List}, expr_] := 
  LengthWhile[lis, 
    Not[TrueQ[ReleaseHold[Hold[expr] /. HoldPattern[var] -> #]]] &] < 
   Length[lis];
AllTrue[{a, {1, 3, 5}}, AnyTrue[{b, {2, 4, 5}}, EvenQ[a + b]]]
AnyTrue[{a, {1, 3, 5}}, AllTrue[{b, {2, 4, 5}}, EvenQ[a + b]]]
Run Code Online (Sandbox Code Playgroud)

Mic*_*lat 5

这个怎么样?

SetAttributes[AnyTrue, HoldAll];

AnyTrue[expr_, {var_Symbol, lis_List}] :=
  LengthWhile[lis, 
    Not[TrueQ[ReleaseHold[Hold[expr] /. HoldPattern[var] -> #]]] &
  ] < Length[lis]
Run Code Online (Sandbox Code Playgroud)

包括短路过滤器,LengthWhile并在必要时保持所有东西,以便按预期工作,并var具有功能之外的值:

In[161]:= x = 777;

In[162]:= AnyTrue[Print["x=", x]; x == 3, {x, {1, 2, 3, 4, 5}}]
During evaluation of In[162]:= x=1
During evaluation of In[162]:= x=2    
During evaluation of In[162]:= x=3
Out[162]= True
Run Code Online (Sandbox Code Playgroud)

内置Or也是短路的,因为它的价值.(但我意识到建立未评估的条款,例如Table是一种痛苦):

In[173]:= Or[Print[1];True, Print[2];False]
During evaluation of In[173]:= 1
Out[173]= True
Run Code Online (Sandbox Code Playgroud)