我有一个列表,我想对每个元素应用逻辑测试,如果其中任何一个元素不满足这个条件,则返回false.我想在Mathematica中写这个或找到一个内置函数,但似乎ForAll并没有真正做到这一点.
我的问题是:如何最有效地做到这一点?
额外:Exists功能类似如何:即如果列表中有任何元素满足条件,则返回true.
我想一个函数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)