Yar*_*tov 3 wolfram-mathematica
我想一个函数AnyTrue[expr,{i,{i1,i2,...}}]用来检查是否expr是True任何的i1,i2...它应该是就好像AnyTrue是Table其次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)
这个怎么样?
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)