如果我的车道是空的,我不能断言停在那里的所有汽车都是红色的。
考虑以下陈述。
S1
: 我的车道是空的。
S2
:停在我车道上的所有汽车都是红色的。
我声称S1
暗示S2
。也就是说,声明S1 => S2
是真的。我将通过证明它的否定是错误的来做到这一点。在这种情况下,否定S1 => S2
is S1 ^ ~S2
;这是因为S1 => S2
仅当S1
是真的并且S2
是假的。什么是否定S2
? It is
~S2
:我的车道上停着一辆不是红色的汽车。
的真值是多少S1 ^ ~S2
?我们把它写出来
S1 ^ ~S2
:我的车道是空的,并且我的车道上停着一辆不是红色的汽车。
唯一的办法就是S1 ^ ~S2
可能是真的,如果两者都是S1
and ~S2
是真的。但S1
说我的车道是空的并且S2
说我的车道上有一辆车。我的车道不能既是空的又包含汽车。因此,不可能S1
and ~S2
两者都是真实的。所以,S1 ^ ~S2
是假的,所以它的否定S1 => S2
是真的。
因此,如果您的车道是空的,您可以断言停在那里的所有汽车都是红色的。
所以现在让我们考虑一个IEnumerable<T> elements
and a Predicate<T> p
。让我们假设elements
是空的。我们希望发现的价值
bool b = elements.All(x => p(x));
让我们考虑一下它的否定
bool notb = elements.Any(x => !p(x));
For notb
为真,必须至少有一个x
in elements
为此!p(x)
是真的。但elements
是空的,所以不可能找到x
为此!p(x)
是真的。所以notb
不可能是真的,所以它一定是假的。自从notb
为假,其否定为真。所以b
是真的并且elements.All(x => p(x))
必须为真,如果elements
是空的。
这是思考这个问题的另一种方式。谓词p
为真,如果对于all x
in elements
你找不到any这是错误的。但如果里面没有任何物品elements
那么就不可能找到any这是错误的。因此,对于一个空集合elements
, p
是真的all x
in elements
现在,怎么样elements.Any(x => p(x))
when elements
是一个空的IEnumerable<T>
and p
is a Predicate<T>
如上?我们已经知道结果将是假的,因为我们知道它的否定是真的,但无论如何让我们通过它进行推理;直觉是有价值的。为了elements.Any(x => p(x))
为真必须至少有一个x
in elements
为此p(x)
是真的。但如果没有的话any x
in elements
不可能找到any x
为此p(x)
是真的。所以,elements.Any(x => p(x))
为假,如果elements
是空的。
最后,这是一个相关解释 https://stackoverflow.com/questions/145509/why-does-abcd-startswith-return-true/390801#390801 on why s.StartsWith(String.Empty)
当s
是一个非空实例string
: